本文整理汇总了C++中SpellCastTargets::setUnitTarget方法的典型用法代码示例。如果您正苦于以下问题:C++ SpellCastTargets::setUnitTarget方法的具体用法?C++ SpellCastTargets::setUnitTarget怎么用?C++ SpellCastTargets::setUnitTarget使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SpellCastTargets
的用法示例。
在下文中一共展示了SpellCastTargets::setUnitTarget方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: spellAtack
void TargetedMovementGenerator::spellAtack(Creature &owner,Unit &who,uint32 spellId)
{
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId );
if(!spellInfo)
{
sLog.outError("WORLD: unknown spell id %i\n", spellId);
return;
}
owner.StopMoving();
owner->Idle();
if(owner.m_currentSpell)
{
if(owner.m_currentSpell->m_spellInfo->Id == spellInfo->Id )
return;
else
{
owner.m_currentSpell->cancel();
}
}
Spell *spell = new Spell(&owner, spellInfo, false, 0);
spell->SetAutoRepeat(false);
//owner.addUnitState(UNIT_STAT_ATTACKING);
//owner.clearUnitState(UNIT_STAT_CHASE);
SpellCastTargets targets;
targets.setUnitTarget( &who );
spell->prepare(&targets);
owner.m_canMove = false;
DEBUG_LOG("Spell Attack.");
}
示例2: HandleStartCommand
bool ChatHandler::HandleStartCommand(const char* args)
{
Player *chr = m_session->GetPlayer();
if(chr->isInFlight())
{
SendSysMessage(LANG_YOU_IN_FLIGHT);
return true;
}
if(chr->isInCombat())
{
SendSysMessage(LANG_YOU_IN_COMBAT);
return true;
}
// cast spell Stuck
SpellEntry const* sInfo = sSpellStore.LookupEntry(7355);
if(!sInfo)
return true;
Spell *spell = new Spell(chr, sInfo , false, 0);
SpellCastTargets targets;
targets.setUnitTarget( chr );
spell->prepare(&targets);
return true;
}
示例3: _spellAtack
void TargetedMovementGenerator::_spellAtack(Creature &owner, SpellEntry* spellInfo)
{
if(!spellInfo)
return;
owner.StopMoving();
owner->Idle();
if(owner.m_currentSpell)
{
if(owner.m_currentSpell->m_spellInfo->Id == spellInfo->Id )
return;
else
{
owner.m_currentSpell->cancel();
}
}
Spell *spell = new Spell(&owner, spellInfo, false, 0);
spell->SetAutoRepeat(true);
//owner.addUnitState(UNIT_STAT_ATTACKING);
owner.Attack(&owner); //??
owner.clearUnitState(UNIT_STAT_CHASE);
SpellCastTargets targets;
targets.setUnitTarget( &i_target );
spell->prepare(&targets);
owner.m_canMove = false;
DEBUG_LOG("Spell Attack.");
}
示例4: Cast
SpellEntry* Cast(Player*player,Item* item, uint32 spellId)
{
SpellEntry *spellInfo = sSpellStore.LookupEntry(spellId);
if(!spellInfo)
{
sLog.outError("WORLD: unknown spell id %i", spellId);
return NULL;
}
Spell spell(player, spellInfo, true, 0);
SpellCastTargets targets;
targets.setUnitTarget( player );
spell.m_CastItem = item;
spell.prepare(&targets);
return spellInfo;
}
示例5: AutocastPreparedSpells
void PetAI::AutocastPreparedSpells()
{
//found units to cast on to
if (!m_targetSpellStore.empty())
{
uint32 index = urand(0, m_targetSpellStore.size() - 1);
Spell* spell = m_targetSpellStore[index].second;
Unit* target = m_targetSpellStore[index].first;
m_targetSpellStore.erase(m_targetSpellStore.begin() + index);
SpellCastTargets targets;
targets.setUnitTarget(target);
if (!me->HasInArc(M_PI, target))
{
me->SetInFront(target);
if (target->GetTypeId() == TYPEID_PLAYER)
me->SendCreateUpdateToPlayer((Player*)target);
if (m_owner && m_owner->GetTypeId() == TYPEID_PLAYER)
me->SendCreateUpdateToPlayer((Player*)m_owner);
}
me->AddCreatureSpellCooldown(spell->GetSpellEntry()->Id);
if (me->isPet())
((Pet*)me)->CheckLearning(spell->GetSpellEntry()->Id);
spell->prepare(&targets);
}
while (!m_targetSpellStore.empty())
{
Spell *temp = m_targetSpellStore.begin()->second;
m_targetSpellStore.erase(m_targetSpellStore.begin());
delete temp;
}
}
示例6: CastSpell
bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target)
{
if (!spellId)
return false;
if (!target)
target = bot;
Pet* pet = bot->GetPet();
if (pet && pet->HasSpell(spellId))
{
pet->ToggleAutocast(spellId, true);
TellMaster("My pet will auto-cast this spell");
return true;
}
aiObjectContext->GetValue<LastSpellCast&>("last spell cast")->Get().Set(spellId, target->GetObjectGuid(), time(0));
aiObjectContext->GetValue<LastMovement&>("last movement")->Get().Set(NULL);
const SpellEntry* const pSpellInfo = sSpellStore.LookupEntry(spellId);
MotionMaster &mm = *bot->GetMotionMaster();
if (bot->isMoving() && GetSpellCastTime(pSpellInfo, NULL))
{
return false;
}
if (bot->IsTaxiFlying())
return false;
bot->clearUnitState( UNIT_STAT_CHASE );
bot->clearUnitState( UNIT_STAT_FOLLOW );
ObjectGuid oldSel = bot->GetSelectionGuid();
bot->SetSelectionGuid(target->GetObjectGuid());
Spell *spell = new Spell(bot, pSpellInfo, false);
SpellCastTargets targets;
targets.setUnitTarget(target);
WorldObject* faceTo = target;
if (pSpellInfo->Targets & TARGET_FLAG_ITEM)
{
spell->m_CastItem = aiObjectContext->GetValue<Item*>("item for spell", spellId)->Get();
targets.setItemTarget(spell->m_CastItem);
}
if (pSpellInfo->Effect[0] == SPELL_EFFECT_OPEN_LOCK ||
pSpellInfo->Effect[0] == SPELL_EFFECT_SKINNING)
{
LootObject loot = *aiObjectContext->GetValue<LootObject>("loot target");
if (!loot.IsLootPossible(bot))
return false;
GameObject* go = GetGameObject(loot.guid);
if (go && go->isSpawned())
{
WorldPacket* const packetgouse = new WorldPacket(CMSG_GAMEOBJ_USE, 8);
*packetgouse << loot.guid;
bot->GetSession()->QueuePacket(packetgouse);
targets.setGOTarget(go);
faceTo = go;
}
else
{
Unit* creature = GetUnit(loot.guid);
if (creature)
{
targets.setUnitTarget(creature);
faceTo = creature;
}
}
}
if (!bot->IsInFront(faceTo, sPlayerbotAIConfig.sightDistance))
{
bot->SetFacingTo(bot->GetAngle(faceTo));
SetNextCheckDelay(sPlayerbotAIConfig.globalCoolDown);
return false;
}
WaitForSpellCast(spellId);
spell->prepare(&targets);
bot->SetSelectionGuid(oldSel);
LastSpellCast& lastSpell = aiObjectContext->GetValue<LastSpellCast&>("last spell cast")->Get();
return lastSpell.id == spellId;
}
示例7: UpdateAI
//.........这里部分代码省略.........
else if(m_creature->GetCharmInfo()->HasCommandState(COMMAND_FOLLOW))
{
if (!m_creature->hasUnitState(UNIT_STAT_FOLLOW) )
{
m_creature->GetMotionMaster()->MoveFollow(owner,PET_FOLLOW_DIST,PET_FOLLOW_ANGLE);
}
}
}
if (m_creature->GetGlobalCooldown() == 0 && !m_creature->IsNonMeleeSpellCasted(false))
{
//Autocast
for (uint8 i = 0; i < m_creature->GetPetAutoSpellSize(); i++)
{
uint32 spellID = m_creature->GetPetAutoSpellOnPos(i);
if (!spellID)
continue;
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellID);
if (!spellInfo)
continue;
// ignore some combinations of combat state and combat/noncombat spells
if (!inCombat)
{
if (!IsPositiveSpell(spellInfo->Id))
continue;
}
else
{
if (IsNonCombatSpell(spellInfo))
continue;
}
Spell *spell = new Spell(m_creature, spellInfo, false, 0);
if (inCombat && !m_creature->hasUnitState(UNIT_STAT_FOLLOW) && spell->CanAutoCast(m_creature->getVictim()))
{
m_targetSpellStore.push_back(std::make_pair<Unit*, Spell*>(m_creature->getVictim(), spell));
continue;
}
else
{
bool spellUsed = false;
for(std::set<uint64>::iterator tar = m_AllySet.begin(); tar != m_AllySet.end(); ++tar)
{
Unit* Target = ObjectAccessor::GetUnit(*m_creature,*tar);
//only buff targets that are in combat, unless the spell can only be cast while out of combat
if(!Target)
continue;
if(spell->CanAutoCast(Target))
{
m_targetSpellStore.push_back(std::make_pair<Unit*, Spell*>(Target, spell));
spellUsed = true;
break;
}
}
if (!spellUsed)
delete spell;
}
}
//found units to cast on to
if (!m_targetSpellStore.empty())
{
uint32 index = urand(0, m_targetSpellStore.size() - 1);
Spell* spell = m_targetSpellStore[index].second;
Unit* target = m_targetSpellStore[index].first;
m_targetSpellStore.erase(m_targetSpellStore.begin() + index);
SpellCastTargets targets;
targets.setUnitTarget( target );
if (!m_creature->HasInArc(M_PI, target))
{
m_creature->SetInFront(target);
if (target->GetTypeId() == TYPEID_PLAYER)
m_creature->SendUpdateToPlayer((Player*)target);
if (owner && owner->GetTypeId() == TYPEID_PLAYER)
m_creature->SendUpdateToPlayer( (Player*)owner );
}
m_creature->AddCreatureSpellCooldown(spell->m_spellInfo->Id);
if (m_creature->isPet())
((Pet*)m_creature)->CheckLearning(spell->m_spellInfo->Id);
spell->prepare(&targets);
}
while (!m_targetSpellStore.empty())
{
delete m_targetSpellStore.begin()->second;
m_targetSpellStore.erase(m_targetSpellStore.begin());
}
}
}
示例8: HandleTrainerBuySpellOpcode
void WorldSession::HandleTrainerBuySpellOpcode( WorldPacket & recv_data )
{
uint64 guid;
uint32 spellId = 0;
TrainerSpell *proto=NULL;
recv_data >> guid >> spellId;
sLog.outDebug( "WORLD: Received CMSG_TRAINER_BUY_SPELL NpcGUID=%u, learn spell id is: %u",uint32(GUID_LOPART(guid)), spellId );
if(!GetPlayer()->isAlive())
return;
Creature *unit = ObjectAccessor::Instance().GetCreature(*_player, guid);
if(!unit) return;
if( unit->IsHostileTo(_player)) // do not talk with enemies
return;
if(!unit->isCanTrainingOf(_player,true))
return;
std::list<TrainerSpell*>::iterator titr;
for (titr = unit->GetTspellsBegin(); titr != unit->GetTspellsEnd();titr++)
{
if((*titr)->spell->Id == spellId)
{
proto = *titr;
break;
}
}
if (proto == NULL) return;
SpellEntry const *spellInfo = sSpellStore.LookupEntry(proto->spell->EffectTriggerSpell[0]);
if(!spellInfo) return;
if(_player->HasSpell(spellInfo->Id))
return;
if(_player->getLevel() < (proto->reqlevel ? proto->reqlevel : spellInfo->spellLevel))
return;
if(proto->reqskill && _player->GetSkillValue(proto->reqskill) < proto->reqskillvalue)
return;
uint32 prev_id = objmgr.GetPrevSpellInChain(spellInfo->Id);
if(prev_id && !_player->HasSpell(prev_id))
return;
if(proto->spell->Effect[1] == SPELL_EFFECT_SKILL_STEP)
if(!_player->CanLearnProSpell(spellId))
return;
if(!proto)
{
sLog.outErrorDb("TrainerBuySpell: Trainer(%u) has not the spell(%u).", uint32(GUID_LOPART(guid)), spellId);
return;
}
if( _player->GetMoney() >= proto->spellcost )
{
WorldPacket data( SMSG_TRAINER_BUY_SUCCEEDED, 12 );
data << guid << spellId;
SendPacket( &data );
_player->ModifyMoney( -int32(proto->spellcost) );
if(spellInfo->powerType == 2)
{
_player->addSpell(spellId,4); // ative = 4 for spell book of hunter's pet
return;
}
Spell *spell;
if(proto->spell->SpellVisual == 222)
spell = new Spell(_player, proto->spell, false, NULL);
else
spell = new Spell(unit, proto->spell, false, NULL);
SpellCastTargets targets;
targets.setUnitTarget( _player );
float u_oprientation = unit->GetOrientation();
// trainer always see at customer in time of training (part of client functionality)
unit->SetInFront(_player);
spell->prepare(&targets);
// trainer always return to original orientation
unit->Relocate(unit->GetPositionX(),unit->GetPositionY(),unit->GetPositionZ(),u_oprientation);
}
}
示例9: HandleGameObjectUseOpcode
//.........这里部分代码省略.........
if(skill >= zone_skill && chance >= roll)
{
// prevent removing GO at spell cancel
_player->RemoveGameObject(obj,false);
obj->SetOwnerGUID(_player->GetGUID());
//fish catched
_player->UpdateFishingSkill();
_player->SendLoot(obj->GetGUID(),LOOT_FISHING);
}
else
{
// fish escaped
obj->SetLootState(GO_LOOTED); // can be deleted now
WorldPacket data(SMSG_FISH_ESCAPED, 0);
SendPacket(&data);
}
break;
}
case GO_LOOTED: // nothing to do, wiil be deleted at next update
break;
default:
{
obj->SetLootState(GO_LOOTED);
WorldPacket data(SMSG_FISH_NOT_HOOKED, 0);
SendPacket(&data);
break;
}
}
if(_player->m_currentSpell)
{
_player->m_currentSpell->SendChannelUpdate(0);
_player->m_currentSpell->finish();
}
return;
}
obj->CountUseTimes();
case GAMEOBJECT_TYPE_FLAGSTAND: //24
//GB flag
info = obj->GetGOInfo();
if(info)
{
spellId = info->sound0;
guid=_player->GetGUID();
}
break;
case GAMEOBJECT_TYPE_FLAGDROP: //26
//GB flag dropped
info = obj->GetGOInfo();
if(info)
{
spellId = info->sound0;
guid=_player->GetGUID();
}
break;
case GAMEOBJECT_TYPE_CUSTOM_TELEPORTER:
info = obj->GetGOInfo();
if(info)
{
AreaTrigger *fields = objmgr.GetAreaTrigger( info->sound0 );
if(fields)
{
sLog.outDebug( "Teleporting player %u with coordinates X: %f Y: %f Z: %f Orientation: %f Map: %u\n", _player->GetGUIDLow(), fields->X,fields->Y,fields->Z,fields->Orientation,fields->mapId);
_player->TeleportTo(fields->mapId, fields->X,fields->Y,fields->Z,fields->Orientation);
sLog.outDebug( "Player %u teleported by %u\n", _player->GetGUIDLow(), info->sound0);
}
else
sLog.outDebug( "Unknown areatrigger_template id %u\n", info->sound0);
delete fields;
return;
}
break;
default:
sLog.outDebug( "Unknown Object Type %u\n", obj->GetUInt32Value(GAMEOBJECT_TYPE_ID));
break;
}
SpellEntry const *spellInfo = sSpellStore.LookupEntry( spellId );
if(!spellInfo)
{
sLog.outError("WORLD: unknown spell id %i\n", spellId);
return;
}
Spell *spell = new Spell(_player, spellInfo, false, 0);
SpellCastTargets targets;
targets.setUnitTarget( _player );
targets.m_GOTarget = obj;
spell->prepare(&targets);
}
示例10: UpdateAI
void PetAI::UpdateAI(const uint32 diff)
{
// update i_victimGuid if i_pet.getVictim() !=0 and changed
if(i_pet.getVictim())
i_victimGuid = i_pet.getVictim()->GetGUID();
// i_pet.getVictim() can't be used for check in case stop fighting, i_pet.getVictim() clearóâ at Unit death etc.
if( i_victimGuid )
{
if( _needToStop() )
{
DEBUG_LOG("Pet AI stoped attacking [guid=%u]", i_pet.GetGUIDLow());
_stopAttack(); // i_victimGuid == 0 && i_pet.getVictim() == NULL now
return;
}
else if( i_pet.IsStopped() )
{
SpellEntry *spellInfo;
if ( i_pet.m_currentSpell )
{
if( i_pet.hasUnitState(UNIT_STAT_FOLLOW) )
i_pet.m_currentSpell->cancel();
else
return;
}
else if( !i_pet.hasUnitState(UNIT_STAT_FOLLOW) && ((Pet*)&i_pet)->HasActState(STATE_RA_AUTOSPELL) && (spellInfo = i_pet.reachWithSpellAttack(i_pet.getVictim())))
{
Spell *spell = new Spell(&i_pet, spellInfo, false, 0);
spell->SetAutoRepeat(true);
SpellCastTargets targets;
targets.setUnitTarget( i_pet.getVictim() );
spell->prepare(&targets);
i_pet.m_canMove = false;
DEBUG_LOG("Spell Attack.");
}
else if( i_pet.isAttackReady() && i_pet.canReachWithAttack(i_pet.getVictim()) )
{
i_pet.AttackerStateUpdate(i_pet.getVictim());
i_pet.resetAttackTimer();
if ( !i_pet.getVictim() )
return;
if( _needToStop() )
_stopAttack();
}
}
}
else
{
if(i_owner && i_owner->isInCombat())
{
AttackStart(i_owner->getAttackerForHelper());
}
else if(i_owner && ((Pet*)&i_pet)->HasActState(STATE_RA_FOLLOW))
{
if (!i_pet.hasUnitState(UNIT_STAT_FOLLOW))
{
i_pet.addUnitState(UNIT_STAT_FOLLOW);
i_pet->Clear();
i_pet->Mutate(new TargetedMovementGenerator(*i_owner));
}
}
}
}
示例11: HandleTrainerBuySpellOpcode
void WorldSession::HandleTrainerBuySpellOpcode( WorldPacket & recv_data )
{
uint64 guid;
uint32 spellId = 0;
recv_data >> guid >> spellId;
DEBUG_LOG( "WORLD: Received CMSG_TRAINER_BUY_SPELL NpcGUID=%u, learn spell id is: %u",uint32(GUID_LOPART(guid)), spellId );
Creature *unit = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_TRAINER);
if (!unit)
{
DEBUG_LOG( "WORLD: HandleTrainerBuySpellOpcode - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(guid)) );
return;
}
// remove fake death
if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
if(!unit->isCanTrainingOf(_player,true))
return;
// check present spell in trainer spell list
TrainerSpellData const* trainer_spells = unit->GetTrainerSpells();
if(!trainer_spells)
return;
// not found, cheat?
TrainerSpell const* trainer_spell = trainer_spells->Find(spellId);
if(!trainer_spell)
return;
// can't be learn, cheat? Or double learn with lags...
if(_player->GetTrainerSpellState(trainer_spell) != TRAINER_SPELL_GREEN)
return;
SpellEntry const *proto = sSpellStore.LookupEntry(trainer_spell->spell);
SpellEntry const *spellInfo = sSpellStore.LookupEntry(proto->EffectTriggerSpell[0]);
// apply reputation discount
uint32 nSpellCost = uint32(floor(trainer_spell->spellCost * _player->GetReputationPriceDiscount(unit)));
// check money requirement
if(_player->GetMoney() < nSpellCost )
return;
_player->ModifyMoney( -int32(nSpellCost) );
WorldPacket data(SMSG_PLAY_SPELL_VISUAL, 12); // visual effect on trainer
data << uint64(guid);
data << uint32(0xB3); // index from SpellVisualKit.dbc
SendPacket(&data);
data.Initialize(SMSG_PLAY_SPELL_IMPACT, 12); // visual effect on player
data << _player->GetObjectGuid();
data << uint32(0x016A); // index from SpellVisualKit.dbc
SendPacket(&data);
// learn explicitly to prevent lost money at lags, learning spell will be only show spell animation
//[-ZERO] _player->learnSpell(trainer_spell->spell, false);
data.Initialize(SMSG_TRAINER_BUY_SUCCEEDED, 12);
data << uint64(guid);
data << uint32(spellId); // should be same as in packet from client
SendPacket(&data);
Spell *spell;
if(proto->SpellVisual == 222)
spell = new Spell(_player, proto, false);
else
spell = new Spell(unit, proto, false);
SpellCastTargets targets;
targets.setUnitTarget( _player );
spell->prepare(&targets);
}
示例12: UpdateAI
//.........这里部分代码省略.........
continue;
}
Spell *spell = new Spell(m_creature, spellInfo, false);
bool spellUsed = false;
// Some spells can target enemy or friendly (DK Ghoul's Leap)
// Check for enemy first (pet then owner)
Unit* target = m_creature->getAttackerForHelper();
if (!target && owner)
target = owner->getAttackerForHelper();
if (target)
{
if (CanAttack(target) && spell->CanAutoCast(target))
{
targetSpellStore.push_back(std::make_pair(target, spell));
spellUsed = true;
}
}
// No enemy, check friendly
if (!spellUsed)
{
for (std::set<uint64>::const_iterator tar = m_AllySet.begin(); tar != m_AllySet.end(); ++tar)
{
Unit* ally = m_creature->GetMap()->GetUnit(*tar);
//only buff targets that are in combat, unless the spell can only be cast while out of combat
if (!ally)
continue;
if (spell->CanAutoCast(ally))
{
targetSpellStore.push_back(std::make_pair(ally, spell));
spellUsed = true;
break;
}
}
}
// No valid targets at all
if (!spellUsed)
spell->Delete();
}
else if (m_creature->getVictim() && CanAttack(m_creature->getVictim()) && !IsNonCombatSpell(spellInfo))
{
Spell *spell = new Spell(m_creature, spellInfo, false);
if (spell->CanAutoCast(m_creature->getVictim()))
targetSpellStore.push_back(std::make_pair(m_creature->getVictim(), spell));
else
spell->Delete();
}
}
//found units to cast on to
if (!targetSpellStore.empty())
{
uint32 index = urand(0, targetSpellStore.size() - 1);
Spell* spell = targetSpellStore[index].second;
Unit* target = targetSpellStore[index].first;
targetSpellStore.erase(targetSpellStore.begin() + index);
SpellCastTargets targets;
targets.setUnitTarget(target);
if (!m_creature->HasInArc(M_PI_F, target))
{
m_creature->SetInFront(target);
if (target->GetTypeId() == TYPEID_PLAYER)
m_creature->SendCreateUpdateToPlayer((Player*)target);
if (owner && owner->GetTypeId() == TYPEID_PLAYER)
m_creature->SendCreateUpdateToPlayer((Player*)owner);
}
if (((Creature*)m_creature)->IsPet())
((Pet*)m_creature)->CheckLearning(spell->m_spellInfo->Id);
// 10% chance to play special pet attack talk, else growl
// actually this only seems to happen on special spells, fire shield for imp, torment for voidwalker, but it's stupid to check every spell
if (((Creature*)m_creature)->IsPet() && (((Pet*)m_creature)->getPetType() == SUMMON_PET) && (m_creature != target) && (urand(0, 100) < 10))
m_creature->SendPetTalk((uint32)PET_TALK_SPECIAL_SPELL);
else
m_creature->SendPetAIReaction();
spell->prepare(&targets);
}
// deleted cached Spell objects
for (TargetSpellList::const_iterator itr = targetSpellStore.begin(); itr != targetSpellStore.end(); ++itr)
itr->second->Delete();
}
// Update speed as needed to prevent dropping too far behind and despawning
m_creature->UpdateSpeed(MOVE_RUN, true);
m_creature->UpdateSpeed(MOVE_WALK, true);
}
示例13: HandleGameObjectUseOpcode
//.........这里部分代码省略.........
spellId = 23333; // Warsong Flag
break;
case 184141:
// check if it's correct bg
if(bg->GetTypeID() != BATTLEGROUND_EY)
return;
spellId = 34976; // Netherstorm Flag
break;
}
}
}
break;
case GAMEOBJECT_TYPE_FLAGDROP: // 26
if(_player->InBattleGround() && // in battleground
!_player->IsMounted() && // not mounted
!_player->HasStealthAura() && // not stealthed
!_player->HasInvisibilityAura() && // not invisible
_player->isAlive()) // live player
{
BattleGround *bg = _player->GetBattleGround();
if(!bg)
return;
// BG flag dropped
// WS:
// 179785 - Silverwing Flag
// 179786 - Warsong Flag
// EotS:
// 184142 - Netherstorm Flag
info = obj->GetGOInfo();
if(info)
{
switch(info->id)
{
case 179785: // Silverwing Flag
// check if it's correct bg
if(bg->GetTypeID() != BATTLEGROUND_WS)
return;
// check if flag dropped
if(((BattleGroundWS*)bg)->GetFlagState(ALLIANCE) != BG_WS_FLAG_STATE_ON_GROUND)
return;
obj->Delete();
if(_player->GetTeam() == ALLIANCE)
{
((BattleGroundWS*)bg)->EventPlayerReturnedFlag(_player);
return;
}
else
{
_player->CastSpell(_player, 23335, true);
return;
}
break;
case 179786: // Warsong Flag
// check if it's correct bg
if(bg->GetTypeID() != BATTLEGROUND_WS)
return;
// check if flag dropped
if(((BattleGroundWS*)bg)->GetFlagState(HORDE) != BG_WS_FLAG_STATE_ON_GROUND)
return;
obj->Delete();
if(_player->GetTeam() == HORDE)
{
((BattleGroundWS*)bg)->EventPlayerReturnedFlag(_player);
return;
}
else
{
_player->CastSpell(_player, 23333, true);
return;
}
break;
}
}
obj->Delete();
}
break;
default:
sLog.outDebug("Unknown Object Type %u\n", obj->GetGoType());
break;
}
if (!spellId) return;
SpellEntry const *spellInfo = sSpellStore.LookupEntry( spellId );
if(!spellInfo)
{
sLog.outError("WORLD: unknown spell id %u\n", spellId);
return;
}
Spell *spell = new Spell(spellCaster, spellInfo, false, 0);
SpellCastTargets targets;
targets.setUnitTarget( spellTarget );
if(obj)
targets.setGOTarget( obj );
spell->prepare(&targets);
}
示例14: Use
//.........这里部分代码省略.........
// BG flag click
// AB:
// 15001
// 15002
// 15003
// 15004
// 15005
bg->EventPlayerClickedOnFlag(player, this);
return; //we don;t need to delete flag ... it is despawned!
}
break;
}
case GAMEOBJECT_TYPE_FLAGDROP: // 26
{
if(user->GetTypeId()!=TYPEID_PLAYER)
return;
Player* player = (Player*)user;
if( player->isAllowUseBattleGroundObject() )
{
// in battleground check
BattleGround *bg = player->GetBattleGround();
if(!bg)
return;
// BG flag dropped
// WS:
// 179785 - Silverwing Flag
// 179786 - Warsong Flag
// EotS:
// 184142 - Netherstorm Flag
GameObjectInfo const* info = GetGOInfo();
if(info)
{
switch(info->id)
{
case 179785: // Silverwing Flag
// check if it's correct bg
if(bg->GetTypeID() == BATTLEGROUND_WS)
bg->EventPlayerClickedOnFlag(player, this);
break;
case 179786: // Warsong Flag
if(bg->GetTypeID() == BATTLEGROUND_WS)
bg->EventPlayerClickedOnFlag(player, this);
break;
case 184142: // Netherstorm Flag
if(bg->GetTypeID() == BATTLEGROUND_EY)
bg->EventPlayerClickedOnFlag(player, this);
break;
}
}
//this cause to call return, all flags must be deleted here!!
spellId = 0;
Delete();
}
break;
}
case GAMEOBJECT_TYPE_BARBER_CHAIR: //32
{
GameObjectInfo const* info = GetGOInfo();
if(!info)
return;
if(user->GetTypeId()!=TYPEID_PLAYER)
return;
Player* player = (Player*)user;
// fallback, will always work
player->TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(),TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET);
WorldPacket data(SMSG_ENABLE_BARBER_SHOP, 0);
player->GetSession()->SendPacket(&data);
player->SetStandState(PLAYER_STATE_SIT_LOW_CHAIR+info->barberChair.chairheight);
return;
}
default:
sLog.outDebug("Unknown Object Type %u", GetGoType());
break;
}
if(!spellId)
return;
SpellEntry const *spellInfo = sSpellStore.LookupEntry( spellId );
if(!spellInfo)
{
sLog.outError("WORLD: unknown spell id %u at use action for gameobject (Entry: %u GoType: %u )", spellId,GetEntry(),GetGoType());
return;
}
Spell *spell = new Spell(spellCaster, spellInfo, false);
// spell target is user of GO
SpellCastTargets targets;
targets.setUnitTarget( user );
spell->prepare(&targets);
}
示例15: UpdateAI
//.........这里部分代码省略.........
bool spellUsed = false;
for (GuidSet::const_iterator tar = m_AllySet.begin(); tar != m_AllySet.end(); ++tar)
{
Unit* Target = m_unit->GetMap()->GetUnit(*tar);
// only buff targets that are in combat, unless the spell can only be cast while out of combat
if (!Target)
continue;
if (spell->CanAutoCast(Target))
{
targetSpellStore.push_back(TargetSpellList::value_type(Target, spell));
spellUsed = true;
break;
}
}
if (!spellUsed)
delete spell;
}
}
}
// found units to cast on to
if (!targetSpellStore.empty())
{
uint32 index = urand(0, targetSpellStore.size() - 1);
Spell* spell = targetSpellStore[index].second;
Unit* target = targetSpellStore[index].first;
targetSpellStore.erase(targetSpellStore.begin() + index);
SpellCastTargets targets;
targets.setUnitTarget(target);
if (!m_unit->HasInArc(M_PI_F, target))
{
m_unit->SetInFront(target);
if (target->GetTypeId() == TYPEID_PLAYER)
m_unit->SendCreateUpdateToPlayer((Player*)target);
if (owner && owner->GetTypeId() == TYPEID_PLAYER)
m_unit->SendCreateUpdateToPlayer((Player*)owner);
}
spell->SpellStart(&targets);
}
// deleted cached Spell objects
for (TargetSpellList::const_iterator itr = targetSpellStore.begin(); itr != targetSpellStore.end(); ++itr)
delete itr->second;
}
// Stop here if casting spell (No melee and no movement)
if (m_unit->IsNonMeleeSpellCasted(false))
return;
// we may get our actions disabled during spell casting, so do entire recheck for victim
victim = (pet && pet->GetModeFlags() & PET_MODE_DISABLE_ACTIONS) ? nullptr : m_unit->getVictim();
if (victim)
{
// i_pet.getVictim() can't be used for check in case stop fighting, i_pet.getVictim() clear at Unit death etc.
// This is needed for charmed creatures, as once their target was reset other effects can trigger threat
if (!victim->isTargetableForAttack())
{