bool ChatHandler::HandleCastSpellNECommand(const char* args, WorldSession *m_session) { UnitPointer caster = m_session->GetPlayer(); UnitPointer target = getSelectedChar(m_session, false); if(!target) target = getSelectedCreature(m_session, false); if(!target) { RedSystemMessage(m_session, "Must select a char or creature."); return false; } uint32 spellId = atol(args); SpellEntry *spellentry = dbcSpell.LookupEntry(spellId); if(!spellentry) { RedSystemMessage(m_session, "Invalid spell id!"); return false; } BlueSystemMessage(m_session, "Casting spell %d on target.", spellId); WorldPacket data; data.Initialize( SMSG_SPELL_START ); data << caster->GetNewGUID(); data << caster->GetNewGUID(); data << spellId; data << uint8(0); data << uint16(0); data << uint32(0); data << uint16(2); data << target->GetGUID(); // WPAssert(data.size() == 36); m_session->SendPacket( &data ); data.Initialize( SMSG_SPELL_GO ); data << caster->GetNewGUID(); data << caster->GetNewGUID(); data << spellId; data << uint8(0) << uint8(1) << uint8(1); data << target->GetGUID(); data << uint8(0); data << uint16(2); data << target->GetGUID(); // WPAssert(data.size() == 42); m_session->SendPacket( &data ); return true; }
bool ChatHandler::HandleCastSpellCommand(const char* args, WorldSession *m_session) { UnitPointer caster = m_session->GetPlayer(); UnitPointer target = getSelectedChar(m_session, false); if(!target) target = getSelectedCreature(m_session, false); if(!target) { RedSystemMessage(m_session, "Must select a char or creature."); return false; } uint32 spellid = atol(args); SpellEntry *spellentry = dbcSpell.LookupEntry(spellid); if(!spellentry) { RedSystemMessage(m_session, "Invalid spell id!"); return false; } SpellPointer sp(new Spell(caster, spellentry, false, NULLAURA)); if(!sp) { RedSystemMessage(m_session, "Spell failed creation!"); sp->Destructor(); sp = NULLSPELL; return false; } BlueSystemMessage(m_session, "Casting spell %d on target.", spellid); SpellCastTargets targets; targets.m_unitTarget = target->GetGUID(); sp->prepare(&targets); return true; }
bool ChatHandler::HandleListAIAgentCommand(const char* args, WorldSession *m_session) { UnitPointer target = m_session->GetPlayer()->GetMapMgr()->GetCreature(GET_LOWGUID_PART(m_session->GetPlayer()->GetSelection())); if(!target) { RedSystemMessage(m_session, "You have to select a Creature!"); return false; } std::stringstream sstext; sstext << "agentlist of creature: " << target->GetGUID() << '\n'; std::stringstream ss; ss << "SELECT * FROM ai_agents where entry=" << target->GetUInt32Value(OBJECT_FIELD_ENTRY); QueryResult *result = WorldDatabase.Query( ss.str().c_str() ); if( !result ) return false; do { Field *fields = result->Fetch(); sstext << "agent: " << fields[1].GetUInt16() << " | spellId: " << fields[5].GetUInt32() << " | Event: " << fields[2].GetUInt32() << " | chance: " << fields[3].GetUInt32() << " | count: " << fields[4].GetUInt32() << '\n'; } while( result->NextRow() ); delete result; SendMultilineMessage(m_session, sstext.str().c_str()); return true; }
bool ChatHandler::HandleKillCommand(const char *args, WorldSession *m_session) { UnitPointer target = m_session->GetPlayer()->GetMapMgr()->GetUnit(m_session->GetPlayer()->GetSelection()); if(target == 0) { RedSystemMessage(m_session, "A valid selection is required."); return true; } switch(target->GetTypeId()) { case TYPEID_PLAYER: sGMLog.writefromsession(m_session, "used kill command on PLAYER %s", TO_PLAYER( target )->GetName() ); break; case TYPEID_UNIT: sGMLog.writefromsession(m_session, "used kill command on CREATURE %s", TO_CREATURE( target )->GetCreatureName() ? TO_CREATURE( target )->GetCreatureName()->Name : "unknown"); break; } // If we're killing a player, send a message indicating a gm killed them. if(target->IsPlayer()) { PlayerPointer plr = TO_PLAYER(target); m_session->GetPlayer()->DealDamage(plr, plr->GetUInt32Value(UNIT_FIELD_HEALTH),0,0,0); //plr->SetUInt32Value(UNIT_FIELD_HEALTH, 0); plr->KillPlayer(); BlueSystemMessageToPlr(plr, "%s killed you with a GM command.", m_session->GetPlayer()->GetName()); } else { // Cast insta-kill. SpellEntry * se = dbcSpell.LookupEntry(5); if(se == 0) return false; SpellCastTargets targets(target->GetGUID()); SpellPointer sp(new Spell(m_session->GetPlayer(), se, true, NULLAURA)); sp->prepare(&targets); /* SpellEntry * se = dbcSpell.LookupEntry(20479); if(se == 0) return false; SpellCastTargets targets(target->GetGUID()); SpellPointer sp(new Spell(target, se, true, NULLAURA)); sp->prepare(&targets);*/ } return true; }
void WorldSession::HandleAddDynamicTargetOpcode(WorldPacket & recvPacket) { DEBUG_LOG( "WORLD"," got CMSG_PET_CAST_SPELL." ); uint64 guid; uint8 counter; uint32 spellid; uint8 flags; UnitPointer caster; SpellCastTargets targets; SpellEntry *sp; SpellPointer pSpell; list<AI_Spell*>::iterator itr; recvPacket >> guid >> counter >> spellid >> flags; sp = dbcSpell.LookupEntry(spellid); // Summoned Elemental's Freeze if (spellid == 33395) { caster = _player->m_Summon; if( caster && TO_PET(caster)->GetAISpellForSpellId(spellid) == NULL ) return; } else { caster = _player->m_CurrentCharm; if( caster != NULL ) { for(itr = caster->GetAIInterface()->m_spells.begin(); itr != caster->GetAIInterface()->m_spells.end(); ++itr) { if( (*itr)->spell->Id == spellid ) break; } if( itr == caster->GetAIInterface()->m_spells.end() ) return; } } if( caster == NULL || guid != caster->GetGUID() ) return; targets.read(recvPacket, _player->GetGUID()); pSpell = SpellPointer(new Spell(caster, sp, false, NULLAURA)); pSpell->prepare(&targets); }
bool ChatHandler::HandleMonsterYellCommand(const char* args, WorldSession *m_session) { UnitPointer crt = getSelectedCreature(m_session, false); if(!crt) crt = getSelectedChar(m_session, false); if(!crt) { RedSystemMessage(m_session, "Please select a creature or player before using this command."); return true; } if(crt->GetTypeId() == TYPEID_PLAYER) { WorldPacket * data = this->FillMessageData(CHAT_MSG_YELL, LANG_UNIVERSAL, args, crt->GetGUID(), 0); crt->SendMessageToSet(data, true); delete data; } else { crt->SendChatMessage(CHAT_MSG_MONSTER_YELL, LANG_UNIVERSAL, args); } return true; }
void HonorHandler::OnPlayerKilledUnit( PlayerPointer pPlayer, UnitPointer pVictim ) { if( pVictim == NULL || pPlayer == NULL || !pVictim->IsPlayer() || !pPlayer->IsPlayer() ) return; if( TO_PLAYER( pVictim )->m_honorless ) return; if( pVictim->IsPlayer() ) { if( pPlayer->m_bg ) { if( TO_PLAYER( pVictim )->m_bgTeam == pPlayer->m_bgTeam ) return; // patch 2.4, players killed >50 times in battlegrounds won't be worth honor for the rest of that bg if( TO_PLAYER(pVictim)->m_bgScore.Deaths >= 50 ) return; } else { if( pPlayer->GetTeam() == TO_PLAYER( pVictim )->GetTeam() ) return; } } // Calculate points int32 Points = CalculateHonorPointsForKill(pPlayer, pVictim); if( Points > 0 ) { if( pPlayer->m_bg ) { // hackfix for battlegrounds (since the gorups there are disabled, we need to do this manually) vector<PlayerPointer > toadd; uint32 t = pPlayer->m_bgTeam; toadd.reserve(15); // shouldnt have more than this pPlayer->m_bg->Lock(); set<PlayerPointer > * s = &pPlayer->m_bg->m_players[t]; for(set<PlayerPointer >::iterator itr = s->begin(); itr != s->end(); ++itr) { if((*itr) == pPlayer || (*itr)->isInRange(pPlayer,40.0f)) toadd.push_back(*itr); } if( toadd.size() > 0 ) { uint32 pts = Points / (uint32)toadd.size(); for(vector<PlayerPointer >::iterator vtr = toadd.begin(); vtr != toadd.end(); ++vtr) { AddHonorPointsToPlayer(*vtr, pts); (*vtr)->GetAchievementInterface()->HandleAchievementCriteriaHonorableKill(); (*vtr)->GetAchievementInterface()->HandleAchievementCriteriaHonorableKillClass( pVictim->getClass() ); (*vtr)->GetAchievementInterface()->HandleAchievementCriteriaHonorableKillRace( pVictim->getRace() ); (*vtr)->m_killsToday++; (*vtr)->m_killsLifetime++; pPlayer->m_bg->HookOnHK(*vtr); if(pVictim) { // Send PVP credit WorldPacket data(SMSG_PVP_CREDIT, 12); uint32 pvppoints = pts * 10; data << pvppoints << pVictim->GetGUID() << uint32(TO_PLAYER(pVictim)->GetPVPRank()); (*vtr)->GetSession()->SendPacket(&data); } } } pPlayer->m_bg->Unlock(); } else if(pPlayer->GetGroup()) { Group *pGroup = pPlayer->GetGroup(); PlayerPointer gPlayer = NULLPLR; int32 GroupPoints; pGroup->Lock(); GroupPoints = (Points / (pGroup->MemberCount() ? pGroup->MemberCount() : 1)); GroupMembersSet::iterator gitr; for(uint32 k = 0; k < pGroup->GetSubGroupCount(); k++) { for(gitr = pGroup->GetSubGroup(k)->GetGroupMembersBegin(); gitr != pGroup->GetSubGroup(k)->GetGroupMembersEnd(); ++gitr) { gPlayer = (*gitr)->m_loggedInPlayer; if(gPlayer && (gPlayer == pPlayer || gPlayer->isInRange(pPlayer,100.0f))) // visible range { gPlayer->GetAchievementInterface()->HandleAchievementCriteriaHonorableKill(); gPlayer->GetAchievementInterface()->HandleAchievementCriteriaHonorableKillClass( pVictim->getClass() ); gPlayer->GetAchievementInterface()->HandleAchievementCriteriaHonorableKillRace( pVictim->getRace() ); gPlayer->m_killsToday++; gPlayer->m_killsLifetime++; if(gPlayer->m_bg) gPlayer->m_bg->HookOnHK(gPlayer); sHookInterface.OnHonorableKill(gPlayer, TO_PLAYER(pVictim)); AddHonorPointsToPlayer(gPlayer, GroupPoints); if(pVictim) { // Send PVP credit WorldPacket data(SMSG_PVP_CREDIT, 12); uint32 pvppoints = GroupPoints * 10; data << pvppoints << pVictim->GetGUID() << uint32(TO_PLAYER(pVictim)->GetPVPRank()); gPlayer->GetSession()->SendPacket(&data); } //patch by emsy // If we are in Halaa if(pPlayer->GetZoneId() == 3518) { // Add Halaa Battle Token SpellEntry * pvp_token_spell = dbcSpell.LookupEntry(gPlayer->GetTeam()? 33004 : 33005); gPlayer->CastSpell(gPlayer, pvp_token_spell, true); } // If we are in Hellfire Peninsula if(pPlayer->GetZoneId() == 3483) { // Add Mark of Thrallmar/Honor Hold SpellEntry * pvp_token_spell = dbcSpell.LookupEntry(gPlayer->GetTeam()? 32158 : 32155); gPlayer->CastSpell(gPlayer, pvp_token_spell, true); } } } } pGroup->Unlock(); } else { pPlayer->GetAchievementInterface()->HandleAchievementCriteriaHonorableKill(); pPlayer->GetAchievementInterface()->HandleAchievementCriteriaHonorableKillClass( pVictim->getClass() ); pPlayer->GetAchievementInterface()->HandleAchievementCriteriaHonorableKillRace( pVictim->getRace() ); pPlayer->m_killsToday++; pPlayer->m_killsLifetime++; AddHonorPointsToPlayer(pPlayer, Points); if(pPlayer->m_bg) pPlayer->m_bg->HookOnHK(pPlayer); sHookInterface.OnHonorableKill(pPlayer, TO_PLAYER(pVictim)); if(pVictim) { // Send PVP credit WorldPacket data(SMSG_PVP_CREDIT, 12); uint32 pvppoints = Points * 10; data << pvppoints << pVictim->GetGUID() << uint32(TO_PLAYER(pVictim)->GetPVPRank()); pPlayer->GetSession()->SendPacket(&data); } //patch by emsy // If we are in Halaa if(pPlayer->GetZoneId() == 3518) { // Add Halaa Battle Token SpellEntry * halaa_spell = dbcSpell.LookupEntry(pPlayer->GetTeam()? 33004 : 33005); pPlayer->CastSpell(pPlayer, halaa_spell, true); } } } }