void Functions::getObjectByTag(Aurora::NWScript::FunctionContext &ctx) { ctx.getReturn() = (Aurora::NWScript::Object *) 0; Campaign *campaign = _game->getCampaigns().getCurrentCampaign(); if (!campaign) return; const Common::UString &tag = ctx.getParams()[0].getString(); if (tag.empty()) return; int nth = ctx.getParams()[1].getInt(); Aurora::NWScript::ObjectSearch *search = campaign->findObjectsByTag(tag); while (nth-- > 0) search->next(); ctx.getReturn() = search->get(); delete search; }
void Functions::UT_getNearestObjectByTag(Aurora::NWScript::FunctionContext &ctx) { ctx.getReturn() = (Aurora::NWScript::Object *) 0; Campaign *campaign = _game->getCampaigns().getCurrentCampaign(); if (!campaign) return; DragonAge::Object *target = DragonAge::ObjectContainer::toObject(getParamObject(ctx, 0)); if (!target) return; const Common::UString &tag = ctx.getParams()[1].getString(); if (tag.empty()) return; const bool includeSelf = ctx.getParams()[2].getInt() != 0; if (includeSelf && (target->getTag() == tag)) { ctx.getReturn() = (Aurora::NWScript::Object *) target; return; } Aurora::NWScript::ObjectSearch *search = campaign->findObjectsByTag(tag); Aurora::NWScript::Object *object = 0; std::list<Object *> objects; while ((object = search->next())) { // Needs to be a valid object and not the target DragonAge::Object *daObject = DragonAge::ObjectContainer::toObject(object); if (!daObject || (daObject == target)) continue; objects.push_back(daObject); } delete search; objects.sort(ObjectDistanceSort(*target)); if (!objects.empty()) ctx.getReturn() = (Aurora::NWScript::Object *) *objects.begin(); }
void Functions::getNearestObjectByTag(Aurora::NWScript::FunctionContext &ctx) { Campaign *campaign = _game->getCampaigns().getCurrentCampaign(); if (!campaign) return; DragonAge::Object *target = DragonAge::ObjectContainer::toObject(getParamObject(ctx, 0)); if (!target) return; const Common::UString &tag = ctx.getParams()[1].getString(); if (tag.empty()) return; // Bitfield of type(s) to check for const uint32 type = ctx.getParams()[2].getInt(); // We want the nth nearest object size_t count = MAX<int32>(ctx.getParams()[3].getInt(), 0); if (count == 0) return; Aurora::NWScript::Variable::Array &result = ctx.getReturn().getArray(); // TODO: nCheckLiving // TODO: nCheckPerceived const bool includeSelf = ctx.getParams()[6].getInt() != 0; if (includeSelf) { result.push_back(boost::make_shared<Aurora::NWScript::Variable>(target)); count--; } if (count == 0) return; Aurora::NWScript::ObjectSearch *search = campaign->findObjectsByTag(tag); Aurora::NWScript::Object *object = 0; std::list<Object *> objects; while ((object = search->next())) { // Needs to be a valid object and not the target DragonAge::Object *daObject = DragonAge::ObjectContainer::toObject(object); if (!daObject || (daObject == target)) continue; // Ignore invalid object types const uint32 objectType = (uint32) daObject->getType(); if (objectType >= kObjectTypeMAX) continue; if (type & objectType) objects.push_back(daObject); } delete search; objects.sort(ObjectDistanceSort(*target)); for (std::list<Object *>::iterator it = objects.begin(); it != objects.end() && count > 0; ++it, count--) result.push_back(boost::make_shared<Aurora::NWScript::Variable>(*it)); }