void OnActivate(Player* pPlayer) { GameObject* obelisk1 = pPlayer->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords(2898.92f, 4759.29f, 277.408f, 185198); GameObject* obelisk2 = pPlayer->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords(2942.3f, 4752.28f, 285.553f, 185197); GameObject* obelisk3 = pPlayer->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords(2834.39f, 4856.67f, 277.632f, 185196); GameObject* obelisk4 = pPlayer->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords(2923.37f, 4840.36f, 278.45f, 185195); GameObject* obelisk5 = pPlayer->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords(2965.75f, 4835.25f, 277.949f, 185193); if(obelisk1 && obelisk2 && obelisk3 && obelisk4 && obelisk5) { if(obelisk1->GetState() == 0 && obelisk2->GetState() == 0 && obelisk3->GetState() == 0 && obelisk4->GetState() == 0 && obelisk5->GetState() == 0) { sEAS.SpawnCreature(pPlayer, 19963, 2943.59f, 4779.05f, 284.49f, 1.89f, 60 * 5 * 1000); } } if(obelisk1 != NULL) sEventMgr.AddEvent(TO_OBJECT(obelisk1), &Object::SetByte, (uint32)GAMEOBJECT_BYTES_1, (uint32)GAMEOBJECT_BYTES_STATE, (uint8)1, EVENT_UNK, 10000, 0, 1); if(obelisk2 != NULL) sEventMgr.AddEvent(TO_OBJECT(obelisk2), &Object::SetByte, (uint32)GAMEOBJECT_BYTES_1, (uint32)GAMEOBJECT_BYTES_STATE, (uint8)1, EVENT_UNK, 10000, 0, 1); if(obelisk3 != NULL) sEventMgr.AddEvent(TO_OBJECT(obelisk3), &Object::SetByte, (uint32)GAMEOBJECT_BYTES_1, (uint32)GAMEOBJECT_BYTES_STATE, (uint8)1, EVENT_UNK, 10000, 0, 1); if(obelisk4 != NULL) sEventMgr.AddEvent(TO_OBJECT(obelisk4), &Object::SetByte, (uint32)GAMEOBJECT_BYTES_1, (uint32)GAMEOBJECT_BYTES_STATE, (uint8)1, EVENT_UNK, 10000, 0, 1); if(obelisk5 != NULL) sEventMgr.AddEvent(TO_OBJECT(obelisk5), &Object::SetByte, (uint32)GAMEOBJECT_BYTES_1, (uint32)GAMEOBJECT_BYTES_STATE, (uint8)1, EVENT_UNK, 10000, 0, 1); }
bool ChatHandler::HandleRangeCheckCommand( const char *args , WorldSession *m_session ) { WorldPacket data; uint64 guid = m_session->GetPlayer()->GetSelection(); m_session->SystemMessage( "=== RANGE CHECK ===" ); if (guid == 0) { m_session->SystemMessage("No selection imo."); return true; } Unit* unit = m_session->GetPlayer()->GetMapMgr()->GetUnit( guid ); if(!unit) { m_session->SystemMessage("Invalid selection imo."); return true; } float DistSq = unit->GetDistanceSq( TO_OBJECT(m_session->GetPlayer()) ); m_session->SystemMessage( "GetDistanceSq : %u" , FL2UINT( DistSq ) ); LocationVector locvec( m_session->GetPlayer()->GetPositionX() , m_session->GetPlayer()->GetPositionY() , m_session->GetPlayer()->GetPositionZ() ); float DistReal = unit->CalcDistance( locvec ); m_session->SystemMessage( "CalcDistance : %u" , FL2UINT( DistReal ) ); float Dist2DSq = unit->GetDistance2dSq( TO_OBJECT(m_session->GetPlayer()) ); m_session->SystemMessage( "GetDistance2dSq: %u" , FL2UINT( Dist2DSq ) ); return true; }
void WorldSession::HandleQuestgiverStatusQueryOpcode( WorldPacket & recv_data ) { DEBUG_LOG( "WORLD"," Received CMSG_QUESTGIVER_STATUS_QUERY." ); CHECK_INWORLD_RETURN; uint64 guid; WorldPacket data(SMSG_QUESTGIVER_STATUS, 9); Object* qst_giver = NULLOBJ; recv_data >> guid; uint32 guidtype = GET_TYPE_FROM_GUID(guid); if(guidtype == HIGHGUID_TYPE_CREATURE) { Creature* quest_giver = _player->GetMapMgr()->GetCreature(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = quest_giver; else return; if (!quest_giver->isQuestGiver()) { OUT_DEBUG("WORLD: Creature is not a questgiver."); return; } } else if(guidtype==HIGHGUID_TYPE_ITEM) { Item* quest_giver = GetPlayer()->GetItemInterface()->GetItemByGUID(guid); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; } else if(guidtype==HIGHGUID_TYPE_GAMEOBJECT) { GameObject* quest_giver = _player->GetMapMgr()->GetGameObject(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; } if (!qst_giver) { OUT_DEBUG("WORLD: Invalid questgiver GUID "I64FMT".", guid); return; } data << guid << sQuestMgr.CalcStatus(qst_giver, GetPlayer()); SendPacket( &data ); }
void GameObject::Despawn(uint32 time) { if(!IsInWorld()) return; //This is for go get deleted while looting if( m_spawn != NULL ) { SetByte(GAMEOBJECT_BYTES_1,GAMEOBJECT_BYTES_STATE, m_spawn->state); SetUInt32Value(GAMEOBJECT_FLAGS, m_spawn->flags); } CALL_GO_SCRIPT_EVENT(TO_GAMEOBJECT(this), OnDespawn)(); if(time) { /* Get our originiating mapcell */ MapCell * pCell = m_mapCell; ASSERT(pCell); pCell->_respawnObjects.insert( TO_OBJECT(this) ); sEventMgr.RemoveEvents(this); sEventMgr.AddEvent(m_mapMgr, &MapMgr::EventRespawnGameObject, TO_GAMEOBJECT(this), pCell, EVENT_GAMEOBJECT_ITEM_SPAWN, time, 1, 0); Object::RemoveFromWorld(false); m_respawnCell=pCell; } else { Object::RemoveFromWorld(false); ExpireAndDelete(); } }
void MoveMap(Map *map) { Object *o = TO_OBJECT(GetPlayer()); float x = CX(o); float y = CY(o); float width = (float)ENGINE_WIDTH; float height = (float)ENGINE_HEIGTH; if (x + width / 2.0f > map->width * BLOCK_WIDTH) { map->x = map->width * BLOCK_WIDTH - width; } if (x - width / 2.0f >= 0 && x + width / 2.0f < map->width * BLOCK_WIDTH) { map->x = x - width / 2.0f; } /* if (y + height / 2.0f > map->height * BLOCK_HEIGHT) { map->y = map->height * BLOCK_HEIGHT - height; } if (y - height / 2.0f >= 0 && y + height / 2.0f < map->height * BLOCK_HEIGHT) { map->y = y - height / 2.0f; } */ }
void OnQuestComplete(Player* mTarget, QuestLogEntry* qLogEntry) { Creature* creat = mTarget->GetMapMgr()->GetSqlIdCreature(43727); if(creat == NULL) return; creat->SetDisplayId(901); creat->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "Ribbit! No! This cannot...ribbit...be! You have duped me with...ribbit..your foul trickery! Ribbit!"); sEventMgr.AddEvent(TO_OBJECT(creat), &Object::EventSetUInt32Value, (uint32)UNIT_FIELD_DISPLAYID, (uint32)10035, EVENT_UNK, 50000, 0, 1); }
GameObject::~GameObject() { if(m_ritualmembers) delete[] m_ritualmembers; uint32 guid = GetUInt32Value(OBJECT_FIELD_CREATED_BY); if(guid) { Player* plr = objmgr.GetPlayer(guid); if(plr && plr->GetSummonedObject() == TO_OBJECT(this) ) plr->SetSummonedObject(NULL); if(plr == m_summoner) m_summoner = NULL; } if(m_respawnCell != NULL) m_respawnCell->_respawnObjects.erase( TO_OBJECT(this) ); if (m_summonedGo && m_summoner) for(int i = 0; i < 4; i++) if (m_summoner->m_ObjectSlots[i] == GetUIdFromGUID()) m_summoner->m_ObjectSlots[i] = 0; if( m_battleground != NULL ) { if( m_battleground->GetType() == BATTLEGROUND_ARATHI_BASIN ) { if( bannerslot >= 0 && TO_ARATHIBASIN(m_battleground)->m_controlPoints[bannerslot] == TO_GAMEOBJECT(this) ) TO_ARATHIBASIN(m_battleground)->m_controlPoints[bannerslot] = NULL; if( bannerauraslot >= 0 && TO_ARATHIBASIN(m_battleground)->m_controlPointAuras[bannerauraslot] == TO_GAMEOBJECT(this) ) TO_ARATHIBASIN(m_battleground)->m_controlPointAuras[bannerauraslot] = NULL; } m_battleground = NULL; } }
void Item::RemoveFromWorld() { // if we have an owner->send destroy if( m_owner != NULL ) { DestroyForPlayer( m_owner ); } if( !IsInWorld() ) return; m_mapMgr->RemoveObject( TO_OBJECT(this), false ); m_mapMgr = NULLMAPMGR; // update our event holder event_Relocate(); }
void Vehicle::Despawn(uint32 delay, uint32 respawntime) { if(delay) { sEventMgr.AddEvent(TO_VEHICLE(this), &Vehicle::Despawn, (uint32)0, respawntime, EVENT_VEHICLE_RESPAWN, delay, 1,0); return; } if(!IsInWorld()) return; if(respawntime) { for(int i = 0; i < 8; i++) { if(m_passengers[i] != NULL) { if(m_passengers[i]->IsPlayer()) // Remove any passengers RemovePassenger(m_passengers[i]); else m_passengers[i]->Destruct(); } } /* get the cell with our SPAWN location. if we've moved cell this might break :P */ MapCell * pCell = m_mapMgr->GetCellByCoords(m_spawnLocation.x, m_spawnLocation.y); if(!pCell) pCell = m_mapCell; ASSERT(pCell); pCell->_respawnObjects.insert(TO_OBJECT(this)); sEventMgr.RemoveEvents(this); sEventMgr.AddEvent(m_mapMgr, &MapMgr::EventRespawnVehicle, TO_VEHICLE(this), pCell, EVENT_VEHICLE_RESPAWN, respawntime, 1, 0); Unit::RemoveFromWorld(false); m_position = m_spawnLocation; m_respawnCell=pCell; } else { Unit::RemoveFromWorld(true); SafeDelete(); } }
void AuraInterface::UpdateAuraStateAuras(uint32 oldflag) { if( oldflag == AURASTATE_FLAG_STUNNED && m_Unit->IsPlayer() && m_Unit->HasDummyAura(SPELL_HASH_PRIMAL_TENACITY) && TO_PLAYER(m_Unit)->GetShapeShift() == FORM_CAT ) { for(uint32 i = 0; i < TOTAL_AURAS; i++) { if(m_auras.find(i) != m_auras.end()) { if( m_auras.at(i)->GetSpellProto()->NameHash == SPELL_HASH_PRIMAL_TENACITY ) { Aura* aura = new Aura(m_auras.at(i)->GetSpellProto(), -1, TO_OBJECT(this), TO_UNIT(this)); RemoveAuraBySlot(i); aura->AddMod(232, -31, 5, 0); aura->AddMod(SPELL_AURA_DUMMY, 0, 0, 2); aura->AddMod(SPELL_AURA_ADD_PCT_MODIFIER, -51, 14, 2); AddAura(aura); continue; } if( m_auras.at(i)->m_applied) // try to apply m_auras.at(i)->ApplyModifiers(true); if( m_auras.at(i)->m_applied) // try to remove, if we lack the aurastate m_auras.at(i)->RemoveIfNecessary(); } } } else { for(uint32 i = 0; i < TOTAL_AURAS; i++) { if(m_auras.find(i) != m_auras.end()) { if( !m_auras.at(i)->m_applied) // try to apply m_auras.at(i)->ApplyModifiers(true); if( m_auras.at(i)->m_applied) // try to remove, if we lack the aurastate m_auras.at(i)->RemoveIfNecessary(); } } } }
void OnQuestComplete(Player * mTarget, QuestLogEntry *qLogEntry) { Creature * creat = mTarget->GetMapMgr()->GetSqlIdCreature(19175); //Lady Sylvanas Windrunner - NCDB guid if(creat == NULL) // we still check for equality with == NULL. if we are assigning, we use = NULLCREATURE/OBJECT/ETC return; sEAS.SpawnCreatureExtended(mTarget, 21628, 1295.222656f, 314.253998f, -57.320854f, 2.365611f, 35, 180000, true, true, true); sEAS.SpawnCreatureExtended(mTarget, 21628, 1293.403931f, 311.264465f, -57.320854f, 1.939140f, 35, 180000, true, true, true); sEAS.SpawnCreatureExtended(mTarget, 21628, 1286.532104f, 311.452423f, -57.320854f, 0.592182f, 35, 180000, true, true, true); sEAS.SpawnCreatureExtended(mTarget, 21628, 1284.536011f, 314.496338f, -57.320845f, 0.580401f, 35, 180000, true, true, true); creat->PlaySoundToSet(10896); creat->CastSpell(creat, dbcSpell.LookupEntry(36568), false); creat->SetUInt32Value(UNIT_NPC_FLAGS, 0); // Players can't interact with Sylvanas for 180000 ms. // Cast creat to an object because the EventSetUInt32Value method is in Object class. sEventMgr.AddEvent( TO_OBJECT(creat), &Object::EventSetUInt32Value, (uint32)UNIT_NPC_FLAGS, (uint32)2, EVENT_SCRIPT_UPDATE_EVENT, 180000, 0, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); }
void MoonScriptCreatureAI::CastSpellInRange(SpellDesc *pSpell) { if (pSpell != NULL) for (unordered_set< Player* >::iterator plr = _unit->GetInRangePlayerSetBegin(); plr!=_unit->GetInRangePlayerSetEnd(); plr++) if((*plr)!=NULL && (*plr)->isAlive() && (*plr)->IsPlayer() && _unit->CalcDistance((TO_OBJECT(*plr))) < 100) _unit->CastSpell((*plr)->GetGUID(), pSpell->mInfo, false); }
void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvPacket) { CHECK_INWORLD_RETURN; DEBUG_LOG( "WORLD"," Received CMSG_QUESTGIVER_CHOOSE_REWARD." ); uint64 guid; uint32 quest_id; uint32 reward_slot; recvPacket >> guid; recvPacket >> quest_id; recvPacket >> reward_slot; if( reward_slot >= 6 ) return; bool bValid = false; Quest *qst = NULL; Object* qst_giver = NULLOBJ; uint32 guidtype = GET_TYPE_FROM_GUID(guid); if(guidtype == HIGHGUID_TYPE_CREATURE) { Creature* quest_giver = _player->GetMapMgr()->GetCreature(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = quest_giver; else return; bValid = quest_giver->isQuestGiver(); if(bValid) qst = QuestStorage.LookupEntry(quest_id); } else if(guidtype==HIGHGUID_TYPE_GAMEOBJECT) { GameObject* quest_giver = _player->GetMapMgr()->GetGameObject(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; //bValid = quest_giver->isQuestGiver(); //if(bValid) bValid = true; qst = QuestStorage.LookupEntry(quest_id); } if (!qst_giver) { OUT_DEBUG("WORLD: Invalid questgiver GUID."); return; } if (!bValid || qst == NULL) { OUT_DEBUG("WORLD: Creature is not a questgiver."); return; } //FIXME: Some Quest givers talk in the end of the quest. // qst_giver->SendChatMessage(CHAT_MSG_MONSTER_SAY,LANG_UNIVERSAL,qst->GetQuestEndMessage().c_str()); QuestLogEntry *qle = _player->GetQuestLogForEntry(quest_id); if (!qle && !qst->is_repeatable) { OUT_DEBUG("WORLD: QuestLogEntry not found."); return; } if (qle && !qle->CanBeFinished()) { OUT_DEBUG("WORLD: Quest not finished."); return; } //check for room in inventory for all items if(!sQuestMgr.CanStoreReward(_player,qst,reward_slot)) { sQuestMgr.SendQuestFailed(FAILED_REASON_INV_FULL, qst, _player); return; } sQuestMgr.OnQuestFinished(_player, qst, qst_giver, reward_slot); //if(qst_giver->GetTypeId() == TYPEID_UNIT) qst->LUA_SendEvent(TO_CREATURE( qst_giver ),GetPlayer(),ON_QUEST_COMPLETEQUEST); if(qst->next_quest_id) { WorldPacket data(12); data.Initialize(CMSG_QUESTGIVER_QUERY_QUEST); data << guid; data << qst->next_quest_id; HandleQuestGiverQueryQuestOpcode(data); } _player->SaveToDB(false); }
void WorldSession::HandleQuestgiverCompleteQuestOpcode( WorldPacket & recvPacket ) { CHECK_INWORLD_RETURN; DEBUG_LOG( "WORLD"," Received CMSG_QUESTGIVER_COMPLETE_QUEST." ); uint64 guid; uint32 quest_id; recvPacket >> guid; recvPacket >> quest_id; bool bValid = false; Quest *qst = NULL; Object* qst_giver = NULLOBJ; uint32 status = 0; uint32 guidtype = GET_TYPE_FROM_GUID(guid); if(guidtype == HIGHGUID_TYPE_CREATURE) { Creature* quest_giver = _player->GetMapMgr()->GetCreature(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; bValid = quest_giver->isQuestGiver(); if(bValid) { qst = quest_giver->FindQuest(quest_id, QUESTGIVER_QUEST_END); /*if(!qst) sQuestMgr.FindQuest(quest_id);*/ if(!qst) { OUT_DEBUG("WARNING: Cannot complete quest, as it doesnt exist."); return; } status = sQuestMgr.CalcQuestStatus(GetPlayer(), qst, (uint8)quest_giver->GetQuestRelation(qst->id),false); } } else if(guidtype==HIGHGUID_TYPE_GAMEOBJECT) { GameObject* quest_giver = _player->GetMapMgr()->GetGameObject(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; // oops.. bValid = quest_giver->isQuestGiver(); if(bValid) { qst = quest_giver->FindQuest(quest_id, QUESTGIVER_QUEST_END); /*if(!qst) sQuestMgr.FindQuest(quest_id);*/ if(!qst) { OUT_DEBUG("WARNING: Cannot complete quest, as it doesnt exist."); return; } status = sQuestMgr.CalcQuestStatus(GetPlayer(), qst, (uint8)quest_giver->GetQuestRelation(qst->id),false); } } if (!qst_giver) { OUT_DEBUG("WORLD: Invalid questgiver GUID."); return; } if (!bValid || qst == NULL) { OUT_DEBUG("WORLD: Creature is not a questgiver."); return; } if (status == QMGR_QUEST_NOT_FINISHED || status == QMGR_QUEST_REPEATABLE) { WorldPacket data; sQuestMgr.BuildRequestItems(&data, qst, qst_giver, status, language); SendPacket(&data); DEBUG_LOG( "WORLD"," Sent SMSG_QUESTGIVER_REQUEST_ITEMS." ); } if (status == QMGR_QUEST_FINISHED) { WorldPacket data; sQuestMgr.BuildOfferReward(&data, qst, qst_giver, 1, language, _player); SendPacket(&data); DEBUG_LOG( "WORLD"," Sent SMSG_QUESTGIVER_REQUEST_ITEMS." ); } sHookInterface.OnQuestFinished(_player, qst, qst_giver); }
void GameObject::Update(uint32 p_time) { if(m_event_Instanceid != m_instanceId) { event_Relocate(); return; } if(!IsInWorld()) return; if(m_deleted) return; if(spell && (GetByte(GAMEOBJECT_BYTES_1, GAMEOBJECT_BYTES_STATE) == 1)) { if(checkrate > 1) { if(counter++%checkrate) return; } Object::InRangeSet::iterator itr,it2; Unit* pUnit; float dist; for( it2 = GetInRangeSetBegin(); it2 != GetInRangeSetEnd(); ++it2) { itr = it2; dist = GetDistanceSq((*itr)); if( (*itr) != m_summoner && (*itr)->IsUnit() && dist <= range) { pUnit = TO_UNIT(*itr); if(m_summonedGo) { if(!m_summoner) { ExpireAndDelete(); return; } if(!isAttackable(m_summoner,pUnit))continue; } Spell* sp= (new Spell(TO_OBJECT(this),spell,true,NULL)); SpellCastTargets tgt((*itr)->GetGUID()); tgt.m_destX = GetPositionX(); tgt.m_destY = GetPositionY(); tgt.m_destZ = GetPositionZ(); sp->prepare(&tgt); if(pInfo->Type == 6) { if(m_summoner != NULL) m_summoner->HandleProc(PROC_ON_TRAP_TRIGGER, pUnit, spell); } if(m_summonedGo) { ExpireAndDelete(); return; } if(spell->EffectImplicitTargetA[0] == 16 || spell->EffectImplicitTargetB[0] == 16) return; // on area dont continue. } } } }
void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data ) { DEBUG_LOG( "WORLD"," Received CMSG_QUESTGIVER_ACCEPT_QUEST" ); CHECK_INWORLD_RETURN; //WorldPacket data; uint64 guid; uint32 quest_id; uint32 unk; recv_data >> guid; recv_data >> quest_id; recv_data >> unk; bool bValid = false; bool hasquest = true; bool bSkipLevelCheck = false; Quest *qst = NULL; Object* qst_giver = NULLOBJ; uint32 guidtype = GET_TYPE_FROM_GUID(guid); if(guidtype == HIGHGUID_TYPE_CREATURE) { Creature* quest_giver = _player->GetMapMgr()->GetCreature(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; bValid = quest_giver->isQuestGiver(); hasquest = quest_giver->HasQuest(quest_id, 1); if(bValid) qst = QuestStorage.LookupEntry(quest_id); } else if(guidtype==HIGHGUID_TYPE_GAMEOBJECT) { GameObject* quest_giver = _player->GetMapMgr()->GetGameObject(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; //bValid = quest_giver->isQuestGiver(); //if(bValid) bValid = true; qst = QuestStorage.LookupEntry(quest_id); } else if(guidtype==HIGHGUID_TYPE_ITEM) { Item* quest_giver = GetPlayer()->GetItemInterface()->GetItemByGUID(guid); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; bValid = true; bSkipLevelCheck=true; qst = QuestStorage.LookupEntry(quest_id); if( qst && qst->id != quest_giver->GetProto()->QuestId ) return; } else if(guidtype==HIGHGUID_TYPE_PLAYER) { Player* quest_giver = _player->GetMapMgr()->GetPlayer((uint32)guid); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; bValid = true; qst = QuestStorage.LookupEntry(quest_id); } if (!qst_giver) { OUT_DEBUG("WORLD: Invalid questgiver GUID."); return; } if( !bValid || qst == NULL ) { OUT_DEBUG("WORLD: Creature is not a questgiver."); return; } if( _player->GetQuestLogForEntry( qst->id ) ) return; if( qst_giver->GetTypeId() == TYPEID_UNIT && TO_CREATURE( qst_giver )->m_escorter != NULL ) { SystemMessage("You cannot accept this quest at this time."); return; } // Check the player hasn't already taken this quest, or // it isn't available. uint32 status = sQuestMgr.CalcQuestStatus(_player,qst,3, bSkipLevelCheck); if((!sQuestMgr.IsQuestRepeatable(qst) && _player->HasFinishedQuest(qst->id)) || ( status != QMGR_QUEST_AVAILABLE && status != QMGR_QUEST_REPEATABLE && status != QMGR_QUEST_CHAT ) || !hasquest) { // We've got a hacker. Disconnect them. //sWorld.LogCheater(this, "tried to accept incompatible quest %u from %u.", qst->id, qst_giver->GetEntry()); //Disconnect(); return; } int32 log_slot = _player->GetOpenQuestSlot(); if (log_slot == -1) { sQuestMgr.SendQuestLogFull(GetPlayer()); return; } //FIXME /*if(Player Has Timed quest && qst->HasFlag(QUEST_FLAG_TIMED)) sQuestMgr.SendQuestInvalid(INVALID_REASON_HAVE_TIMED_QUEST);*/ if(qst->count_receiveitems || qst->srcitem) { uint32 slots_required = qst->count_receiveitems; if(_player->GetItemInterface()->CalculateFreeSlots(NULL) < slots_required) { _player->GetItemInterface()->BuildInventoryChangeError(NULLITEM, NULLITEM, INV_ERR_BAG_FULL); sQuestMgr.SendQuestFailed(FAILED_REASON_INV_FULL, qst, _player); return; } } /* if(qst_giver->GetTypeId() == TYPEID_UNIT && !ScriptSystem->OnQuestRequireEvent(qst, TO_CREATURE( qst_giver ), _player, QUEST_EVENT_CAN_ACCEPT)) return;*/ QuestLogEntry *qle = new QuestLogEntry(); qle->Init(qst, _player, log_slot); qle->UpdatePlayerFields(); // If the quest should give any items on begin, give them the items. for(uint32 i = 0; i < 4; i++) { if(qst->receive_items[i]) { Item* item = objmgr.CreateItem( qst->receive_items[i], GetPlayer()); if(item) { if(!_player->GetItemInterface()->AddItemToFreeSlot(item)) { item->DeleteMe(); item = NULLITEM; } else SendItemPushResult(item, false, true, false, true, _player->GetItemInterface()->LastSearchItemBagSlot(), _player->GetItemInterface()->LastSearchItemSlot(), 1); } } } if(qst->srcitem && qst->srcitem != qst->receive_items[0]) { Item* item = objmgr.CreateItem( qst->srcitem, _player ); if(item) { item->SetUInt32Value(ITEM_FIELD_STACK_COUNT, qst->srcitemcount ? qst->srcitemcount : 1); if(!_player->GetItemInterface()->AddItemToFreeSlot(item)) { item->DeleteMe(); item = NULLITEM; } } } if(qst->count_required_item || qst_giver->GetTypeId() == TYPEID_GAMEOBJECT) // gameobject quests deactivate _player->UpdateNearbyGameObjects(); CALL_QUESTSCRIPT_EVENT(qst->id, OnQuestStart)(_player, qle); sQuestMgr.OnQuestAccepted(_player,qst,qst_giver); if(qst->start_phase != 0 ) _player->SetPhaseMask(qst->start_phase, true); sHookInterface.OnQuestAccept(_player, qst, qst_giver); }
void WorldSession::HandleQuestGiverQueryQuestOpcode( WorldPacket & recv_data ) { DEBUG_LOG( "WORLD"," Received CMSG_QUESTGIVER_QUERY_QUEST." ); CHECK_INWORLD_RETURN; WorldPacket data; uint64 guid; uint32 quest_id; uint32 status = 0; recv_data >> guid; recv_data >> quest_id; Object* qst_giver = NULLOBJ; bool bValid = false; Quest* qst = QuestStorage.LookupEntry(quest_id); if (!qst) { OUT_DEBUG("WORLD: Invalid quest ID."); return; } uint32 guidtype = GET_TYPE_FROM_GUID(guid); if(guidtype == HIGHGUID_TYPE_CREATURE) { Creature* quest_giver = _player->GetMapMgr()->GetCreature(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = quest_giver; else return; bValid = quest_giver->isQuestGiver(); if(bValid) status = sQuestMgr.CalcQuestStatus(GetPlayer(), qst, (uint8)quest_giver->GetQuestRelation(qst->id), false); } else if(guidtype == HIGHGUID_TYPE_GAMEOBJECT) { GameObject* quest_giver = _player->GetMapMgr()->GetGameObject(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; bValid = quest_giver->isQuestGiver(); if(bValid) status = sQuestMgr.CalcQuestStatus(GetPlayer(), qst, (uint8)quest_giver->GetQuestRelation(qst->id), false); } else if(guidtype==HIGHGUID_TYPE_ITEM) { Item* quest_giver = GetPlayer()->GetItemInterface()->GetItemByGUID(guid); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; bValid = true; if( qst->id != quest_giver->GetProto()->QuestId ) return; status = sQuestMgr.CalcQuestStatus(GetPlayer(), qst, 1, false); } if (!qst_giver) { OUT_DEBUG("WORLD: Invalid questgiver GUID."); return; } if (!bValid) { OUT_DEBUG("WORLD: object is not a questgiver."); return; } /*if (!qst_giver->FindQuest(quest_id, QUESTGIVER_QUEST_START | QUESTGIVER_QUEST_END)) { OUT_DEBUG("WORLD: QuestGiver doesn't have that quest."); return; }*/ // bleh.. not needed.. maybe for antihack later on would be a good idea though if ((status == QMGR_QUEST_AVAILABLE) || (status == QMGR_QUEST_REPEATABLE) || (status == QMGR_QUEST_CHAT)) { sQuestMgr.BuildQuestDetails(&data, qst, qst_giver, 1, language, _player); // 0 because we want goodbye to function SendPacket(&data); OUT_DEBUG( "WORLD: Sent SMSG_QUESTGIVER_QUEST_DETAILS." ); } /*else if (status == QMGR_QUEST_FINISHED) { sQuestMgr.BuildOfferReward(&data, qst, qst_giver, 1); SendPacket(&data); DEBUG_LOG( "WORLD"," Sent SMSG_QUESTGIVER_OFFER_REWARD." ); }*/ else if (status == QMGR_QUEST_NOT_FINISHED || status == QMGR_QUEST_FINISHED) { sQuestMgr.BuildRequestItems(&data, qst, qst_giver, status, language); SendPacket(&data); DEBUG_LOG( "WORLD"," Sent SMSG_QUESTGIVER_REQUEST_ITEMS." ); } }
void WorldSession::HandleQuestgiverRequestRewardOpcode( WorldPacket & recv_data ) { CHECK_INWORLD_RETURN; DEBUG_LOG( "WORLD","Received CMSG_QUESTGIVER_REQUESTREWARD_QUEST." ); uint64 guid; uint32 quest_id; recv_data >> guid; recv_data >> quest_id; bool bValid = false; Quest *qst = NULL; Object* qst_giver = NULL; uint32 status = 0; uint32 guidtype = GET_TYPE_FROM_GUID(guid); if(guidtype==HIGHGUID_TYPE_UNIT) { Creature* quest_giver = _player->GetMapMgr()->GetCreature(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; bValid = quest_giver->isQuestGiver(); if(bValid) { qst = quest_giver->FindQuest(quest_id, QUESTGIVER_QUEST_END); if(!qst) qst = quest_giver->FindQuest(quest_id, QUESTGIVER_QUEST_START); if(!qst) { OUT_DEBUG("WARNING: Cannot complete quest, as it doesnt exist."); return; } status = sQuestMgr.CalcQuestStatus(qst_giver, GetPlayer(), qst, (uint8)quest_giver->GetQuestRelation(qst->id),false); } } else if(guidtype==HIGHGUID_TYPE_GAMEOBJECT) { GameObject* quest_giver = _player->GetMapMgr()->GetGameObject(GET_LOWGUID_PART(guid)); if(quest_giver) qst_giver = TO_OBJECT(quest_giver); else return; // oops.. bValid = quest_giver->isQuestGiver(); if(bValid) { qst = quest_giver->FindQuest(quest_id, QUESTGIVER_QUEST_END); if(!qst) { OUT_DEBUG("WARNING: Cannot complete quest, as it doesnt exist."); return; } status = sQuestMgr.CalcQuestStatus(qst_giver, GetPlayer(), qst, (uint8)quest_giver->GetQuestRelation(qst->id),false); } } if (!qst_giver) { OUT_DEBUG("WORLD: Invalid questgiver GUID."); return; } if (!bValid || qst == NULL) { OUT_DEBUG("WORLD: Creature is not a questgiver."); return; } if (status == QMGR_QUEST_FINISHED) { WorldPacket data; sQuestMgr.BuildOfferReward(&data, qst, qst_giver, 1, language, _player); SendPacket(&data); DEBUG_LOG( "WORLD","Sent SMSG_QUESTGIVER_REQUEST_ITEMS." ); } // if we got here it means we're cheating }
bool ChatHandler::HandleQuestFinishCommand(const char * args, WorldSession * m_session) { if(!*args) return false; Player* plr = getSelectedChar(m_session, true); if(!plr) { plr = m_session->GetPlayer(); SystemMessage(m_session, "Auto-targeting self."); } uint32 quest_id = atol(args); std::string recout = "|cff00ff00"; Quest * qst = QuestStorage.LookupEntry(quest_id); if(qst) { if (plr->HasFinishedQuest(quest_id) || plr->HasFinishedDailyQuest(quest_id)) recout += "Player has already completed that quest.\n\n"; else if(qst->is_repeatable == REPEATABLE_DAILY && plr->GetFinishedDailiesCount() >= 25) recout += "Player has reached the maximum number of completed daily quests.\n\n"; else { QuestLogEntry * IsPlrOnQuest = plr->GetQuestLogForEntry(quest_id); if (IsPlrOnQuest) { uint32 giver_id = 0; std::string my_query = ""; my_query = "SELECT id FROM creature_quest_starter WHERE quest = " + string(args); QueryResult *creatureResult = WorldDatabase.Query(my_query.c_str()); if(creatureResult) { Field *creatureFields = creatureResult->Fetch(); giver_id = creatureFields[0].GetUInt32(); delete creatureResult; } else { my_query = "SELECT id FROM gameobject_quest_starter WHERE quest = " + string(args); QueryResult *objectResult = WorldDatabase.Query(my_query.c_str()); if(objectResult) { Field *objectFields = objectResult->Fetch(); giver_id = objectFields[0].GetUInt32(); delete objectResult; } } if(giver_id == 0) SystemMessage(m_session, "Unable to find quest giver creature or object."); else { // I need some way to get the guid without targeting the creature or looking through all the spawns... Object* quest_giver; for(uint32 guid=1; guid < plr->GetMapMgr()->m_CreatureArraySize; guid++) { Creature* pCreature = plr->GetMapMgr()->GetCreature(GET_LOWGUID_PART(guid)); if(pCreature) { if(pCreature->GetEntry() == giver_id) //found creature { quest_giver = TO_OBJECT(pCreature); guid = plr->GetMapMgr()->m_CreatureArraySize; } } } if(quest_giver) { GreenSystemMessage(m_session, "Found a quest_giver creature."); sQuestMgr.GiveQuestRewardReputation(plr, qst, quest_giver); } else RedSystemMessage(m_session, "Unable to find quest_giver object."); } sQuestMgr.GenerateQuestXP(plr, qst); sQuestMgr.BuildQuestComplete(plr, qst); IsPlrOnQuest->Finish(); recout += "Player was on that quest, but has now completed it."; } else recout += "The quest has now been completed for that player."; if(qst->is_repeatable == REPEATABLE_DAILY) plr->AddToFinishedDailyQuests(quest_id); else plr->AddToFinishedQuests(quest_id); } } else { recout += "Quest Id ["; recout += args; recout += "] was not found and unable to add it to the player's quest log."; } recout += "\n\n"; SendMultilineMessage(m_session, recout.c_str()); return true; }
void AIUpdate() { switch(phase) { case 0: { _unit->GetAIInterface()->StopMovement(0); _unit->GetAIInterface()->SetAIState(STATE_SCRIPTMOVE); _unit->GetAIInterface()->setMoveType(MOVEMENTTYPE_WANTEDWP); _unit->GetAIInterface()->setWaypointToMove(1); } break; case 1: { _unit->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "I can only help you with a clean death.", 300); sEventMgr.AddEvent(TO_OBJECT(_unit), &Object::PlaySoundToSet, (uint32)14294, EVENT_UNK, 100, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); Creature* citizen = _unit->GetMapMgr()->GetInterface()->GetCreatureNearestCoords(_unit->GetPositionX(), _unit->GetPositionY(), _unit->GetPositionZ(), 28167); if(citizen) { _unit->GetAIInterface()->MoveTo(citizen->GetPositionX(), citizen->GetPositionY(), citizen->GetPositionZ(), citizen->GetOrientation()); _unit->DealDamage(citizen, citizen->GetUInt32Value(UNIT_FIELD_HEALTH), 0, 0, 0); } citizen = _unit->GetMapMgr()->GetInterface()->GetCreatureNearestCoords(_unit->GetPositionX(), _unit->GetPositionY(), _unit->GetPositionZ(), 28169); if(citizen) { _unit->GetAIInterface()->MoveTo(citizen->GetPositionX(), citizen->GetPositionY(), citizen->GetPositionZ(), citizen->GetOrientation()); _unit->DealDamage(citizen, citizen->GetUInt32Value(UNIT_FIELD_HEALTH), 0, 0, 0); } _unit->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "That was just the beginning.", 1000); sEventMgr.AddEvent(TO_OBJECT(_unit), &Object::PlaySoundToSet, (uint32)14295, EVENT_UNK, 1000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); phase++; sEventMgr.AddEvent(_unit, &Creature::CallScriptUpdate, EVENT_SCRIPT_UPDATE_EVENT, 1500, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); } break; case 2: { //we need that tricky animation here //spawn Mal'Ganis CreatureProto* cp = CreatureProtoStorage.LookupEntry(26533); CreatureInfo* ci = CreatureNameStorage.LookupEntry(26533); Creature* c = NULL; if(cp && ci) { c = _unit->GetMapMgr()->CreateCreature(26533); if(c) { //position is guessed c->Load(cp, 2113.52f, 1288.01f, 136.382f, 2.30383f); c->PushToWorld(_unit->GetMapMgr()); } } if(c) { c->bInvincible = true; c->GetAIInterface()->m_canMove = false; c->GetAIInterface()->SetAllowedToEnterCombat(false); for(uint8 i = 0; i < 7; i++) c->SchoolImmunityList[i] = 1; c->SetUInt64Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); //1 = 0s c->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "Yes, this is the beginning. I've been waiting for you, young prince. I am Mal'Ganis."); c->PlaySoundToSet(14410); //2 = 13s //change all citizens to undeads... sEventMgr.AddEvent(c, &Creature::CallScriptUpdate, EVENT_SCRIPT_UPDATE_EVENT, 13000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); c->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "As you can see, your people are now mine. I will now turn this city, household by household, until the flame of life has been snuffed out forever.", 13000); sEventMgr.AddEvent(TO_OBJECT(c), &Object::PlaySoundToSet, (uint32)14411, EVENT_UNK, 13000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //2 = 32s _unit->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "I won't allow it Mal'Ganis better than these people die by my hand than serve as your slaves in death.", 32000); sEventMgr.AddEvent(TO_OBJECT(_unit), &Object::PlaySoundToSet, (uint32)14296, EVENT_UNK, 32000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); c->Despawn(38500, 0); //3 = 37s /*sEventMgr.AddEvent(TO_UNIT(_unit), &Unit::SendChatMessage, (uint8)CHAT_MSG_MONSTER_SAY, (uint32)LANG_UNIVERSAL, "Mal'Ganis will send out some of his blablabla - write that txt", EVENT_UNIT_CHAT_MSG, 37000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT);*/ sEventMgr.AddEvent(TO_OBJECT(_unit), &Object::PlaySoundToSet, (uint32)14885, EVENT_UNK, 39000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); } } break; } }
void OnReachWP(uint32 i, bool usl) { if(i == 3 && check) { check = false; Creature* Arthas = _unit->GetMapMgr()->GetInterface()->GetCreatureNearestCoords(_unit->GetPositionX(), _unit->GetPositionY(), _unit->GetPositionZ(), 26499); Creature* Jaina = _unit->GetMapMgr()->GetInterface()->GetCreatureNearestCoords(_unit->GetPositionX(), _unit->GetPositionY(), _unit->GetPositionZ(), 26497); if(Arthas && Jaina) //Show must go on! { //we add 0,5s per speech //1 = 0s Arthas->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "Glad you could make it, Uther..."); Arthas->PlaySoundToSet(12828); //2 = 2,5s _unit->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "Watch your tone with me, boy. You may be the prince, but I'm still your superior as a paladin.", 2500); sEventMgr.AddEvent(TO_OBJECT(_unit), &Object::PlaySoundToSet, (uint32)12839, EVENT_UNK, 2500, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //3 = 9s Arthas->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "As if I could forget. Listen Uther, there's something about the plague you should know.", 9000); sEventMgr.AddEvent(TO_OBJECT(Arthas), &Object::PlaySoundToSet, (uint32)12829, EVENT_UNK, 9000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //4 = 14,5s Arthas->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "Oh no, it's already begun. These people may look fine now, but it's only a matter of time before they turn into the Undead!", 14500); sEventMgr.AddEvent(TO_OBJECT(Arthas), &Object::PlaySoundToSet, (uint32)12830, EVENT_UNK, 14500, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //5 = 25s _unit->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "What?!", 25000); sEventMgr.AddEvent(TO_OBJECT(_unit), &Object::PlaySoundToSet, (uint32)12840, EVENT_UNK, 25000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //6 = 26,5s Arthas->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "This entire city must be purged.", 26500); sEventMgr.AddEvent(TO_OBJECT(Arthas), &Object::PlaySoundToSet, (uint32)12831, EVENT_UNK, 26500, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //7 = 29s _unit->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "How can you even consider that? There's *got* to be some other way.", 29000); sEventMgr.AddEvent(TO_OBJECT(_unit), &Object::PlaySoundToSet, (uint32)12841, EVENT_UNK, 29000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //8 = 33,5s Arthas->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "Damn it, Uther! As your future king, I order you to purge this city!", 33500); sEventMgr.AddEvent(TO_OBJECT(Arthas), &Object::PlaySoundToSet, (uint32)12832, EVENT_UNK, 33500, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //9 = 38s _unit->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "You are *not* my king yet, boy. Nor would I obey that command even if you were.", 38000); sEventMgr.AddEvent(TO_OBJECT(_unit), &Object::PlaySoundToSet, (uint32)12842, EVENT_UNK, 38000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //10 = 44,5s Arthas->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "Then I must consider this an act of treason.", 44500); sEventMgr.AddEvent(TO_OBJECT(Arthas), &Object::PlaySoundToSet, (uint32)12833, EVENT_UNK, 44500, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //11 = 49s _unit->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "Treason?! Have you lost your mind, Arthas?", 49000); sEventMgr.AddEvent(TO_OBJECT(_unit), &Object::PlaySoundToSet, (uint32)12843, EVENT_UNK, 49000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //12 = 53,5s Arthas->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "Have I? Lord Uther, by my right of succession and the sovereignty of my crown, I hereby relieve you of your command, and suspend your paladins from service.", 53500); sEventMgr.AddEvent(TO_OBJECT(Arthas), &Object::PlaySoundToSet, (uint32)12834, EVENT_UNK, 53500, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //13 = 65s Jaina->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "Arthas! You can't just--", 65000); sEventMgr.AddEvent(TO_OBJECT(Jaina), &Object::PlaySoundToSet, (uint32)12837, EVENT_UNK, 65000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //14 = 67,5s Arthas->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "It's done! Those of you who have the will to save this land, follow me. The rest of you... get out of my sight.", 67500); sEventMgr.AddEvent(TO_OBJECT(Arthas), &Object::PlaySoundToSet, (uint32)12835, EVENT_UNK, 67500, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //15 = 77s //here few knights should leave, after speech, Uther should leave also _unit->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "You've just crossed a terrible threshold, Arthas.", 77000); sEventMgr.AddEvent(TO_OBJECT(_unit), &Object::PlaySoundToSet, (uint32)12844, EVENT_UNK, 77000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //16 = 80,5s //Jaina begins leaving Arthas->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "Jaina? ", 80500); sEventMgr.AddEvent(TO_OBJECT(Arthas), &Object::PlaySoundToSet, (uint32)12836, EVENT_UNK, 80500, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //17 = 82s Jaina->SendChatMessage(CHAT_MSG_MONSTER_SAY, LANG_UNIVERSAL, "I'm sorry, Arthas. I can't watch you do this...", 82000); sEventMgr.AddEvent(TO_OBJECT(Jaina), &Object::PlaySoundToSet, (uint32)12838, EVENT_UNK, 82000, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); //trigger Arthas actions = 86,5s sEventMgr.AddEvent(Arthas, &Creature::CallScriptUpdate, EVENT_SCRIPT_UPDATE_EVENT, 86500, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT); _unit->Despawn(100000, 0); } } }