void PetControlDeviceImplementation::trainAsMount(CreatureObject* player) { if (isTrainedAsMount()) return; PetManager* petManager = player->getZoneServer()->getPetManager(); if (petManager == NULL) return; if (petManager->checkMountEligibility(_this.get()) != PetManager::CANBEMOUNTTRAINED) return; ManagedReference<TangibleObject*> controlledObject = this->controlledObject.get(); if (controlledObject == NULL || !controlledObject->isAiAgent()) return; AiAgent* pet = cast<AiAgent*>(controlledObject.get()); if( pet == NULL ) return; trainedAsMount = true; pet->setOptionsBitmask(0x1080); }
void PetControlDeviceImplementation::trainAsMount(CreatureObject* player) { if (isTrainedAsMount() || !player->hasSkill("outdoors_creaturehandler_support_04")) return; PetManager* petManager = player->getZoneServer()->getPetManager(); if (petManager == NULL) return; if (petManager->checkMountEligibility(_this.getReferenceUnsafeStaticCast()) != PetManager::CANBEMOUNTTRAINED) return; ManagedReference<TangibleObject*> controlledObject = this->controlledObject.get(); if (controlledObject == NULL || !controlledObject->isAiAgent()) return; AiAgent* pet = cast<AiAgent*>(controlledObject.get()); if( pet == NULL ) return; assert(pet->isLockedByCurrentThread()); trainedAsMount = true; pet->setOptionBit(0x1000); }
bool PetControlDeviceImplementation::growPet(CreatureObject* player, bool force, bool adult) { if (petType != PetManager::CREATUREPET) return true; if (growthStage <= 0 || growthStage >= 10) return true; ManagedReference<TangibleObject*> controlledObject = this->controlledObject.get(); if (controlledObject == NULL || !controlledObject->isCreature()) return true; ManagedReference<Creature*> pet = cast<Creature*>(controlledObject.get()); ManagedReference<CreatureTemplate*> creatureTemplate = pet->getCreatureTemplate(); if (creatureTemplate == NULL) return true; PetManager* petManager = pet->getZoneServer()->getPetManager(); if (petManager == NULL) return true; Time currentTime; uint32 timeDelta = currentTime.getTime() - lastGrowth.getTime(); int stagesToGrow = timeDelta / 43200; // 12 hour if (adult) stagesToGrow = 10; if (stagesToGrow == 0 && !force) return true; int newStage = growthStage + stagesToGrow; if (newStage > 10) newStage = 10; float newLevel = ((float)pet->getAdultLevel() / 10.0) * (float)newStage; if (newLevel < 1) newLevel = 1; float newHeight = creatureTemplate->getScale() * (0.46 + ((float)newStage * 0.06)); short preEligibility = petManager->checkMountEligibility(_this.getReferenceUnsafeStaticCast()); short postEligibility = petManager->checkMountEligibility(_this.getReferenceUnsafeStaticCast(), newHeight); assert(pet->isLockedByCurrentThread()); if (preEligibility == PetManager::CANBEMOUNTTRAINED && postEligibility == PetManager::TOOLARGE && !force) { if (isTrainedAsMount()) { arrestGrowth(); return true; } PlayerObject* ghost = player->getPlayerObject(); if (ghost == NULL){ return true; } ManagedReference<SuiListBox*> box = new SuiListBox(player, SuiWindowType::MOUNT_GROWTH_ARREST); box->setPromptTitle("@pet/pet_menu:mount_growth_title"); // Pet Growth Arrest box->setPromptText("@pet/pet_menu:mount_growth_prompt"); // Your pet could be trained as a mount, but is about to grow too large to serve as one. If you ever plan on training this pet as a mount you must arrest it's growth now. Stop pet's growth? box->setUsingObject(_this.getReferenceUnsafeStaticCast()); box->setCancelButton(true, "@cancel"); box->setOkButton(true, "@yes"); box->setOtherButton(true, "@no"); box->setCallback(new MountGrowthArrestSuiCallback(player->getZoneServer(), _this.getReferenceUnsafeStaticCast())); ghost->addSuiBox(box); player->sendMessage(box->generateMessage()); return false; } if (adult) pet->setHeight(newHeight, true); else pet->setHeight(newHeight, false); pet->setPetLevel(newLevel); growthStage = newStage; lastGrowth.updateToCurrentTime(); setVitality(getVitality()); return true; }