Esempio n. 1
0
uint32 OPvPWintergrasp::GetData(uint32 id)
{
    // if can build more vehicles
    if(SiegeWorkshop *workshop = GetWorkshopByEngGuid(id))
        return workshop->m_vehicles.size() < MAX_VEHICLE_PER_WORKSHOP ? 1 : 0;

    return 0;
}
Esempio n. 2
0
uint32 OPvPWintergrasp::GetData(uint32 id)
{
    // if can build more vehicles
    if (SiegeWorkshop *workshop = GetWorkshopByEngGuid(id))
        return CanBuildVehicle(workshop) ? 1 : 0;

    return 0;
}
Esempio n. 3
0
void OPvPWintergrasp::SetData(uint32 id, uint32 value)
{
    if(id == DATA_ENGINEER_DIE)
        if(SiegeWorkshop *workshop = GetWorkshopByEngGuid(value))
            workshop->DespawnAllVehicles();
}
Esempio n. 4
0
void OPvPWintergrasp::OnCreatureCreate(Creature *creature, bool add)
{
    uint32 entry = creature->GetEntry();
    if(creature->isVehicle()) // vehicles
    {
        TeamId team;
        if(creature->getFaction() == WintergraspFaction[TEAM_ALLIANCE])
            team = TEAM_ALLIANCE;
        else if(creature->getFaction() == WintergraspFaction[TEAM_HORDE])
            team = TEAM_HORDE;
        else
            return;

        switch(entry)
        {
            case 27881:
            case 28094:
            case 28312:
            case 32627:
                if(uint32 engLowguid = GUID_LOPART(creature->GetOwnerGUID()))
                {
                    if(SiegeWorkshop *workshop = GetWorkshopByEngGuid(engLowguid))
                    {
                        if(add)
                        {
                            if(workshop->m_vehicles.size() >= MAX_VEHICLE_PER_WORKSHOP)
                            {
                                creature->setDeathState(DEAD);
                                creature->SetRespawnTime(DAY);
                                return;
                            }
                            workshop->m_vehicles.insert((Vehicle*)creature);
                        }
                        // TODO: now you have to wait until the corpse of vehicle disappear to build a new one
                        else if(!workshop->m_vehicles.erase((Vehicle*)creature))
                            sLog.outError("OPvPWintergrasp::OnCreatureCreate: a vehicle is removed but it does not have record in workshop!");
                    }
                }
            //case 28366: tower
                if(add)
                {
                    m_vehicles[team].insert((Vehicle*)creature);
                    if(m_tenacityStack > 0)
                    {
                        if(team == TEAM_ALLIANCE)
                            creature->SetAuraStack(SPELL_TENACITY_VEHICLE, creature, m_tenacityStack);
                    }
                    else if(m_tenacityStack < 0)
                    {
                        if(team == TEAM_HORDE)
                            creature->SetAuraStack(SPELL_TENACITY_VEHICLE, creature, -m_tenacityStack);
                    }
                }
                else
                    m_vehicles[team].erase((Vehicle*)creature);                
                break;
        }
    }
    else if(m_creEntryPair.find(entry) != m_creEntryPair.end()) // guards and npc
    {
        if(add) m_creatures.insert(creature);
        else m_creatures.erase(creature);
    }
    else if(entry == CRE_ENG_A || entry == CRE_ENG_H) // demolisher engineers
    {
        for(OutdoorPvP::OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
            if(SiegeWorkshop *workshop = dynamic_cast<SiegeWorkshop*>(itr->second))
                if(workshop->m_engGuid == creature->GetDBTableGUIDLow())
                {
                    workshop->m_engineer = add ? creature : NULL;
                    break;
                }
    }
}
Esempio n. 5
0
void OPvPWintergrasp::OnCreatureCreate(Creature *creature, bool add)
{
    uint32 entry = creature->GetEntry();
    switch(GetCreatureType(entry))
    {
        case CREATURE_SIEGE_VEHICLE:
        {
            if (!creature->isSummon())
                return;

            TeamId team;
            if (add)
            {
                if (creature->getFaction() == WintergraspFaction[TEAM_ALLIANCE])
                    team = TEAM_ALLIANCE;
                else if (creature->getFaction() == WintergraspFaction[TEAM_HORDE])
                    team = TEAM_HORDE;
                else
                    return;

                if (uint32 engLowguid = GUID_LOPART(((TempSummon*)creature)->GetSummonerGUID()))
                {
                    if (SiegeWorkshop *workshop = GetWorkshopByEngGuid(engLowguid))
                    {
                        if (CanBuildVehicle(workshop))
                        {
                            m_vehicles[team].insert(creature);
                            //workshop->m_vehicles.insert(creature);
                        }
                        else
                        {
                            creature->setDeathState(DEAD);
                            creature->SetRespawnTime(DAY);
                            return;
                        }
                    }
                }

                if (m_tenacityStack > 0)
                {
                    if (team == TEAM_ALLIANCE)
                        creature->SetAuraStack(SPELL_TENACITY_VEHICLE, creature, m_tenacityStack);
                }
                else if (m_tenacityStack < 0)
                {
                    if (team == TEAM_HORDE)
                        creature->SetAuraStack(SPELL_TENACITY_VEHICLE, creature, -m_tenacityStack);
                }
            }
            else // the faction may be changed in uncharm
            {
                // TODO: now you have to wait until the corpse of vehicle disappear to build a new one
                if (m_vehicles[TEAM_ALLIANCE].erase(creature))
                    team = TEAM_ALLIANCE;
                else if (m_vehicles[TEAM_HORDE].erase(creature))
                    team = TEAM_HORDE;
                else
                    return;
            }
            SendUpdateWorldState(VehNumWorldState[team], m_vehicles[team].size());
            break;
        }
        case CREATURE_ENGINEER:
            for (OutdoorPvP::OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
            {
                if (SiegeWorkshop *workshop = dynamic_cast<SiegeWorkshop*>(itr->second))
                    if (workshop->m_engGuid == creature->GetDBTableGUIDLow())
                    {
                        workshop->m_engineer = add ? creature : NULL;
                        break;
                    }
            }
            break;
        default:
            if (m_creEntryPair.find(entry) != m_creEntryPair.end()) // guards and npc
            {
                if (add) m_creatures.insert(creature);
                else m_creatures.erase(creature);
            }
            break;
    }
}