Example #1
0
        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);
    }
Example #4
0
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;
}
Example #5
0
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);
    }
Example #11
0
    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;
    }
}
Example #13
0
		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;
    }
Example #15
0
		// 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();
			}
		}
Example #16
0
    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();
    }
Example #18
0
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();
    }
}
Example #19
0
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());
    }
}
Example #20
0
// 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;
}
Example #21
0
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;
}
Example #22
0
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;
}
Example #23
0
    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");
        }
    }
Example #24
0
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;
}
Example #25
0
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.");
}
Example #26
0
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);
            }
        }
    }
}