void Creature::onThink(uint32_t interval) { if (!isMapLoaded && useCacheMap()) { isMapLoaded = true; updateMapCache(); } if (followCreature && master != followCreature && !canSeeCreature(followCreature)) { onCreatureDisappear(followCreature, false); } if (attackedCreature && master != attackedCreature && !canSeeCreature(attackedCreature)) { onCreatureDisappear(attackedCreature, false); } blockTicks += interval; if (blockTicks >= 1000) { blockCount = std::min<uint32_t>(blockCount + 1, 2); blockTicks = 0; } if (followCreature) { walkUpdateTicks += interval; if (forceUpdateFollowPath || walkUpdateTicks >= 2000) { walkUpdateTicks = 0; forceUpdateFollowPath = false; isUpdatingPath = true; } } if (isUpdatingPath) { isUpdatingPath = false; goToFollowCreature(); } //scripting event - onThink const CreatureEventList& thinkEvents = getCreatureEvents(CREATURE_EVENT_THINK); for (CreatureEvent* thinkEvent : thinkEvents) { thinkEvent->executeOnThink(this, interval); } }
void Creature::onThink(uint32_t interval) { if(!isMapLoaded && useCacheMap()){ isMapLoaded = true; updateMapCache(); } if(followCreature && getMaster() != followCreature && !canSeeCreature(followCreature)){ internalCreatureDisappear(followCreature, false); } if(attackedCreature && getMaster() != attackedCreature && !canSeeCreature(attackedCreature)){ internalCreatureDisappear(attackedCreature, false); } blockTicks += interval; if(blockTicks >= 1000){ blockCount = std::min((uint32_t)blockCount + 1, (uint32_t)2); blockTicks = 0; } if(followCreature){ walkUpdateTicks += interval; if(forceUpdateFollowPath || walkUpdateTicks >= 2000){ walkUpdateTicks = 0; forceUpdateFollowPath = false; isUpdatingPath = true; } } if(isUpdatingPath){ isUpdatingPath = false; getPathToFollowCreature(); } onAttacking(interval); executeConditions(interval); g_game.onCreatureThink(this, interval); }
int32_t Creature::getWalkCache(const Position& pos) const { if(!useCacheMap()) return 2; const Position& myPos = getPosition(); if(myPos.z != pos.z) return 0; if(pos == myPos) return 1; int32_t dx = pos.x - myPos.x, dy = pos.y - myPos.y; if((std::abs(dx) <= (mapWalkWidth - 1) / 2) && (std::abs(dy) <= (mapWalkHeight - 1) / 2)) { int32_t x = (mapWalkWidth - 1) / 2 + dx, y = (mapWalkHeight - 1) / 2 + dy; #ifdef __DEBUG__ //testing Tile* tile = g_game.getTile(pos); if(tile && (tile->__queryAdd(0, this, 1, FLAG_PATHFINDING | FLAG_IGNOREFIELDDAMAGE) == RET_NOERROR)) { if(!localMapCache[y][x]) std::clog << "Wrong cache value" << std::endl; } else if(localMapCache[y][x]) std::clog << "Wrong cache value" << std::endl; #endif if(localMapCache[y][x]) return 1; return 0; } //out of range return 2; }