Exemple #1
0
void Actors::update (std::vector<std::pair<std::string, Ogre::Vector3> >& movement, float duration,
                     bool paused)
{
    mDuration += duration;

    if (mDuration>=0.25)
    {
        for (std::set<MWWorld::Ptr>::iterator iter (mActors.begin()); iter!=mActors.end(); ++iter)
        {
            updateActor (*iter, mDuration);

            if (iter->getTypeName()==typeid (ESM::NPC).name())
                updateNpc (*iter, mDuration, paused);
        }

        mDuration = 0;
    }

    for (std::set<MWWorld::Ptr>::iterator iter (mActors.begin()); iter!=mActors.end();
            ++iter)
    {
        Ogre::Vector3 vector = MWWorld::Class::get (*iter).getMovementVector (*iter);

        if (vector!=Ogre::Vector3::ZERO)
            movement.push_back (std::make_pair (iter->getRefData().getHandle(), vector));
    }
}
Exemple #2
0
    void Actors::update (float duration, bool paused)
    {
        mDuration += duration;

        //if (mDuration>=0.25)
        {
            float totalDuration = mDuration;
            mDuration = 0;

            for(PtrControllerMap::iterator iter(mActors.begin());iter != mActors.end();iter++)
            {
                const MWWorld::Class &cls = MWWorld::Class::get(iter->first);
                CreatureStats &stats = cls.getCreatureStats(iter->first);

                stats.setLastHitObject(std::string());
                if(!stats.isDead())
                {
                    if(iter->second->isDead())
                        iter->second->resurrect();

                    updateActor(iter->first, totalDuration);
                    if(iter->first.getTypeName() == typeid(ESM::NPC).name())
                        updateNpc(iter->first, totalDuration, paused);

                    if(!stats.isDead())
                        continue;
                }

                // workaround: always keep player alive for now
                // \todo remove workaround, once player death can be handled
                if(iter->first.getRefData().getHandle()=="player")
                {
                    MWMechanics::DynamicStat<float> stat(stats.getHealth());

                    if(stat.getModified()<1)
                    {
                        stat.setModified(1, 0);
                        stats.setHealth(stat);
                    }

                    stats.resurrect();
                    continue;
                }

                if(iter->second->isDead())
                    continue;

                iter->second->kill();

                ++mDeathCount[cls.getId(iter->first)];

                if(cls.isEssential(iter->first))
                    MWBase::Environment::get().getWindowManager()->messageBox("#{sKilledEssential}");
            }
        }

        if(!paused)
        {
            for(PtrControllerMap::iterator iter(mActors.begin());iter != mActors.end();++iter)
                iter->second->update(duration);
        }
    }
Exemple #3
0
void Troll::update()
{
    if (!noWander)
        updateActor(this);
}
Exemple #4
0
void Golem::update()
{
    if (!noWander)
        updateActor(this);
}
Exemple #5
0
void Thief::update()
{
    if (!noWander)
        updateActor(this);
}
Exemple #6
0
void Dragon::update()
{
    if (!noWander)
        updateActor(this);
}
Exemple #7
0
    void Actors::update (std::vector<std::pair<std::string, Ogre::Vector3> >& movement, float duration,
        bool paused)
    {
        mDuration += duration;

        if (mDuration>=0.25)
        {
            float totalDuration = mDuration;
            mDuration = 0;
            
            std::set<MWWorld::Ptr>::iterator iter (mActors.begin());

            while (iter!=mActors.end())
            {
                if (!MWWorld::Class::get (*iter).getCreatureStats (*iter).isDead())
                {
                    updateActor (*iter, totalDuration);

                    if (iter->getTypeName()==typeid (ESM::NPC).name())
                        updateNpc (*iter, totalDuration, paused);
                }

                if (MWWorld::Class::get (*iter).getCreatureStats (*iter).isDead())
                {
                    // workaround: always keep player alive for now
                    // \todo remove workaround, once player death can be handled
                    if (iter->getRefData().getHandle()=="player")
                    {
                        MWMechanics::DynamicStat<float> stat (
                            MWWorld::Class::get (*iter).getCreatureStats (*iter).getHealth());
                            
                        if (stat.getModified()<1)
                        {
                            stat.setModified (1, 0);
                            MWWorld::Class::get (*iter).getCreatureStats (*iter).setHealth (stat);
                        }

                        MWWorld::Class::get (*iter).getCreatureStats (*iter).resurrect();
                        ++iter;
                        continue;
                    }

                    ++mDeathCount[MWWorld::Class::get (*iter).getId (*iter)];

                    MWBase::Environment::get().getWorld()->playAnimationGroup (*iter, "death1", 0);

                    if (MWWorld::Class::get (*iter).isEssential (*iter))
                        MWBase::Environment::get().getWindowManager()->messageBox (
                            "#{sKilledEssential}", std::vector<std::string>());

                    mActors.erase (iter++);
                }
                else
                    ++iter;
            }
        }

        for (std::set<MWWorld::Ptr>::iterator iter (mActors.begin()); iter!=mActors.end();
            ++iter)
        {
            Ogre::Vector3 vector = MWWorld::Class::get (*iter).getMovementVector (*iter);

            if (vector!=Ogre::Vector3::ZERO)
                movement.push_back (std::make_pair (iter->getRefData().getHandle(), vector));
        }
    }