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)); } }
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); } }
void Troll::update() { if (!noWander) updateActor(this); }
void Golem::update() { if (!noWander) updateActor(this); }
void Thief::update() { if (!noWander) updateActor(this); }
void Dragon::update() { if (!noWander) updateActor(this); }
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)); } }