void MoveInLineOfSight(Unit * /*who*/) { if (!GridSearcherSucceeded) { FindChannelers(); if (!Channelers.empty()) { for (std::list<uint64>::const_iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr) { Creature* Channeler = (Unit::GetCreature(*me, *itr)); if (Channeler) { if (Channeler->isDead()) { Channeler->RemoveCorpse(); Channeler->Respawn(); } Channeler->CastSpell(me, SPELL_SHADE_SOUL_CHANNEL, true); Channeler->CastSpell(me, SPELL_SHADE_SOUL_CHANNEL_2, true); Channeler->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); GridSearcherSucceeded = true; } } } else sLog->outError("SD2 ERROR: No Channelers are stored in the list. This encounter will not work properly"); } }
void Reset() override { Initialize(); Creature* pMember = NULL; for (uint8 i = 0; i < 4; ++i) { pMember = ObjectAccessor::GetCreature((*me), Council[i]); if (!pMember) continue; if (!pMember->IsAlive()) { pMember->RemoveCorpse(); pMember->Respawn(); } pMember->AI()->EnterEvadeMode(); } instance->SetBossState(DATA_ILLIDARI_COUNCIL, NOT_STARTED); if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BLOOD_ELF_COUNCIL_VOICE))) VoiceTrigger->AI()->EnterEvadeMode(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetDisplayId(11686); }
void Reset() { CheckTimer = 2000; EndEventTimer = 0; DeathCount = 0; Creature* pMember = NULL; for (uint8 i = 0; i < 4; ++i) { if ((pMember = (Unit::GetCreature((*me), Council[i])))) { if (!pMember->isAlive()) { pMember->RemoveCorpse(); pMember->Respawn(); } pMember->AI()->EnterEvadeMode(); } } if (pInstance) { pInstance->SetData(DATA_ILLIDARICOUNCILEVENT, NOT_STARTED); if (Creature* VoiceTrigger = (Unit::GetCreature(*me, pInstance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE)))) VoiceTrigger->AI()->EnterEvadeMode(); } EventBegun = false; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetDisplayId(11686); }
bool OPvPCapturePoint::DelCreature(uint32 type) { if (!m_Creatures[type]) { sLog.outDebug("opvp creature type %u was already deleted", type); return false; } Creature* cr = HashMapHolder<Creature>::Find(m_Creatures[type]); if (!cr) { // can happen when closing the core m_Creatures[type] = 0; return false; } sLog.outDebug("deleting opvp creature type %u", type); uint32 guid = cr->GetDBTableGUIDLow(); // Don't save respawn time cr->SetRespawnTime(0); cr->RemoveCorpse(); // explicit removal from map // beats me why this is needed, but with the recent removal "cleanup" some creatures stay in the map if "properly" deleted // so this is a big fat workaround, if AddObjectToRemoveList and DoDelayedMovesAndRemoves worked correctly, this wouldn't be needed if (Map* map = MapManager::Instance().FindMap(cr->GetMapId())) map->RemoveFromMap(cr, false); // delete respawn time for this creature WorldDatabase.PExecute("DELETE FROM creature_respawn WHERE guid = '%u'", guid); cr->AddObjectToRemoveList(); sObjectMgr.DeleteCreatureData(guid); m_CreatureTypes[m_Creatures[type]] = 0; m_Creatures[type] = 0; return true; }
void instance_zulfarrak::OnPlayerDeath(Player * /*pPlayer*/) { //Wipe during pyramide event: reset! if (GetData(TYPE_PYRAMIDE) != IN_PROGRESS && GetData(TYPE_PYRAMIDE) != SPECIAL) return; Map::PlayerList const& L = instance->GetPlayers(); uint32 i = 0; for (Map::PlayerList::const_iterator itr = L.begin(); itr != L.end(); ++itr) { Player* P = itr->getSource(); if (!P || P->isDead() || !P->isAlive()) i++; } if (i < L.getSize()-1) return; //Reset Event SetData(TYPE_PYRAMIDE, NOT_STARTED); //despawn summons if (!m_uiPyramideTrash.empty()) { for(GUIDList::iterator itr = m_uiPyramideTrash.begin(); itr != m_uiPyramideTrash.end(); ++itr) { if (Creature* pTroll = instance->GetCreature(*itr)) { pTroll->ForcedDespawn(); pTroll->RemoveFromWorld(); } } } m_uiPyramideTrash.clear(); m_uiPyramideTrashTemp.clear(); m_uiWave = 0; m_uiCheckPyramideTrash_Timer = 15000; //Reset troll cages and prisoners so event can be restarted for (int i = 0; i < 5; i++) { m_uiPyramideNPCs[i].clear(); DoUseDoorOrButton(m_mGoEntryGuidStore[GO_TROLL_CAGE1+i],0,false); Creature* C = GetSingleCreatureFromStorage(NPC_SERGEANT_BLY+i); C->SetDeathState(JUST_DIED); C->Respawn(); C->setFaction(FACTION_FRIENDLY); } //Set respawn time of executioner Creature* C = GetSingleCreatureFromStorage(NPC_SANDFURY_EXECUTIONER); if (C && C->IsInWorld() && !C->isAlive()) { C->RemoveCorpse(); C->SetRespawnTime(35); C->SaveRespawnTime(); C->SetRespawnDelay(10 * 24 * 3600); } //Despawn Nekrum aswell C = GetSingleCreatureFromStorage(NPC_NEKRUM_GUTCHEWER); if (C && C->IsInWorld()) { C->ForcedDespawn(); C->RemoveFromWorld(); } }
void SetData(uint32 type, uint32 data) { switch (type) { case DATA_ELDER_NADOX_EVENT: m_auiEncounter[0] = data; break; case DATA_PRINCE_TALDARAM_EVENT: if (data == DONE) HandleGameObject(Prince_TaldaramGate, true); m_auiEncounter[1] = data; break; case DATA_JEDOGA_SHADOWSEEKER_EVENT: m_auiEncounter[2] = data; if (data == DONE) { for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr) { Creature* cr = instance->GetCreature(*itr); if (cr && cr->isAlive()) { cr->SetVisible(false); cr->setDeathState(JUST_DIED); cr->RemoveCorpse(); } } } break; case DATA_HERALD_VOLAZJ_EVENT: m_auiEncounter[3] = data; break; case DATA_AMANITAR_EVENT: m_auiEncounter[4] = data; break; case DATA_SPHERE1_EVENT: spheres[0] = data; break; case DATA_SPHERE2_EVENT: spheres[1] = data; break; case DATA_JEDOGA_TRIGGER_SWITCH: switchtrigger = data; break; case DATA_JEDOGA_RESET_INITIANDS: for (std::set<uint64>::const_iterator itr = InitiandGUIDs.begin(); itr != InitiandGUIDs.end(); ++itr) { Creature* cr = instance->GetCreature(*itr); if (cr) { cr->Respawn(); if (!cr->IsInEvadeMode()) cr->AI()->EnterEvadeMode(); } } break; } if (data == DONE) SaveToDB(); }
void CreatePet(Player *player, Creature * m_creature, uint32 entry) { if(player->getClass() != CLASS_HUNTER) { m_creature->MonsterWhisper("You are not a Hunter!", player->GetGUID()); player->PlayerTalkClass->SendCloseGossip(); return; } if(player->GetPet()) { m_creature->MonsterWhisper("First you must drop your Pet!", player->GetGUID()); player->PlayerTalkClass->SendCloseGossip(); return; } Creature *creatureTarget = m_creature->SummonCreature(entry, player->GetPositionX(), player->GetPositionY()+2, player->GetPositionZ(), player->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 500); if(!creatureTarget) return; Pet* pet = player->CreateTamedPetFrom(creatureTarget, 0); if(!pet) return; // kill original creature creatureTarget->setDeathState(JUST_DIED); creatureTarget->RemoveCorpse(); creatureTarget->SetHealth(0); // just for nice GM-mode view pet->SetPower(POWER_HAPPINESS, 1048000); //pet->SetUInt32Value(UNIT_FIELD_PETEXPERIENCE,0); //pet->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32((Trinity::XP::xp_to_level(70))/4)); // prepare visual effect for levelup pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->getLevel() - 1); pet->GetMap()->AddToMap((Creature*)pet); // visual effect for levelup pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->getLevel()); if(!pet->InitStatsForLevel(player->getLevel())) // sLog->outError("Pet Create fail: no init stats for entry %u", entry); pet->UpdateAllStats(); // caster have pet now player->SetMinion(pet, true); pet->SavePetToDB(PET_SAVE_AS_CURRENT); pet->InitTalentForLevel(); player->PetSpellInitialize(); //end player->PlayerTalkClass->SendCloseGossip(); m_creature->MonsterWhisper("Pet added. You might want to feed it and name it somehow.", player->GetGUID()); }
void DeSummonBeams() { for(uint8 i=0;i<2;i++) { Creature* mob = (Creature*)Unit::GetUnit(*m_creature,beams[i]); if(mob) { mob->setDeathState(DEAD); mob->RemoveCorpse(); } } }
void DeSummonBeams() { for (uint8 i=0; i<2; ++i) { Creature* mob = Unit::GetCreature(*me, beams[i]); if (mob) { mob->setDeathState(DEAD); mob->RemoveCorpse(); } } }
void CreatePet(Player *player, Creature * m_creature, uint32 entry) { if(player->getClass() != CLASS_HUNTER) { player->PlayerTalkClass->SendCloseGossip(); return; } if(player->GetPet()) { m_creature->MonsterWhisper("First you must drop your Pet!", player->GetGUID()); m_creature->MonsterWhisper("First you must drop your Pet!", player->GetGUID(), true); player->PlayerTalkClass->SendCloseGossip(); return; } Creature *creatureTarget = m_creature->SummonCreature(entry, player->GetPositionX(), player->GetPositionY()+2, player->GetPositionZ(), player->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 500); if(!creatureTarget) return; Pet* pet = player->CreateTamedPetFrom(creatureTarget, 0); if(!pet) return; // kill original creature creatureTarget->setDeathState(JUST_DIED); creatureTarget->RemoveCorpse(); creatureTarget->SetHealth(0); // just for nice GM-mode view pet->SetUInt64Value(UNIT_FIELD_CREATEDBY, player->GetGUID()); pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, player->getFaction()); // prepare visual effect for levelup pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->getLevel() - 1); pet->GetMap()->AddToMap(pet->ToCreature()); // visual effect for levelup pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->getLevel()); pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true); if(!pet->InitStatsForLevel(player->getLevel())) sLog->outInfo(LOG_FILTER_PETS, "Pet Create fail: no init stats for entry %u", entry); pet->UpdateAllStats(); // caster have pet now player->SetMinion(pet, true); pet->SavePetToDB(PET_SAVE_AS_CURRENT); pet->InitTalentForLevel(); player->PetSpellInitialize(); //end player->PlayerTalkClass->SendCloseGossip(); m_creature->MonsterWhisper("Pet added. You might want to feed it and name it somehow.", player->GetGUID()); m_creature->MonsterWhisper("Pet added. You might want to feed it and name it somehow.", player->GetGUID(), true); }
void CreatePet(Player *player, Creature * m_creature, uint32 entry) { if(player->getClass() != CLASS_HUNTER) { player->PlayerTalkClass->SendCloseGossip(); return; } if(player->GetPet()) { player->PlayerTalkClass->SendCloseGossip(); return; } Creature *creatureTarget = m_creature->SummonCreature(entry, player->GetPositionX(), player->GetPositionY()+2, player->GetPositionZ(), player->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 500); if(!creatureTarget) return; Pet* pet = player->CreateTamedPetFrom(creatureTarget, 0); if (!pet) return; // kill original creature creatureTarget->setDeathState(JUST_DIED); creatureTarget->RemoveCorpse(); creatureTarget->SetHealth(0); // just for nice GM-mode view pet->SetPower(POWER_HAPPINESS, 1048000); pet->SetUInt64Value(UNIT_FIELD_CREATEDBY, player->GetGUID()); pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, player->getFaction()); // prepare visual effect for levelup pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->getLevel() - 1); pet->GetMap()->AddToMap(pet->ToCreature()); // visual effect for levelup for lulz pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->getLevel()); pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true); if (!pet->InitStatsForLevel(player->getLevel())) pet->UpdateAllStats(); // caster has pet now player->SetMinion(pet, true); pet->SavePetToDB(PET_SAVE_AS_CURRENT); pet->InitTalentForLevel(); player->PetSpellInitialize(); //inform that has da pet player->PlayerTalkClass->SendCloseGossip(); }
void SummonList::DespawnEntry(uint32 entry, uint32 msTimeToDespawn) { for (iterator i = begin(); i != end();) { Creature *summon = Unit::GetCreature(*me, *i); if (!summon) erase(i++); else if (summon->GetEntry() == entry) { erase(i++); summon->setDeathState(JUST_DIED); summon->RemoveCorpse(); } else ++i; } }
void CreatePet(Player *player, Creature * m_creature, uint32 entry) { if(player->getClass() != CLASS_HUNTER) { m_creature->MonsterWhisper("You are not a Hunter!", player->GetGUID()); player->PlayerTalkClass->SendCloseGossip(); return; } if(player->GetPet()) { m_creature->MonsterWhisper("First you must drop your Pet!", player->GetGUID()); player->PlayerTalkClass->SendCloseGossip(); return; } Creature *creatureTarget = m_creature->SummonCreature(entry, player->GetPositionX(), player->GetPositionY()+2, player->GetPositionZ(), player->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 500); if(!creatureTarget) return; Pet* pet = player->CreateTamedPetFrom(creatureTarget, 0); if(!pet) return; creatureTarget->setDeathState(JUST_DIED); creatureTarget->RemoveCorpse(); creatureTarget->SetHealth(0); // just for nice GM-mode view pet->SetPower(POWER_HAPPINESS, 1048000); pet->setPowerType(POWER_FOCUS); pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->getLevel() - 1); pet->GetMap()->AddToMap(pet->ToCreature()); pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->getLevel()); if(!pet->InitStatsForLevel(player->getLevel())) sLog->outError (LOG_FILTER_GENERAL,"Pet Create fail: no init stats for entry %u", entry); pet->UpdateAllStats(); player->SetMinion(pet, true); pet->SavePetToDB(PET_SAVE_AS_CURRENT); pet->InitTalentForLevel(); player->PetSpellInitialize(); player->PlayerTalkClass->SendCloseGossip(); m_creature->MonsterWhisper("Pet added. You might want to feed it and name it somehow.", player->GetGUID()); }
void CreatePet(Player *player, Creature * m_creature, uint32 entry) { if(sConfigMgr->GetBoolDefault("BeastMaster.OnlyHunter", false)) // Checks to see if Only Hunters can have pets. { if(player->getClass() != CLASS_HUNTER) { ChatHandler(player->GetSession()).PSendSysMessage("You are not a Hunter!", LANG_UNIVERSAL, player); return; } } if(player->GetPet()) { ChatHandler(player->GetSession()).PSendSysMessage("First you must abandon your Pet!", LANG_UNIVERSAL, player); return; } Creature *creatureTarget = m_creature->SummonCreature(entry, player->GetPositionX(), player->GetPositionY()+2, player->GetPositionZ(), player->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 500); if(!creatureTarget) return; Pet* pet = player->CreateTamedPetFrom(creatureTarget, 0); if(!pet) return; // kill original creature creatureTarget->setDeathState(JUST_DIED); creatureTarget->RemoveCorpse(); creatureTarget->SetHealth(0); // just for nice GM-mode view pet->SetPower(POWER_HAPPINESS, 1048000); // prepare visual effect for levelup pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->getLevel() - 1); pet->GetMap()->AddToMap((Creature*)pet); // visual effect for levelup pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->getLevel()); if(!pet->InitStatsForLevel(player->getLevel())) TC_LOG_ERROR("scripts", "Pet Create fail: no init stats for entry %u", entry); pet->UpdateAllStats(); // caster have pet now player->SetMinion(pet, true); pet->SavePetToDB(PET_SAVE_AS_CURRENT); pet->InitTalentForLevel(); player->PetSpellInitialize(); //end player->CLOSE_GOSSIP_MENU(); ChatHandler(player->GetSession()).PSendSysMessage("Pet added. You might want to feed it and name it somehow.", LANG_UNIVERSAL, player); return; }
// used when Archaedas dies. All active minions must be despawned. void DeActivateMinions() { // first despawn any aggroed wall minions for (std::vector<uint64>::const_iterator i = vArchaedasWallMinions.begin(); i != vArchaedasWallMinions.end(); ++i) { Creature *pTarget = instance->GetCreature(*i); if (!pTarget || pTarget->isDead() || pTarget->getFaction() != 14) continue; pTarget->setDeathState(JUST_DIED); pTarget->RemoveCorpse(); } // Vault Walkers for (std::vector<uint64>::const_iterator i = vVaultWalker.begin(); i != vVaultWalker.end(); ++i) { Creature *pTarget = instance->GetCreature(*i); if (!pTarget || pTarget->isDead() || pTarget->getFaction() != 14) continue; pTarget->setDeathState(JUST_DIED); pTarget->RemoveCorpse(); } // Earthen Guardians for (std::vector<uint64>::const_iterator i = vEarthenGuardian.begin(); i != vEarthenGuardian.end(); ++i) { Creature *pTarget = instance->GetCreature(*i); if (!pTarget || pTarget->isDead() || pTarget->getFaction() != 14) continue; pTarget->setDeathState(JUST_DIED); pTarget->RemoveCorpse(); } }
void DeSpawnAdds() { for(uint8 i = 0; i < 4 ; ++i) { Creature* Temp = NULL; if (AddGUID[i]) { Temp = Creature::GetCreature((*m_creature),AddGUID[i]); if (Temp && Temp->isAlive()) { (*Temp).GetMotionMaster()->Clear(true); Temp->DealDamage(Temp, Temp->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); Temp->RemoveCorpse(); } } } }
void KillHostage(uint8 index) { if(!HostagesGUID[index]) return; Creature *hostage = (Creature*)(instance->GetUnit(HostagesGUID[index])); if(!hostage) return; WorldLocation wLoc; hostage->GetPosition(wLoc); Creature *corpse = hostage->SummonCreature(HostageInfo[index].deadnpc, wLoc.coord_x, wLoc.coord_y, wLoc.coord_z, wLoc.orientation, TEMPSUMMON_MANUAL_DESPAWN, 0); if(corpse) { corpse->SetStandState(UNIT_STAND_STATE_DEAD); // TODO: add some burn effect } hostage->Kill(hostage, false); hostage->RemoveCorpse(); }
void BattleGround::SpawnBGCreature(ObjectGuid guid, uint32 respawntime) { Map* map = GetBgMap(); Creature* obj = map->GetCreature(guid); if (!obj) return; if (respawntime == 0) { obj->Respawn(); map->Add(obj); } else { map->Add(obj); obj->SetRespawnDelay(respawntime); obj->SetDeathState(JUST_DIED); obj->RemoveCorpse(); } }
void WorldSession::HandleSpellClick( WorldPacket & recv_data ) { ObjectGuid guid; recv_data >> guid; Creature *unit = _player->GetMap()->GetAnyTypeCreature(guid); if (!unit) return; if (_player->isInCombat() && !guid.IsVehicle()) // client prevent click and set different icon at combat state return; if(guid.IsVehicle() && _player->GetVehicleKit()) _player->RemoveVehicleKit(); SpellClickInfoMapBounds clickPair = sObjectMgr.GetSpellClickInfoMapBounds(unit->GetEntry()); for(SpellClickInfoMap::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr) { if (itr->second.IsFitToRequirements(_player)) { Unit *caster = (itr->second.castFlags & 0x1) ? (Unit*)_player : (Unit*)unit; Unit *target = (itr->second.castFlags & 0x2) ? (Unit*)_player : (Unit*)unit; if(itr->second.castFlags & 0x4) { unit->SetDeathState(JUST_DIED); unit->RemoveCorpse(); unit->SetHealth(0); } caster->CastSpell(target, itr->second.spellId, true, NULL, NULL,caster->GetObjectGuid()); } } if (unit->GetObjectGuid().IsVehicle()) { _player->EnterVehicle(unit->GetVehicleKit()); } }
// Despawned ein Add bool ScriptedAI::DespawnAdd(uint64 guid) { if (!guid) return false; Creature* pC = me->GetMap()->GetCreature(guid); if (!pC) return false; if (pC->isAlive()) { pC->SetVisible(false); pC->setDeathState(JUST_DIED); pC->SetHealth(0); } if (pC->getDeathState() == CORPSE) pC->RemoveCorpse(); return true; }
bool OPvPCapturePoint::DelCreature(uint32 type) { ObjectGuid::LowType spawnId = m_Creatures[type]; if (!spawnId) { TC_LOG_DEBUG("outdoorpvp", "opvp creature type %u was already deleted", type); return false; } auto bounds = m_PvP->GetMap()->GetCreatureBySpawnIdStore().equal_range(spawnId); for (auto itr = bounds.first; itr != bounds.second;) { Creature* c = itr->second; ++itr; // Don't save respawn time c->SetRespawnTime(0); c->RemoveCorpse(); c->AddObjectToRemoveList(); } TC_LOG_DEBUG("outdoorpvp", "deleting opvp creature type %u", type); // explicit removal from map // beats me why this is needed, but with the recent removal "cleanup" some creatures stay in the map if "properly" deleted // so this is a big fat workaround, if AddObjectToRemoveList and DoDelayedMovesAndRemoves worked correctly, this wouldn't be needed //if (Map* map = sMapMgr->FindMap(cr->GetMapId())) // map->Remove(cr, false); // delete respawn time for this creature PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN); stmt->setUInt64(0, spawnId); stmt->setUInt16(1, m_PvP->GetMap()->GetId()); stmt->setUInt32(2, 0); // instance id, always 0 for world maps CharacterDatabase.Execute(stmt); sObjectMgr->DeleteCreatureData(spawnId); m_CreatureTypes[m_Creatures[type]] = 0; m_Creatures[type] = 0; return true; }
bool OPvPCapturePoint::DelCreature(uint32 type) { if (!m_Creatures[type]) { TC_LOG_DEBUG(LOG_FILTER_OUTDOORPVP, "opvp creature type %u was already deleted", type); return false; } Creature* cr = HashMapHolder<Creature>::Find(m_Creatures[type]); if (!cr) { // can happen when closing the core m_Creatures[type] = 0; return false; } TC_LOG_DEBUG(LOG_FILTER_OUTDOORPVP, "deleting opvp creature type %u", type); uint32 guid = cr->GetDBTableGUIDLow(); // Don't save respawn time cr->SetRespawnTime(0); cr->RemoveCorpse(); // explicit removal from map // beats me why this is needed, but with the recent removal "cleanup" some creatures stay in the map if "properly" deleted // so this is a big fat workaround, if AddObjectToRemoveList and DoDelayedMovesAndRemoves worked correctly, this wouldn't be needed //if (Map* map = sMapMgr->FindMap(cr->GetMapId())) // map->Remove(cr, false); // delete respawn time for this creature PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN); stmt->setUInt32(0, guid); stmt->setUInt16(1, cr->GetMapId()); stmt->setUInt32(2, 0); // instance id, always 0 for world maps CharacterDatabase.Execute(stmt); cr->AddObjectToRemoveList(); sObjectMgr->DeleteCreatureData(guid); m_CreatureTypes[m_Creatures[type]] = 0; m_Creatures[type] = 0; return true; }
void MoveInLineOfSight(Unit* /*who*/) { if (!GridSearcherSucceeded) { FindChannelers(); if (Channelers.size() >= 6) { GridSearcherSucceeded = true; for (std::set<uint64>::iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr) { Creature* Channeler = (Unit::GetCreature(*me, *itr)); if (Channeler) { if (Channeler->isDead()) { Channeler->RemoveCorpse(); Channeler->Respawn(); Channeler->InterruptNonMeleeSpells(true); Channeler->RemoveAurasDueToSpell(SPELL_SHADE_SOUL_CHANNEL); } if (Channeler->IsAlive()) { Channeler->CastSpell(me, SPELL_SHADE_SOUL_CHANNEL, true); Channeler->CastSpell(me, SPELL_SHADE_SOUL_CHANNEL_2, true); Channeler->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Channeler->SetFacingToObject(me); } } } } else error_log("SD2 ERROR: No Channelers are stored in the list. This encounter will not work properly"); } }
bool ChatHandler::HandleCreatePetCommand(const char* /*args*/) { Player* player = m_session->GetPlayer(); Creature* creatureTarget = getSelectedCreature(); if (!creatureTarget || creatureTarget->isPet() || creatureTarget->GetTypeId() == TYPEID_PLAYER) { PSendSysMessage(LANG_SELECT_CREATURE); SetSentErrorMessage(true); return false; } CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(creatureTarget->GetEntry()); // Creatures with family 0 crashes the server if (cInfo->family == 0) { PSendSysMessage("This creature cannot be tamed. (family id: 0)."); SetSentErrorMessage(true); return false; } if (player->GetPetGUID()) { PSendSysMessage("You already have a pet"); SetSentErrorMessage(true); return false; } // Everything looks OK, create new pet Pet* pet = new Pet(player, HUNTER_PET); if (!pet->CreateBaseAtCreature(creatureTarget)) { delete pet; PSendSysMessage("Error 1"); return false; } creatureTarget->setDeathState(JUST_DIED); creatureTarget->RemoveCorpse(); creatureTarget->SetHealth(0); // just for nice GM-mode view pet->SetUInt64Value(UNIT_FIELD_CREATEDBY, player->GetGUID()); pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, player->getFaction()); if (!pet->InitStatsForLevel(creatureTarget->getLevel())) { sLog->outError("InitStatsForLevel() in EffectTameCreature failed! Pet deleted."); PSendSysMessage("Error 2"); delete pet; return false; } // prepare visual effect for levelup pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel()-1); pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true); // this enables pet details window (Shift+P) pet->InitPetCreateSpells(); pet->SetFullHealth(); pet->GetMap()->AddToMap(pet->ToCreature()); // visual effect for levelup pet->SetUInt32Value(UNIT_FIELD_LEVEL, creatureTarget->getLevel()); player->SetMinion(pet, true); pet->SavePetToDB(PET_SAVE_AS_CURRENT); player->PetSpellInitialize(); return true; }
void CreatePet(Player* player, Creature* creature, uint32 entry) { if (player->GetPet()) { player->GetSession()->SendNotification("You already have a pet!"); player->CLOSE_GOSSIP_MENU(); return; } Creature *creatureTarget = creature->SummonCreature(entry, player->GetPositionX(), player->GetPositionY() + 2, player->GetPositionZ(), player->GetOrientation(), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 500); if (!creatureTarget) return; Pet* pet = player->CreateTamedPetFrom(creatureTarget, 0); if (!pet) return; // kill original creature creatureTarget->setDeathState(JUST_DIED); creatureTarget->RemoveCorpse(); creatureTarget->SetHealth(0); pet->SetPower(POWER_HAPPINESS, 1048000); pet->SetTP(350); // prepare visual effect for levelup pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->getLevel() - 1); pet->GetMap()->Add(pet->ToCreature()); // visual effect for levelup pet->SetUInt32Value(UNIT_FIELD_LEVEL, player->getLevel()); if (!pet->InitStatsForLevel(player->getLevel())) sLog->outError("Pet Create fail: No init stats for pet with entry %u", entry); pet->UpdateAllStats(); player->SetMinion(pet, true); pet->SavePetToDB(PET_SAVE_AS_CURRENT); player->PetSpellInitialize(); // make sure player has all training spells player->learnSpell(27348); // bite player->learnSpell(28343); // charge player->learnSpell(27347); // claw player->learnSpell(27346); // cower player->learnSpell(23112); // dash player->learnSpell(23150); // dive player->learnSpell(35324); // fire breath player->learnSpell(24599); // furious howl player->learnSpell(35308); // gore player->learnSpell(25017); // lightning breath player->learnSpell(35391); // poison spit player->learnSpell(24455); // prowl player->learnSpell(27361); // scorpid poison player->learnSpell(27349); // screech player->learnSpell(26065); // spell shield player->learnSpell(27366); // thunderstomp player->learnSpell(35348); // warp player->learnSpell(27350); // arcane res player->learnSpell(27353); // shadow res player->learnSpell(27351); // fire res player->learnSpell(27352); // frost res player->learnSpell(27354); // nature res player->learnSpell(27362); // natural armor player->learnSpell(27364); // great stamina player->learnSpell(35700); // avoidance player->learnSpell(25077); // cobra reflexes player->CLOSE_GOSSIP_MENU(); player->GetSession()->SendAreaTriggerMessage("Pet tamed successfully."); }
void WorldSession::HandleSpellClick( WorldPacket & recv_data ) { uint64 guid; recv_data >> guid; if (_player->isInCombat()) // client prevent click and set different icon at combat state return; Creature *unit = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid); if (!unit || unit->isInCombat()) // client prevent click and set different icon at combat state return; if(!_player->IsWithinDistInMap(unit, 10)) return; // cheater? if(!unit->HasFlag(UNIT_NPC_FLAGS,UNIT_NPC_FLAG_SPELLCLICK)) return; uint32 vehicleId = 0; CreatureDataAddon const *cainfo = unit->GetCreatureAddon(); if(cainfo) vehicleId = cainfo->vehicle_id; // handled other (hacky) way to avoid overwriting auras if(vehicleId || unit->isVehicle()) { if(!unit->isAlive()) return; if(_player->GetVehicleGUID()) return; // create vehicle if no one present and kill the original creature to avoid double, triple etc spawns if(!unit->isVehicle()) { Vehicle *v = _player->SummonVehicle(unit->GetEntry(), unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), unit->GetOrientation(), vehicleId); if(!v) return; if(v->GetVehicleFlags() & VF_DESPAWN_NPC) { v->SetSpawnDuration(unit->GetRespawnDelay()*IN_MILISECONDS); unit->setDeathState(JUST_DIED); unit->RemoveCorpse(); unit->SetHealth(0); } unit = v; } if(((Vehicle*)unit)->GetVehicleData()) if(uint32 r_aura = ((Vehicle*)unit)->GetVehicleData()->req_aura) if(!_player->HasAura(r_aura)) return; _player->EnterVehicle((Vehicle*)unit, 0); } else { SpellClickInfoMapBounds clickPair = objmgr.GetSpellClickInfoMapBounds(unit->GetEntry()); for(SpellClickInfoMap::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr) { if (itr->second.IsFitToRequirements(_player)) { Unit *caster = (itr->second.castFlags & 0x1) ? (Unit*)_player : (Unit*)unit; Unit *target = (itr->second.castFlags & 0x2) ? (Unit*)_player : (Unit*)unit; caster->CastSpell(target, itr->second.spellId, true); } } } }