Salut,
Se poate face și prin
quest, doar că trebuie să existe în surse un punct unde quest-ul să poată seta o variabilă pentru
pet (ex. un flag sau o valoare în affect / quest flag), iar apoi codul pickup să verifice acel flag.
Ai câteva variante:

Varianta 1 – Folosind quest flag global pentru pet
Poți salva în quest flag dacă un anumit vnum de pet are voie la pickup:
quest pet_pickup begin
state start begin
when 20095.use begin -- exemplu, item de summon pet
if pc.getqf("allow_pickup") == 1 then
say("Pet-ul tău are voie să ridice iteme.")
else
say("Acest pet nu poate ridica iteme.")
end
end
when 20349.chat."Activează pickup la pet" begin
say("Acum petul tău va putea ridica iteme.")
pc.setqf("allow_pickup", 1)
end
when 20349.chat."Dezactivează pickup la pet" begin
say("Petul tău nu mai are voie să ridice iteme.")
pc.setqf("allow_pickup", 0)
end
end
end
Apoi, în cod (în PetActor::Follow sau unde faci logica de pickup), verifici flag-ul:
if (quest::CQuestManager::instance().GetEventFlag("allow_pickup") != 1)
return false; // nu ridică
Dar
atenție: pc.getqf e pe jucător, nu pe fiecare pet în parte. Deci e global pentru caracter.

Varianta 2 – Flag pe fiecare vnum de pet
Poți face un quest care la spawn setează un affect sau un pet flag în DB:
quest pet_pickup_config begin
state start begin
function can_pickup(vnum)
-- doar aceste
pet-uri au voie
local allowed = { [53001] = true, [53002] = true, [53007] = true }
return allowed[vnum] or false
end
when login or pet.summon with pet.is_summoned() begin
local vnum = pet.get_vnum()
if pet_pickup_config.can_pickup(vnum) then
pc.setqf("pet_pickup_active", 1)
else
pc.setqf("pet_pickup_active", 0)
end
end
end
end
Și în cod, verifici pc.getqf("pet_pickup_active").

Varianta 3 – Direct în cod, dar configurat prin quest
Poți face un quest care scrie într-o
event flag globală lista de pet-uri ce pot ridica, iar în cod verifici acel flag. Exemplu:
when 20349.chat."Activează pickup pentru pet 53001" begin
game.set_event_flag("pet53001_pickup", 1)
end
when 20349.chat."Dezactivează pickup pentru pet 53001" begin
game.set_event_flag("pet53001_pickup", 0)
end
Și în cod, când verifici:
if (quest::CQuestManager::instance().GetEventFlag("pet" + std::to_string(vnum) + "_pickup") == 1)
{
// poate ridica
}
Dacă vrei să limitezi pickup-ul doar pentru anumite vnum-uri de pet, ai două variante:

Varianta 1 (mai curată): direct în surse
În PetSystem.cpp (sau unde e funcția CPetActor::Follow / Pickup), adaugi o listă cu vnum-urile care pot ridica:
bool CPetActor::Follow(float fMinDistance)
{
static const std::set<DWORD> pickupPets = {53001, 53002, 53007}; // vnum-urile permise
if (pickupPets.find(GetVnum()) == pickupPets.end()) {
return false; // dacă nu e în listă, nu ridică
}
// codul existent de follow + pickup
...
}
Asta e metoda recomandată, nu mai depinzi de quest.

Varianta 2: prin quest (dacă vrei flexibilitate)
Poți folosi un quest simplu care verifică la summon dacă petul este „allowed” și setează un flag pentru caracter:
quest pet_pickup_config begin
state start begin
function can_pickup(vnum)
local allowed = { [53001] = true, [53002] = true, [53007] = true }
return allowed[vnum] or false
end
when login or pet.summon with pet.is_summoned() begin
local vnum = pet.get_vnum()
if pet_pickup_config.can_pickup(vnum) then
pc.setqf("pet_pickup_allowed", 1)
else
pc.setqf("pet_pickup_allowed", 0)
end
end
end
end
Iar în codul pickup (C++), faci verificarea pe flag:
if (ch->GetQuestFlag("pet_pickup_allowed") != 1)
return false;
Ti-am explicat cam ce ar trebui sa faci, daca intampini probleme lasa REPLY
Succes !