std::string Player::getSaveText() const { std::ostringstream oss; std::string objectName = "thePlayer"; oss << "-- General status attributes" << std::endl; oss << "local " << objectName << " = DawnInterface.getPlayer();" << std::endl; oss << objectName << ":setStrength( " << getStrength() << " );" << std::endl; oss << objectName << ":setDexterity( " << getDexterity() << " );" << std::endl; oss << objectName << ":setVitality( " << getVitality() << " );" << std::endl; oss << objectName << ":setIntellect( " << getIntellect() << " );" << std::endl; oss << objectName << ":setWisdom( " << getWisdom() << " );" << std::endl; oss << objectName << ":setMaxHealth( " << getMaxHealth() << " );" << std::endl; oss << objectName << ":setMaxMana( " << getMaxMana() << " );" << std::endl; oss << objectName << ":setMaxFatigue( " << getMaxFatigue() << " );" << std::endl; oss << objectName << ":setMinDamage( " << getMinDamage() << " );" << std::endl; oss << objectName << ":setMaxDamage( " << getMaxDamage() << " );" << std::endl; // don't set activity textures here. That is determined by class of Player / NPC oss << objectName << ":setDamageModifierPoints( " << getDamageModifierPoints() << " );" << std::endl; oss << objectName << ":setHitModifierPoints( " << getHitModifierPoints() << " );" << std::endl; oss << objectName << ":setEvadeModifierPoints( " << getEvadeModifierPoints() << " );" << std::endl; oss << objectName << ":setParryModifierPoints( " << getParryModifierPoints() << " );" << std::endl; oss << objectName << ":setBlockModifierPoints( " << getBlockModifierPoints() << " );" << std::endl; oss << objectName << ":setMeleeCriticalModifierPoints( " << getMeleeCriticalModifierPoints() << " );" << std::endl; oss << objectName << ":setResistAllModifierPoints( " << getResistAllModifierPoints() << " );" << std::endl; oss << objectName << ":setSpellEffectAllModifierPoints( " << getSpellEffectAllModifierPoints() << " );" << std::endl; for( size_t curElement=0; curElement<static_cast<size_t>(ElementType::Count); ++curElement ) { ElementType::ElementType curElementType = static_cast<ElementType::ElementType>(curElement); oss << objectName << ":setResistElementModifierPoints( " << curElementType << ", " << getResistElementModifierPoints( curElementType ) << " );" << std::endl; oss << objectName << ":setSpellEffectElementModifierPoints( " << curElementType << ", " << getSpellEffectElementModifierPoints( curElementType ) << " );" << std::endl; } oss << objectName << ":setSpellCriticalModifierPoints( " << getSpellCriticalModifierPoints() << " );" << std::endl; oss << objectName << ":setName( \"" << getName() << "\" );" << std::endl; // string stream doesn't seem to have a proper overload for uint8_t and makes it the 0-character, so cast to size_t oss << objectName << ":setLevel( " << static_cast<size_t>(getLevel()) << " );" << std::endl; oss << objectName << ":setExperience( " << getExperience() << " );" << std::endl; oss << objectName << ":setClass( CharacterClass." << getClassName() << " );" << std::endl; oss << "-- coins" << std::endl; oss << objectName << ":setCoins( " << getCoins() << " );" << std::endl; oss << "-- position" << std::endl; oss << objectName << ":setPosition( " << getXPos() << ", " << getYPos() << " );" << std::endl; // no current attributes are set here because after reloading the player is completely refreshed again return oss.str(); }
void PetControlDeviceImplementation::arrestGrowth() { if (petType != PetManager::CREATUREPET) return; if (growthStage <= 0 || growthStage >= 10) return; ManagedReference<TangibleObject*> controlledObject = this->controlledObject.get(); if (controlledObject == NULL || !controlledObject->isCreature()) return; ManagedReference<Creature*> pet = cast<Creature*>(controlledObject.get()); ManagedReference<CreatureTemplate*> creatureTemplate = pet->getCreatureTemplate(); if (creatureTemplate == NULL) return; PetManager* petManager = pet->getZoneServer()->getPetManager(); if (petManager == NULL) return; int newStage = growthStage; for (int i = (growthStage + 1); i < 11; i++) { float newHeight = creatureTemplate->getScale() * (0.46 + ((float)i * 0.06)); short mountEligibility = petManager->checkMountEligibility(_this.getReferenceUnsafeStaticCast(), newHeight); if (mountEligibility == PetManager::TOOLARGE) break; else if (mountEligibility == PetManager::CANBEMOUNTTRAINED) newStage = i; } if (newStage > growthStage) { float newLevel = ((float)pet->getAdultLevel() / 10.0) * (float)newStage; if (newLevel < 1) newLevel = 1; float newHeight = creatureTemplate->getScale() * (0.46 + ((float)newStage * 0.06)); pet->setHeight(newHeight, false); pet->setPetLevel(newLevel); } setVitality(getVitality()); growthStage = 10; lastGrowth.updateToCurrentTime(); }
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; }
bool Puppet::live() { Entity::live(); setHP(getVitality() * 3); }
uint16_t Player::getModifiedVitality() const { return getModifiedAttribute( inventory, this, getVitality(), &getItemVitalityHelper, &getSpellVitalityHelper, NON_NULLABLE_ATTRIBUTE_MIN ); }