void FireworkObjectImplementation::completeLaunch(CreatureObject* player, int removeDelay) { ManagedReference<StaticObject*> launcherObject = (getZoneServer()->createObject(fireworkObject.hashCode(), 0)).castTo<StaticObject*>(); if (launcherObject == NULL) return; player->setPosture(CreaturePosture::CROUCHED); player->doAnimation("manipulate_low"); float angle = player->getDirectionAngle(); if (angle > 360) angle = angle - 360; float distance = 2.0; angle = 2 * M_PI * angle / 360; int x = player->getPositionX() + sin(angle) * (distance); int y = player->getPositionY() + cos(angle) * (distance); int z = player->getZone()->getHeight(x, y); Locker locker(launcherObject); launcherObject->initializePosition(x, z, y); player->getZone()->transferObject(launcherObject, -1, true); if (getUseCount() > 1) { decreaseUseCount(); } else { destroyObjectFromWorld(true); if (isPersistent()) destroyObjectFromDatabase(true); } Reference<FireworkRemoveEvent*> fireworkRemoveEvent = new FireworkRemoveEvent(player, launcherObject); fireworkRemoveEvent->schedule(removeDelay * 1000); }
int ConsumableImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { if (!isASubChildOf(player)) return 0; if (selectedID != 20) { return TangibleObjectImplementation::handleObjectMenuSelect(player, selectedID); } if (speciesRestriction == "pets") { player->sendSystemMessage("@error_message:pets_only"); //That food is only suitable for pets. return 0; } PlayerObject* ghost = player->getPlayerObject(); String raceName = player->getSpeciesName(); if ((speciesRestriction == "2" && raceName != "trandoshan") || (speciesRestriction == "4" && raceName != "wookiee")) { player->sendSystemMessage("@error_message:race_restriction"); //That food isn't edible by your species. return 0; } if (isSpice() && player->hasSpice()) { player->sendSystemMessage("@spice/spice:sys_already_spiced"); //You are already under the influence of spices. return 0; } if (player->hasBuff(buffCRC) && (!isAttributeEffect() || isForagedFood())) { player->sendSystemMessage("@combat_effects:already_affected"); //You are already under the influence of that food. Eating more won't enhance the effect. return 0; } if (player->isDead() || player->isIncapacitated()) return 0; int availfill = 0; if (ghost == NULL) return 1; if (isFood()) availfill = ghost->getFoodFillingMax() - ghost->getFoodFilling(); if (isDrink()) availfill = ghost->getDrinkFillingMax() - ghost->getDrinkFilling(); if (filling > availfill) { if (isFood()) player->sendSystemMessage("@error_message:full_food"); //You are too full to eat that. if (isDrink()) player->sendSystemMessage("@error_message:full_drink"); //You are too full to drink that. return 1; } ManagedReference<Buff*> buff = NULL; switch (effectType) { case EFFECT_ATTRIBUTE: { buff = new Buff(player, buffName.hashCode(), duration, BuffType::FOOD); setModifiers(buff, false); break; } case EFFECT_SKILL: { buff = new Buff(player, buffName.hashCode(), duration, BuffType::FOOD); setModifiers(buff, true); break; } case EFFECT_SPICE: { buff = new SpiceBuff(player, buffName, String("spice." + buffName + ".up").hashCode(), duration); setModifiers(buff, false); //buff->parseAttributeModifierString(modifierString); player->addBuff(buff); //useCharge(player); decreaseUseCount(); return 1; } case EFFECT_HEALING: { int dmghealed = player->healDamage(player, 6, nutrition); if (dmghealed <= 0) { player->sendSystemMessage("@healing:no_mind_to_heal_self"); //You have no mind to heal. return 0; } StringIdChatParameter stringId("combat_effects", "food_mind_heal"); stringId.setDI(dmghealed); player->sendSystemMessage(stringId); break; } case EFFECT_DURATION: { buff = new DurationBuff(player, buffName.hashCode(), duration); setModifiers(buff, true); //buff->parseSkillModifierString(generateModifierString()); break; } case EFFECT_DELAYED: { buff = new DelayedBuff(player, buffName.hashCode(), duration); setModifiers(buff, true); DelayedBuff* delayedBuff = cast<DelayedBuff*>(buff.get()); delayedBuff->init(&eventTypes); break; } case EFFECT_INSTANT: { if (modifiers.isEmpty()) return 0; //TODO: Handle each instant effect on its own... String effect = modifiers.elementAt(0).getKey(); if (effect == "burst_run") { //We need to reduce the cooldown and efficiency. player->executeObjectControllerAction(String("burstrun").hashCode()); if (player->hasBuff(String("burstrun").hashCode())) { float reduction = 1.f - ((float)nutrition / 100.f); player->updateCooldownTimer("burstrun", ((300 * reduction) + duration) * 1000); player->sendSystemMessage("@combat_effects:instant_burst_run"); //You instantly burst run at increased efficiency! Reference<Task*> task = player->getPendingTask("burst_run_notify"); if (task != NULL) task->reschedule(((300 * reduction) + duration) * 1000); else { task = new BurstRunNotifyAvailableEvent(player); player->addPendingTask("burst_run_notify", task, ((300 * reduction) + duration) * 1000); } } else { //Couldnt burst run yet. return 0; } } else if (effect == "food_reduce") { //Tilla till reduces food stomach filling by a percentage int currentfilling = ghost->getFoodFilling(); ghost->setFoodFilling(round(currentfilling * (100 - nutrition) / 100.0f), true); } } } if (buff != NULL) player->addBuff(buff); if (isFood()) ghost->setFoodFilling(ghost->getFoodFilling() + filling, true); if (isDrink()) ghost->setDrinkFilling(ghost->getDrinkFilling() + filling, true); StringIdChatParameter stringId("base_player", "prose_consume_item"); stringId.setTT(getObjectID()); player->sendSystemMessage(stringId);//player->sendSystemMessage("base_player", "prose_consume_item", objectID);; // Play the client effect sound depending on species/gender. // Get the species. int species = player->getSpecies(); switch (species) { case 0: // Human if (player->getGender() == 0) player->playEffect("clienteffect/human_male_eat.cef"); else if (player->getGender() == 1) player->playEffect("clienteffect/human_female_eat.cef"); break; case 2: // Trandoshan if (player->getGender() == 0) player->playEffect("clienteffect/reptile_male_eat.cef"); else if (player->getGender() == 1) player->playEffect("clienteffect/reptile_female_eat.cef"); break; case 4: // Wookiee if (player->getGender() == 0) player->playEffect("clienteffect/wookiee_male_eat.cef"); else if (player->getGender() == 1) player->playEffect("clienteffect/wookiee_female_eat.cef"); break; default: break; } //Consume a charge from the item, destroy it if it reaches 0 charges remaining. //useCharge(player); decreaseUseCount(); return 0; }
int VitalityPackImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { if (player == NULL) return 0; if (!isASubChildOf(player)) return 0; if (selectedID != 20) return TangibleObjectImplementation::handleObjectMenuSelect(player, selectedID); uint64 targetID = player->getTargetID(); ZoneServer* server = player->getZoneServer(); if (server == NULL) return 0; // Target must be a pet ManagedReference<TangibleObject*> target = server->getObject(targetID, true).castTo<TangibleObject*>(); if (target == NULL || !target->isPet() ) { player->sendSystemMessage("You can only use this to restore vitality to pets"); return 0; } ManagedReference<AiAgent*> pet = cast<AiAgent*>(target.get()); if( pet == NULL ) return 0; ManagedReference<PetControlDevice*> controlDevice = pet->getControlDevice().get().castTo<PetControlDevice*>(); if( controlDevice == NULL ) return 0; // Check pet type Locker crossLock(controlDevice, _this.getReferenceUnsafeStaticCast() ); if( controlDevice->getPetType() == PetManager::FACTIONPET ){ player->sendSystemMessage("You cannot use this to restore vitality to that type of pet"); return 0; } // Check owner uint64 ownerID = pet->getCreatureLinkID(); if ( ownerID != player->getObjectID()){ player->sendSystemMessage("You cannot revitalize another player's pet"); return 0; } // Check pet and player states if( pet->isInCombat() || pet->isDead() || pet->isIncapacitated() || player->isInCombat() || player->isDead() || player->isIncapacitated()){ player->sendSystemMessage("You can't restore vitality to your pet right now"); return 0; } // Check that some vitality has been lost if( controlDevice->getVitality() >= controlDevice->getMaxVitality() ){ player->sendSystemMessage("Pet is already at maximum vitality"); return 0; } // Calculate vitality loss int vitalityLost = controlDevice->getMaxVitality() - controlDevice->getVitality(); int vitalityLoss = 1; if (effectiveness < 45){ vitalityLoss += (vitalityLost / 9) + (vitalityLost / 13); } else if (effectiveness < 75) { vitalityLoss += (vitalityLost / 19) + (vitalityLost / 28); } else { vitalityLoss += (vitalityLost / 29) + (vitalityLost / 43); } vitalityLoss *= ((vitalityLost - 1) / effectiveness) + 1; if( vitalityLoss >= controlDevice->getMaxVitality() ){ vitalityLoss = controlDevice->getMaxVitality() - 1; } // Reduce max vitality controlDevice->setMaxVitality( controlDevice->getMaxVitality() - vitalityLoss ); // Restore vitality to new max controlDevice->setVitality( controlDevice->getMaxVitality() ); // Use a charge decreaseUseCount(); player->sendSystemMessage("You restore your pet to " + String::valueOf( controlDevice->getMaxVitality() ) + " vitality but it permanently lost " + String::valueOf( vitalityLoss ) + " vitality." ); return 0; }