void Functions::getObjectType(Aurora::NWScript::FunctionContext &ctx) { ctx.getReturn() = (int32) kObjectTypeInvalid; Witcher::Object *object = Witcher::ObjectContainer::toObject(getParamObject(ctx, 0)); if (!object || ((uint32)object->getType() >= kObjectTypeMAX)) return; ctx.getReturn() = (int32) object->getType(); }
void ObjectContainer::removeObject(Witcher::Object &object) { lock(); _objects[object.getType()].remove(&object); ::Aurora::NWScript::ObjectContainer::removeObject(object); unlock(); }
void ObjectContainer::addObject(Witcher::Object &object) { lock(); ::Aurora::NWScript::ObjectContainer::addObject(object); _objects[object.getType()].push_back(&object); unlock(); }
void Functions::getNearestObject(Aurora::NWScript::FunctionContext &ctx) { ctx.getReturn() = (Aurora::NWScript::Object *) 0; Witcher::Object *target = Witcher::ObjectContainer::toObject(getParamObject(ctx, 1)); if (!target) return; // Bitfield of type(s) to check for uint32 type = ctx.getParams()[0].getInt(); // We want the nth nearest object size_t nth = MAX<int32>(ctx.getParams()[2].getInt() - 1, 0); Aurora::NWScript::ObjectSearch *search = _game->getModule().findObjects(); Aurora::NWScript::Object *object = 0; std::list<Object *> objects; while ((object = search->next())) { // Needs to be a valid object, not the target, but in the target's area Witcher::Object *witcherObject = Witcher::ObjectContainer::toObject(object); if (!witcherObject || (witcherObject == target) || (witcherObject->getArea() != target->getArea())) continue; // Ignore invalid object types const uint32 objectType = (uint32) witcherObject->getType(); if (objectType >= kObjectTypeMAX) continue; if (type & objectType) objects.push_back(witcherObject); } delete search; objects.sort(ObjectDistanceSort(*target)); std::list<Object *>::iterator it = objects.begin(); for (size_t n = 0; (n < nth) && (it != objects.end()); ++n) ++it; if (it != objects.end()) ctx.getReturn() = *it; }