bool Creature::setFollowCreature(Creature* creature, bool fullPathSearch /*= false*/) { if (creature) { if (followCreature == creature) { return true; } const Position& creaturePos = creature->getPosition(); if (creaturePos.z != getPosition().z || !canSee(creaturePos)) { followCreature = NULL; return false; } if (!listWalkDir.empty()) { listWalkDir.clear(); onWalkAborted(); } hasFollowPath = false; forceUpdateFollowPath = false; followCreature = creature; isUpdatingPath = true; } else { isUpdatingPath = false; followCreature = NULL; } onFollowCreature(creature); return true; }
void Creature::onWalk() { if (getWalkDelay() <= 0) { Direction dir; uint32_t flags = FLAG_IGNOREFIELDDAMAGE; if (getNextStep(dir, flags)) { ReturnValue ret = g_game.internalMoveCreature(this, dir, flags); if (ret != RETURNVALUE_NOERROR) { if (Player* player = getPlayer()) { player->sendCancelMessage(ret); player->sendCancelWalk(); } forceUpdateFollowPath = true; } } else { if (listWalkDir.empty()) { onWalkComplete(); } stopEventWalk(); } } if (cancelNextWalk) { listWalkDir.clear(); onWalkAborted(); cancelNextWalk = false; } if (eventWalk != 0) { eventWalk = 0; addEventWalk(); } }
void Creature::onWalk() { if(getWalkDelay() <= 0) { Direction dir; uint32_t flags = FLAG_IGNOREFIELDDAMAGE; if(!getNextStep(dir, flags)) { if(listWalkDir.empty()) onWalkComplete(); stopEventWalk(); } else if(g_game.internalMoveCreature(this, dir, flags) != RET_NOERROR) forceUpdateFollowPath = true; } if(cancelNextWalk) { cancelNextWalk = false; listWalkDir.clear(); onWalkAborted(); } if(eventWalk) { eventWalk = 0; addEventWalk(); } }
void Creature::stopEventWalk() { if(eventWalk != 0){ g_scheduler.stopEvent(eventWalk); eventWalk = 0; if(!listWalkDir.empty()){ listWalkDir.clear(); onWalkAborted(); } } }
void Creature::stopEventWalk() { if(!eventWalk) return; Scheduler::getInstance().stopEvent(eventWalk); eventWalk = 0; if(!listWalkDir.empty()) { listWalkDir.clear(); onWalkAborted(); } }