void PetDeedImplementation::fillObjectMenuResponse(ObjectMenuResponse* menuResponse, CreatureObject* player) { DeedImplementation::fillObjectMenuResponse(menuResponse, player); if(isASubChildOf(player)) menuResponse->addRadialMenuItem(20, 3, "@pet/pet_menu:menu_tame"); // Bio engineers can sample a deed if(player->hasSkill("outdoors_bio_engineer_novice") && isASubChildOf(player)) menuResponse->addRadialMenuItem(21, 3, "@sui:harvest_dna"); }
int FsBuffItemImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { if (!isASubChildOf(player)) return 0; if (selectedID == 68) { uint32 buffCRC = getBuffCRC(); if (player->hasBuff(buffCRC)) { player->sendSystemMessage("@quest/force_sensitive/utils:have_buff"); return 0; } if (!player->checkCooldownRecovery("fs_buff_item_" + BuffAttribute::getName(buffAttribute))) { player->sendSystemMessage("@quest/force_sensitive/utils:timer_not_up"); return 0; } Reference<Buff*> buff = new Buff(player, buffCRC, buffDuration, BuffType::MEDICAL); Locker locker(buff); buff->setAttributeModifier(buffAttribute, buffValue); player->addBuff(buff); player->sendSystemMessage("@quest/force_sensitive/utils:buff_applied"); player->addCooldown("fs_buff_item_" + BuffAttribute::getName(buffAttribute), reuseTime); } return 1; }
void JukeboxImplementation::fillObjectMenuResponse(ObjectMenuResponse* menuResponse, CreatureObject* player) { ManagedReference<CreatureObject*> perkOwner = getOwner().get(); PlayerObject* playerObject = player->getPlayerObject(); if (playerObject == NULL) return; if ((perkOwner != NULL && perkOwner == player) || playerObject->isPrivileged()) { TangibleObjectImplementation::fillObjectMenuResponse(menuResponse, player); menuResponse->addRadialMenuItem(132, 3, "@event_perk:mnu_show_exp_time"); // Show Expiration Time } if (!isASubChildOf(player)) { menuResponse->addRadialMenuItem(68, 3, "@event_perk:jukebox_operate"); menuResponse->addRadialMenuItemToRadialID(68, 69, 3, "@event_perk:jukebox_start_music"); menuResponse->addRadialMenuItemToRadialID(68, 70, 3, "@event_perk:jukebox_stop_music"); if (playerObject->isPrivileged() && player->getParentID() == 0) { menuResponse->addRadialMenuItem(72, 3, "Staff Functionality"); menuResponse->addRadialMenuItemToRadialID(72, 73, 3, "@ui_radial:item_pickup"); } } else { if (playerObject->isPrivileged() && player->getParentID() == 0) { menuResponse->addRadialMenuItem(72, 3, "Staff Functionality"); menuResponse->addRadialMenuItemToRadialID(72, 73, 3, "@ui_radial:item_drop"); } } }
void EventPerkDeedImplementation::fillObjectMenuResponse(ObjectMenuResponse* menuResponse, CreatureObject* player) { DeedImplementation::fillObjectMenuResponse(menuResponse, player); if(isASubChildOf(player)) { menuResponse->addRadialMenuItem(20, 3, "@event_perk:use_event_perk"); // Deploy Rental } }
bool TangibleObjectImplementation::canRepair(CreatureObject* player) { if (player == NULL || !isASubChildOf(player)) return false; SceneObject* inventory = player->getSlottedObject("inventory"); if (inventory == NULL) return false; for (int i = 0; i < inventory->getContainerObjectsSize(); ++i) { ManagedReference<SceneObject*> item = inventory->getContainerObject(i); if(item->isRepairTool()) { Reference<RepairToolTemplate*> repairTemplate = cast<RepairToolTemplate*>(item->getObjectTemplate()); if (repairTemplate == NULL) { error("No RepairToolTemplate for: " + String::valueOf(item->getServerObjectCRC())); continue; } if (repairTemplate->getRepairType() & getGameObjectType()) { return true; } } } return false; }
int ResourceDeedImplementation::useObject(CreatureObject* creature) { if (creature == NULL) return 0; if (!isASubChildOf(creature)) return 0; ManagedReference<PlayerObject*> ghost = creature->getPlayerObject(); if (ghost == NULL || ghost->hasSuiBoxWindowType(SuiWindowType::FREE_RESOURCE)) { //ghost->closeSuiWindowType(SuiWindowType::FREE_RESOURCE); ghost->removeSuiBoxType(SuiWindowType::FREE_RESOURCE); return 0; } ManagedReference<ResourceManager*> resourceManager = server->getZoneServer()->getResourceManager(); ManagedReference<SuiListBox*> sui = new SuiListBox(creature, SuiWindowType::FREE_RESOURCE); sui->setUsingObject(_this.getReferenceUnsafeStaticCast()); sui->setCallback(new ResourceDeedSuiCallback(server->getZoneServer(), "Resource")); sui->setPromptTitle("@veteran:resource_title"); //Resources sui->setPromptText("@veteran:choose_class"); //Choose resource class sui->setOtherButton(true, "@back"); sui->setCancelButton(true, "@cancel"); sui->setOkButton(true, "@ok"); resourceManager->addNodeToListBox(sui, "resource"); ghost->addSuiBox(sui); creature->sendMessage(sui->generateMessage()); return 1; }
void VetHarvesterDeedImplementation::fillObjectMenuResponse(ObjectMenuResponse* menuResponse, CreatureObject* creature) { DeedImplementation::fillObjectMenuResponse(menuResponse, creature); if (!isASubChildOf(creature)) return; menuResponse->addRadialMenuItem(20, 3, "@ui_radial:convert_harvester"); //use }
void VehicleControlDeviceImplementation::spawnObject(CreatureObject* player) { ZoneServer* zoneServer = getZoneServer(); ManagedReference<TangibleObject*> controlledObject = this->controlledObject.get(); if (controlledObject == NULL) return; if (!isASubChildOf(player)) return; if (player->getParent() != NULL || player->isInCombat()) { player->sendSystemMessage("@pet/pet_menu:cant_call_vehicle"); // You can only unpack vehicles while Outside and not in Combat. return; } ManagedReference<TradeSession*> tradeContainer = player->getActiveSession(SessionFacadeType::TRADE).castTo<TradeSession*>(); if (tradeContainer != NULL) { server->getZoneServer()->getPlayerManager()->handleAbortTradeMessage(player); } controlledObject->initializePosition(player->getPositionX(), player->getPositionZ(), player->getPositionY()); ManagedReference<CreatureObject*> vehicle = NULL; if (controlledObject->isCreatureObject()) { vehicle = cast<CreatureObject*>(controlledObject.get()); vehicle->setCreatureLink(player); vehicle->setControlDevice(_this.getReferenceUnsafeStaticCast()); } Zone* zone = player->getZone(); if (zone == NULL) return; //controlledObject->insertToZone(player->getZone()); zone->transferObject(controlledObject, -1, true); Reference<VehicleDecayTask*> decayTask = new VehicleDecayTask(controlledObject); decayTask->execute(); if (vehicle != NULL && controlledObject->getServerObjectCRC() == 0x32F87A54) // Jetpack { controlledObject->setCustomizationVariable("/private/index_hover_height", 40, true); // Illusion of flying. player->executeObjectControllerAction(STRING_HASHCODE("mount"), controlledObject->getObjectID(), ""); // Auto mount. } updateStatus(1); if (vehicleControlObserver != NULL) player->dropObserver(ObserverEventType::STARTCOMBAT, vehicleControlObserver); }
int StructureDeedImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { if (selectedID == 20) { if (!isASubChildOf(player)) return 0; player->executeObjectControllerAction(String("placestructuremode").hashCode(), getObjectID(), ""); return 0; } return DeedImplementation::handleObjectMenuSelect(player, selectedID); }
int SurveyToolImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { PlayerObject* playerObject = player->getPlayerObject(); if(isASubChildOf(player)) { if (!playerObject->hasAbility("survey")) { player->sendSystemMessage("@error_message:insufficient_skill"); return 0; } if (selectedID == 20) { // use object if(getRange(player) == 0) { sendRangeSui(player); return 0; } Locker locker(_this.getReferenceUnsafeStaticCast()); ManagedReference<SurveySession*> session = player->getActiveSession(SessionFacadeType::SURVEY).castTo<SurveySession*>(); if(session == NULL) { session = new SurveySession(player); session->initializeSession(_this.getReferenceUnsafeStaticCast()); } session->setOpenSurveyTool(_this.getReferenceUnsafeStaticCast()); ManagedReference<ResourceManager*> resourceManager = cast<ResourceManager*>(server->getZoneServer()->getResourceManager()); if(resourceManager == NULL) { error("null resource manager"); return 0; } resourceManager->sendResourceListForSurvey(player, getToolType(), getSurveyType()); return 0; } if (selectedID == 133) { // Set Tool Range sendRangeSui(player); return 0; } } return TangibleObjectImplementation::handleObjectMenuSelect(player, selectedID); }
int RecycleToolImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { Reference<PlayerObject*> playerObject = player->getPlayerObject(); if(isASubChildOf(player)) { SharedObjectTemplate* templateData = TemplateManager::instance()->getTemplate(_this.get()->getServerObjectCRC()); RecycleToolTemplate* recycleToolData = dynamic_cast<RecycleToolTemplate*>(templateData); Vector<String> resourceTypes = recycleToolData->getResourceTypes(); switch (selectedID) { case 245: break; case 246: setSelectedResource(toolType + 1); setSelectedTypeName(resourceTypes.get(0)); break; case 247: setSelectedResource(toolType + 2); setSelectedTypeName(resourceTypes.get(1)); break; case 248: setSelectedResource(toolType + 3); setSelectedTypeName(resourceTypes.get(2)); break; case 249: setSelectedResource(toolType + 4); setSelectedTypeName(resourceTypes.get(3)); break; case 250: setSelectedResource(toolType + 5); setSelectedTypeName(resourceTypes.get(4)); break; case 251: setSelectedResource(toolType + 6); setSelectedTypeName(resourceTypes.get(5)); break; } } return TangibleObjectImplementation::handleObjectMenuSelect(player, selectedID); }
int VetHarvesterDeedImplementation::useObject(CreatureObject* creature) { ManagedReference<PlayerObject*> ghost = creature->getPlayerObject(); ZoneServer *zone = creature->getZoneServer(); if(ghost == NULL || zone == NULL) return 0; if (!isASubChildOf(creature)) return 0; uint64 targetID = creature->getTargetID(); ManagedReference<TangibleObject*> targetObject = zone->getObject(targetID).castTo<TangibleObject*>(); if (targetObject == NULL || !targetObject->isHarvesterObject()) return 0; HarvesterObject *harvester = targetObject.castTo<HarvesterObject*>(); if(harvester == NULL || !harvester->isOwnerOf(creature)) return 0; if(harvester->isSelfPowered()) { creature->sendSystemMessage("@veteran:harvester_already_selfpowered"); return 0; } StringIdChatParameter messageBody("veteran", "harvester_converted"); // Your harvester %TT has been converted to use 0 power. messageBody.setTT(harvester); ManagedReference<ChatManager*> cman = zone->getChatManager(); cman->sendMail("system", "@veteran:harvester_converted_subject", messageBody, creature->getFirstName()); EXECUTE_TASK_1(harvester, { Locker locker(harvester_p); harvester_p->setSelfPowered(true); });
void VehicleControlDeviceImplementation::generateObject(CreatureObject* player) { if (player->isDead() || player->isIncapacitated()) return; if (!isASubChildOf(player)) return; if (player->getParent() != NULL || player->isInCombat()) { player->sendSystemMessage("@pet/pet_menu:cant_call_vehicle"); // You can only unpack vehicles while Outside and not in Combat. return; } ManagedReference<TangibleObject*> controlledObject = this->controlledObject.get(); if (controlledObject == NULL) return; if (controlledObject->isInQuadTree()) return; ManagedReference<TradeSession*> tradeContainer = player->getActiveSession(SessionFacadeType::TRADE).castTo<TradeSession*>(); if (tradeContainer != NULL) { server->getZoneServer()->getPlayerManager()->handleAbortTradeMessage(player); } if(player->getPendingTask("call_mount") != NULL) { StringIdChatParameter waitTime("pet/pet_menu", "call_delay_finish_vehicle"); Time nextExecution; Core::getTaskManager()->getNextExecutionTime(player->getPendingTask("call_mount"), nextExecution); int timeLeft = (nextExecution.getMiliTime() / 1000) - System::getTime(); waitTime.setDI(timeLeft); player->sendSystemMessage(waitTime); return; } ManagedReference<SceneObject*> datapad = player->getSlottedObject("datapad"); if (datapad == NULL) return; int currentlySpawned = 0; for (int i = 0; i < datapad->getContainerObjectsSize(); ++i) { ManagedReference<SceneObject*> object = datapad->getContainerObject(i); if (object->isVehicleControlDevice()) { VehicleControlDevice* device = cast<VehicleControlDevice*>( object.get()); ManagedReference<SceneObject*> vehicle = device->getControlledObject(); if (vehicle != NULL && vehicle->isInQuadTree()) { if (++currentlySpawned > 2) player->sendSystemMessage("@pet/pet_menu:has_max_vehicle"); return; } } } if(player->getCurrentCamp() == NULL && player->getCityRegion() == NULL) { Reference<CallMountTask*> callMount = new CallMountTask(_this.getReferenceUnsafeStaticCast(), player, "call_mount"); StringIdChatParameter message("pet/pet_menu", "call_vehicle_delay"); message.setDI(15); player->sendSystemMessage(message); player->addPendingTask("call_mount", callMount, 15 * 1000); if (vehicleControlObserver == NULL) { vehicleControlObserver = new VehicleControlObserver(_this.getReferenceUnsafeStaticCast()); vehicleControlObserver->deploy(); } player->registerObserver(ObserverEventType::STARTCOMBAT, vehicleControlObserver); } else { Locker clocker(controlledObject, player); spawnObject(player); } }
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; }
int PetDeedImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { if (selectedID == 21) { if(generated || !player->hasSkill("outdoors_bio_engineer_novice") || !isASubChildOf(player)) return 1; if (player->isRidingMount()) { player->sendSystemMessage("You cannot sample DNA while mounted"); return 1; } if(player->getPendingTask("sampledeed") != NULL) { player->sendSystemMessage("@bio_engineer:harvest_dna_already_harvesting"); return 1; } int skillMod = player->getSkillMod("dna_harvesting"); if (skillMod < 1 || level > skillMod + 15) { player->sendSystemMessage("@bio_engineer:harvest_dna_skill_too_low"); return 1; } Locker clocker(_this.get()); ManagedReference<SampleDeedTask*> task = new SampleDeedTask(_this.get(), player); player->addPendingTask("sampledeed",task,0); return 0; } if (selectedID == 20) { if (generated || !isASubChildOf(player)) return 1; if (player->isInCombat() || player->getParentRecursively(SceneObjectType::BUILDING) != NULL) { player->sendSystemMessage("@pet/pet_menu:cant_call"); //You can only unpack vehicles while Outside and not in Combat. return 1; } ManagedReference<SceneObject*> datapad = player->getSlottedObject("datapad"); if (datapad == NULL) { player->sendSystemMessage("Datapad doesn't exist when trying to call pet"); return 1; } if (datapad->getContainerObjectsSize() >= datapad->getContainerVolumeLimit()) { player->sendSystemMessage("@faction_recruiter:datapad_full"); // Your datapad is full. You must first free some space. return 1; } // Does the player have room ManagedReference<PlayerManager*> playerManager = player->getZoneServer()->getPlayerManager(); int numberStored = 0; int maxStoredPets = playerManager->getBaseStoredCreaturePets() + player->getSkillMod("stored_pets"); for (int i = 0; i < datapad->getContainerObjectsSize(); ++i) { ManagedReference<SceneObject*> object = datapad->getContainerObject(i); if (object != NULL && object->isPetControlDevice()) { PetControlDevice* device = cast<PetControlDevice*>( object.get()); if (device->getPetType() == PetManager::CREATUREPET) { if (++numberStored >= maxStoredPets) { player->sendSystemMessage("@pet/pet_menu:sys_too_many_stored"); // There are too many pets stored in this container. Release some of them to make room for more. return 1; } } } } // Can the player control it ManagedReference<PlayerObject*> ghost = player->getPlayerObject(); int currentlySpawned = 0; int spawnedLevel = 0; int cLevel = level; int maxPets = player->getSkillMod("keep_creature"); int maxLevelofPets = player->getSkillMod("tame_level"); for (int i = 0; i < ghost->getActivePetsSize(); ++i) { ManagedReference<AiAgent*> object = ghost->getActivePet(i); if (object != NULL && object->isCreature()) { if (++currentlySpawned >= maxPets) { player->sendSystemMessage("@pet/pet_menu:too_many"); // You can't control any more pets. Store one first return 1; } spawnedLevel += object->getLevel(); if ((spawnedLevel + cLevel) > maxLevelofPets) { player->sendSystemMessage("Taming this pet would exceed your control level ability."); return 1; } } } Reference<CreatureManager*> creatureManager = player->getZone()->getCreatureManager(); if( creatureManager == NULL ){ player->sendSystemMessage("Internal Pet Deed Error #307"); return 1; } CreatureTemplateManager* creatureTemplateManager = CreatureTemplateManager::instance(); ManagedReference<CreatureTemplate*> petTemplate = creatureTemplateManager->getTemplate( mobileTemplate.hashCode() ); if (petTemplate == NULL) { player->sendSystemMessage("wrong pet template;mobileTemplate=[" + mobileTemplate + "]" ); return 1; } bool isVicious = petTemplate->getPvpBitmask() & CreatureFlag::AGGRESSIVE; if (level > 10 || isVicious) { if (!player->hasSkill("outdoors_creaturehandler_novice") || (level > maxLevelofPets)) { player->sendSystemMessage("@pet/pet_menu:sys_lack_skill"); // You lack the skill to be able to tame that creature. return 1; } if (isVicious && player->getSkillMod("tame_aggro") < 1) { player->sendSystemMessage("@pet/pet_menu:sys_lack_skill"); // You lack the skill to be able to tame that creature. return 1; } } // All checks complete, lets setup the control device and do it. ManagedReference<PetControlDevice*> controlDevice = (server->getZoneServer()->createObject(controlDeviceObjectTemplate.hashCode(), 1)).castTo<PetControlDevice*>(); if (controlDevice == NULL) { player->sendSystemMessage("wrong pet control device;controlDevice=[" + controlDeviceObjectTemplate + "]" ); return 1; } Locker locker(controlDevice); String templateToSpawn = creatureManager->getTemplateToSpawn(mobileTemplate.hashCode()); ManagedReference<CreatureObject*> creatureObject = creatureManager->createCreature(templateToSpawn.hashCode(), true, 0 ); if( creatureObject == NULL ) { controlDevice->destroyObjectFromDatabase(true); player->sendSystemMessage("wrong pet template;mobileTemplate=[" + mobileTemplate + "]" ); return 1; } Locker clocker(creatureObject, player); ManagedReference<Creature*> pet = creatureObject.castTo<Creature*>(); if( pet == NULL ) { controlDevice->destroyObjectFromDatabase(true); creatureObject->destroyObjectFromDatabase(true); player->sendSystemMessage("Internal Pet Deed Error #348" ); return 1; } ObjectManager* objectManager = server->getZoneServer()->getObjectManager(); pet->setPetDeed(_this.get()); pet->loadTemplateData( petTemplate ); pet->setCustomObjectName(StringIdManager::instance()->getStringId(*pet->getObjectName()), true); pet->createChildObjects(); pet->setBaby(false); // update base stats on the pet now // We will store the deed pointer to the aiagent before serialization // Copy color customization from deed to pet CustomizationVariables* customVars = getCustomizationVariables(); if( customVars != NULL ){ for (int i = 0; i < customVars->size(); ++i) { uint8 id = customVars->elementAt(i).getKey(); int16 val = customVars->elementAt(i).getValue(); String name = CustomizationIdManager::instance()->getCustomizationVariable(id); pet->setCustomizationVariable( name, val, true ); } } // then this is complete StringId s; s.setStringId(pet->getObjectName()->getFullPath()); controlDevice->setControlledObject(pet); controlDevice->setObjectName(s); controlDevice->setPetType(PetManager::CREATUREPET); controlDevice->setMaxVitality(100); controlDevice->setVitality(100); controlDevice->setGrowthStage(1); controlDevice->updateStatus(1); if (!datapad->transferObject(controlDevice, -1)) { controlDevice->destroyObjectFromDatabase(true); return 1; } datapad->broadcastObject(controlDevice, true); controlDevice->growPet(player,true); controlDevice->callObject(player); //Remove the deed from it's container. ManagedReference<SceneObject*> deedContainer = getParent().get(); if (deedContainer != NULL) { destroyObjectFromWorld(true); } generated = true; player->sendSystemMessage("@pet/pet_menu:device_added"); // "A control device has been added to your datapad." return 0; } return DeedImplementation::handleObjectMenuSelect(player, selectedID); }
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; }
void PetControlDeviceImplementation::callObject(CreatureObject* player) { if (player->isInCombat() || player->isDead() || player->isIncapacitated() || player->getPendingTask("tame_pet") != NULL) { player->sendSystemMessage("@pet/pet_menu:cant_call"); // You cannot call this pet right now. return; } if (player->isRidingMount()) { player->sendSystemMessage("@pet/pet_menu:mounted_call_warning"); // You cannot call a pet while mounted or riding a vehicle. return; } if (player->getParent() != NULL) { ManagedReference<SceneObject*> strongRef = player->getRootParent().get(); ManagedReference<BuildingObject*> building = NULL; if (strongRef != NULL) building = strongRef.castTo<BuildingObject*>(); if (building == NULL || building->isPrivateStructure()) { player->sendSystemMessage("@pet/pet_menu:private_house"); // You cannot call pets in a private building. return; } } if (!isASubChildOf(player)) return; ManagedReference<TangibleObject*> controlledObject = this->controlledObject.get(); if (controlledObject == NULL || !controlledObject->isAiAgent()) return; ManagedReference<AiAgent*> pet = cast<AiAgent*>(controlledObject.get()); ManagedReference<PlayerObject*> ghost = player->getPlayerObject(); if (ghost->hasActivePet(pet)) return; if (vitality <= 0) { player->sendSystemMessage("@pet/pet_menu:dead_pet"); // This pet is dead. Select DESTROY from the radial menu to delete this pet control device. return; } if (!pet->getCooldownTimerMap()->isPast("call_cooldown")) { if (petType == PetManager::DROIDPET) player->sendSystemMessage("@pet/droid_modules:droid_maint_on_maint_run"); //You cannot call that droid. It is currently on a maintenance run. else player->sendSystemMessage("@pet/pet_menu:cant_call"); // cant call pet right now return; } assert(pet->isLockedByCurrentThread()); unsigned int petFaction = pet->getFaction(); if (petFaction != 0) { if (player->getFaction() == 0) { StringIdChatParameter message("@faction_perk:prose_be_declared"); // You must be declared to a faction to use %TT. message.setTT(pet->getDisplayedName()); player->sendSystemMessage(message); return; } if (player->getFaction() != petFaction || ghost->getFactionStatus() == FactionStatus::ONLEAVE) { StringIdChatParameter message("@faction_perk:prose_be_declared_faction"); // You must be a declared %TO to use %TT. message.setTO(pet->getFactionString()); message.setTT(pet->getDisplayedName()); player->sendSystemMessage(message); return; } } if(player->getPendingTask("call_pet") != NULL) { StringIdChatParameter waitTime("pet/pet_menu", "call_delay_finish_pet"); // Already calling a Pet: Call will be finished in %DI seconds. Time nextExecution; Core::getTaskManager()->getNextExecutionTime(player->getPendingTask("call_pet"), nextExecution); int timeLeft = (nextExecution.getMiliTime() / 1000) - System::getTime(); waitTime.setDI(timeLeft); player->sendSystemMessage(waitTime); return; } if (!growPet(player)) return; if (petType == PetManager::CREATUREPET && !isValidPet(pet)) { ManagedReference<SuiMessageBox*> box = new SuiMessageBox(player,SuiWindowType::PET_FIX_DIALOG); box->setCallback(new PetFixSuiCallback(player->getZoneServer(), _this.getReferenceUnsafeStaticCast())); box->setPromptText("@bio_engineer:pet_sui_text"); box->setPromptTitle("@bio_engineer:pet_sui_title"); box->setOkButton(true,"@bio_engineer:pet_sui_fix_stats"); box->setCancelButton(true,"@bio_engineer:pet_sui_abort"); box->setOtherButton(true,"@bio_engineer:pet_sui_fix_level"); box->setUsingObject(_this.getReferenceUnsafeStaticCast()); player->getPlayerObject()->addSuiBox(box); player->sendMessage(box->generateMessage()); return; } int currentlySpawned = 0; int spawnedLevel = 0; int maxPets = 1; int maxLevelofPets = 10; int level = pet->getLevel(); if (petType == PetManager::CREATUREPET) { ManagedReference<Creature*> creaturePet = cast<Creature*>(pet.get()); if (creaturePet == NULL) return; bool ch = player->hasSkill("outdoors_creaturehandler_novice"); if (ch) { maxPets = player->getSkillMod("keep_creature"); maxLevelofPets = player->getSkillMod("tame_level"); } if (creaturePet->getAdultLevel() > maxLevelofPets) { player->sendSystemMessage("@pet/pet_menu:control_exceeded"); // Calling this pet would exceed your Control Level ability. return; } if (creaturePet->isVicious() && (player->getSkillMod("tame_aggro") <= 0 || !ch)) { player->sendSystemMessage("@pet/pet_menu:lack_skill"); // You lack the skill to call a pet of this type. return; } } else if (petType == PetManager::FACTIONPET){ maxPets = 3; } for (int i = 0; i < ghost->getActivePetsSize(); ++i) { ManagedReference<AiAgent*> object = ghost->getActivePet(i); if (object != NULL) { if (object->isCreature() && petType == PetManager::CREATUREPET) { ManagedReference<CreatureTemplate*> activePetTemplate = object->getCreatureTemplate(); if (activePetTemplate == NULL || activePetTemplate->getTemplateName() == "at_st") continue; if (++currentlySpawned >= maxPets) { player->sendSystemMessage("@pet/pet_menu:at_max"); // You already have the maximum number of pets of this type that you can call. return; } spawnedLevel += object->getLevel(); if ((spawnedLevel + level) > maxLevelofPets) { player->sendSystemMessage("@pet/pet_menu:control_exceeded"); // Calling this pet would exceed your Control Level ability. return; } } else if (object->isNonPlayerCreatureObject() && petType == PetManager::FACTIONPET) { if (++currentlySpawned >= maxPets) { player->sendSystemMessage("@pet/pet_menu:at_max"); // You already have the maximum number of pets of this type that you can call. return; } } else if (object->isCreature() && petType == PetManager::FACTIONPET) { ManagedReference<CreatureTemplate*> activePetTemplate = object->getCreatureTemplate(); ManagedReference<CreatureTemplate*> callingPetTemplate = pet->getCreatureTemplate(); if (activePetTemplate == NULL || callingPetTemplate == NULL || activePetTemplate->getTemplateName() != "at_st") continue; if (++currentlySpawned >= maxPets || (activePetTemplate->getTemplateName() == "at_st" && callingPetTemplate->getTemplateName() == "at_st")) { player->sendSystemMessage("@pet/pet_menu:at_max"); // You already have the maximum number of pets of this type that you can call. return; } } else if (object->isDroidObject() && petType == PetManager::DROIDPET) { if (++currentlySpawned >= maxPets) { player->sendSystemMessage("@pet/pet_menu:at_max"); // You already have the maximum number of pets of this type that you can call. return; } } } } ManagedReference<TradeSession*> tradeContainer = player->getActiveSession(SessionFacadeType::TRADE).castTo<TradeSession*>(); if (tradeContainer != NULL) { server->getZoneServer()->getPlayerManager()->handleAbortTradeMessage(player); } if(player->getCurrentCamp() == NULL && player->getCityRegion() == NULL) { Reference<CallPetTask*> callPet = new CallPetTask(_this.getReferenceUnsafeStaticCast(), player, "call_pet"); StringIdChatParameter message("pet/pet_menu", "call_pet_delay"); // Calling pet in %DI seconds. Combat will terminate pet call. message.setDI(15); player->sendSystemMessage(message); player->addPendingTask("call_pet", callPet, 15 * 1000); if (petControlObserver == NULL) { petControlObserver = new PetControlObserver(_this.getReferenceUnsafeStaticCast()); petControlObserver->deploy(); } player->registerObserver(ObserverEventType::STARTCOMBAT, petControlObserver); } else { // Player is in a city or camp, spawn pet immediately if( player->getCooldownTimerMap() == NULL ) return; // Check cooldown if( !player->getCooldownTimerMap()->isPast("petCallOrStoreCooldown") ){ player->sendSystemMessage("@pet/pet_menu:cant_call_1sec"); //"You cannot CALL for 1 second." return; } spawnObject(player); // Set cooldown player->getCooldownTimerMap()->updateToCurrentAndAddMili("petCallOrStoreCooldown", 1000); // 1 sec } EnqueuePetCommand* enqueueCommand = new EnqueuePetCommand(pet, String("petFollow").toLowerCase().hashCode(), String::valueOf(player->getObjectID()), player->getObjectID(), 1); enqueueCommand->execute(); }
void PetControlDeviceImplementation::spawnObject(CreatureObject* player) { ZoneServer* zoneServer = getZoneServer(); ManagedReference<TangibleObject*> controlledObject = this->controlledObject.get(); if (controlledObject == NULL) return; assert(controlledObject->isLockedByCurrentThread()); if (!isASubChildOf(player)) return; ManagedReference<TradeSession*> tradeContainer = player->getActiveSession(SessionFacadeType::TRADE).castTo<TradeSession*>(); if (tradeContainer != NULL) { server->getZoneServer()->getPlayerManager()->handleAbortTradeMessage(player); } controlledObject->initializePosition(player->getPositionX(), player->getPositionZ(), player->getPositionY()); ManagedReference<CreatureObject*> creature = NULL; if (controlledObject->isCreatureObject()) { creature = cast<CreatureObject*>(controlledObject.get()); creature->setCreatureLink(player); creature->setControlDevice(_this.getReferenceUnsafeStaticCast()); creature->setFaction(player->getFaction()); creature->setObjectMenuComponent("PetMenuComponent"); if (player->getPvpStatusBitmask() & CreatureFlag::PLAYER) creature->setPvpStatusBitmask(player->getPvpStatusBitmask() - CreatureFlag::PLAYER, true); else creature->setPvpStatusBitmask(player->getPvpStatusBitmask(), true); if (trainedAsMount && (creature->getOptionsBitmask() ^ 0x1000)) { creature->setOptionBit(0x1000); } } Zone* zone = player->getZone(); if (zone == NULL) return; ManagedReference<CellObject*> parent = player->getParent().get().castTo<CellObject*>(); if (parent != NULL) parent->transferObject(controlledObject, -1, true); else zone->transferObject(controlledObject, -1, true); updateStatus(1); if (petControlObserver != NULL) player->dropObserver(ObserverEventType::STARTCOMBAT, petControlObserver); AiAgent* pet = cast<AiAgent*>(creature.get()); if (pet == NULL) return; ManagedReference<PlayerObject*> ghost = player->getPlayerObject(); ghost->addToActivePets(pet); bool isDroid = false; if (pet->isDroidObject()) { DroidObject* droid = cast<DroidObject*>(pet); isDroid = true; if( droid == NULL ) return; // Sanity check that there aren't outstanding power/skill mod tasks droid->removePendingTask( "droid_power" ); droid->removePendingTask( "droid_skill_mod" ); droid->initDroidModules(); droid->onCall(); droid->loadSkillMods(player); // Submit new power task Reference<Task*> droidPowerTask = new DroidPowerTask( droid ); droid->addPendingTask("droid_power", droidPowerTask, 120000); // 2 min // Submit new skill mod task Reference<Task*> droidSkillModTask = new DroidSkillModTask( droid, player ); droid->addPendingTask("droid_skill_mod", droidSkillModTask, 3000); // 3 sec } pet->setHomeLocation(player->getPositionX(), player->getPositionZ(), player->getPositionY(), parent); pet->setNextStepPosition(player->getPositionX(), player->getPositionZ(), player->getPositionY(), parent); pet->clearPatrolPoints(); if (petType == PetManager::CREATUREPET) { pet->setCreatureBitmask(CreatureFlag::PET); } if (petType == PetManager::DROIDPET) { pet->setCreatureBitmask(CreatureFlag::DROID_PET); } if (petType == PetManager::FACTIONPET) { pet->setCreatureBitmask(CreatureFlag::FACTION_PET); /** dont know if npc faction pets trained via converse instead of radial if (pet->isNonPlayerCreatureObject() && pet->getDiet() != CreatureFlag::NONE) // show converse to npcs that eat food i.e. not atst pet->setOptionBit(OptionBitmask::CONVERSE,true); **/ } pet->activateLoad(""); pet->activateRecovery(); // Not training any commands trainingCommand = 0; clearPatrolPoints(); }
void TangibleObjectImplementation::repair(CreatureObject* player) { if(player == NULL || player->getZoneServer() == NULL) return; if(!isASubChildOf(player)) return; if (getConditionDamage() == 0) { player->sendSystemMessage("That item is not in need of repair."); return; } //Condition is unrepairable if ((getMaxCondition() - getConditionDamage()) <= 0) { StringIdChatParameter cantrepair("error_message", "sys_repair_unrepairable"); cantrepair.setTT(getDisplayedName()); player->sendSystemMessage(cantrepair); //%TT's condition is beyond repair even for your skills. return; } SceneObject* inventory = player->getSlottedObject("inventory"); if(inventory == NULL) return; ManagedReference<RepairTool*> repairTool = NULL; Reference<RepairToolTemplate*> repairTemplate = NULL; for(int i = 0; i < inventory->getContainerObjectsSize(); ++i) { ManagedReference<SceneObject*> item = inventory->getContainerObject(i); if(item->isRepairTool()) { repairTemplate = cast<RepairToolTemplate*>(item->getObjectTemplate()); if (repairTemplate == NULL) { error("No RepairToolTemplate for: " + String::valueOf(item->getServerObjectCRC())); return; } if(repairTemplate->getRepairType() & getGameObjectType()) { repairTool = cast<RepairTool*>(item.get()); break; } repairTemplate = NULL; } } if(repairTool == NULL) return; /// Luck Roll + Profession Mod(25) + Luck Tapes /// + Station Mod - BF /// Luck Roll int roll = System::random(100); int repairChance = roll; /// Profession Bonus if(player->hasSkill(repairTemplate->getSkill())) repairChance += 35; /// Get Skill mods repairChance += player->getSkillMod(repairTemplate->getSkillMod()); repairChance += player->getSkillMod("crafting_repair"); repairChance += player->getSkillMod("force_repair_bonus"); /// use tool quality to lower chances if bad tool float quality = 1.f - (((100.f - repairTool->getQuality()) / 2) / 100.f); repairChance *= quality; ManagedReference<PlayerManager*> playerMan = player->getZoneServer()->getPlayerManager(); /// Increase if near station if(playerMan->getNearbyCraftingStation(player, repairTemplate->getStationType()) != NULL) { repairChance += 15; } /// Subtract battle fatigue repairChance -= (player->getShockWounds() / 2); /// Subtract complexity repairChance -= (getComplexity() / 3); /// 5% random failure if(getMaxCondition() < 20 || roll < 5) repairChance = 0; if(roll > 95) repairChance = 100; String result = repairAttempt(repairChance); Locker locker(repairTool); repairTool->destroyObjectFromWorld(true); repairTool->destroyObjectFromDatabase(true); player->sendSystemMessage(result); }
int JukeboxImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { ManagedReference<CreatureObject*> perkOwner = getOwner().get(); bool isOwner = perkOwner != NULL && player == perkOwner; // Non owners cannot pick up if (selectedID == 10 && !isOwner) return 0; if (selectedID == 69) { if (isOwner) doMusicSelection(player); else playMusicToPlayer(player, curSong); } else if (selectedID == 70) { if (isOwner) stopPlaying(); else playMusicToPlayer(player, "sound/music_silence.snd"); } else if (selectedID == 132) { Time currentTime; uint32 timeDelta = currentTime.getMiliTime() - getPurchaseTime()->getMiliTime(); uint32 minutes = (EventPerkDeedTemplate::TIME_TO_LIVE - timeDelta) / 60000; StringIdChatParameter params("event_perk", "show_exp_time"); // This rental will expire in approximately %DI minutes. params.setDI(minutes); player->sendSystemMessage(params); return 0; } else if (selectedID == 10) { stopPlaying(); } else if (selectedID == 73) { PlayerObject* playerObject = player->getPlayerObject(); if (playerObject == NULL) return 0; if (playerObject->isPrivileged() && player->getParentID() == 0) { if (isASubChildOf(player)) { Zone* zone = player->getZone(); if (zone == NULL) return 0; ManagedReference<Jukebox*> jbox = _this.getReferenceUnsafeStaticCast(); jbox->initializePosition(player->getPositionX(), player->getPositionZ(), player->getPositionY()); jbox->setDirection(Math::deg2rad(player->getDirectionAngle())); zone->transferObject(jbox, -1, true); } else { stopPlaying(); ManagedReference<SceneObject*> inventory = player->getSlottedObject("inventory"); if (inventory == NULL) return 0; ManagedReference<Jukebox*> jbox = _this.getReferenceUnsafeStaticCast(); inventory->transferObject(jbox, -1, true, true); } } } return 0; }
int EventPerkDeedImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { if (selectedID == 20) { if (generated) { return 1; } Zone* zone = player->getZone(); if (zone == NULL) { return 1; } PlanetManager* planetManager = zone->getPlanetManager(); if (planetManager == NULL) { return 1; } EventPerkDeedTemplate* deedTemplate = cast<EventPerkDeedTemplate*>(getObjectTemplate()); if (deedTemplate == NULL) { return 1; } if (zone->getZoneName().contains("space_")) { player->sendSystemMessage("@event_perk:not_in_space"); // You may not deploy a Rental in space. Return to the ground first. return 1; } if (!deedTemplate->isAllowedZone(zone->getZoneName())) { player->sendSystemMessage("@event_perk:not_on_this_planet"); // You cannot deploy this rental on this planet. Examine the deed to determine the intended planet for this rental. return 1; } if (!isASubChildOf(player)) { player->sendSystemMessage("@event_perk:from_inventory_only"); // This rental must be in your inventory in order to be deployed. return 1; } if (player->getParent() != NULL) { player->sendSystemMessage("@event_perk:not_inside"); // You cannot deploy a Rental indoors. You must move outside. return 1; } if (player->isInCombat()) { player->sendSystemMessage("@event_perk:not_in_combat"); // You cannot deploy a Rental while in combat. return 1; } if (player->isSwimming()) { player->sendSystemMessage("@event_perk:not_while_swimming"); // You cannot deploy a Rental while swimming. return 1; } ManagedReference<CityRegion*> city = player->getCityRegion().get(); if (city != NULL) { if (city->isClientRegion()) { player->sendSystemMessage("@event_perk:not_in_municipal_zone"); // You may not place a Rental in a municipal zone. return 1; } if (city->isZoningEnabled() && !city->hasZoningRights(player->getObjectID())) { player->sendSystemMessage("@event_perk:no_zoning_rights"); // You must have zoning rights to place a Rental in this city. return 1; } } int x = player->getWorldPositionX(); int y = player->getWorldPositionY(); int nearbyPerks = 0; TerrainManager* terrainManager = planetManager->getTerrainManager(); if ( terrainManager == NULL || terrainManager->getHighestHeightDifference(x - 10, y - 10, x + 10, y + 10) > 15.0) { player->sendSystemMessage("@event_perk:bad_area"); // This rental could not be deployed due to the surrounding terrain. Please move to another area and try again. return 1; } SortedVector<ManagedReference<QuadTreeEntry* > >* closeObjects = player->getCloseObjects(); if (closeObjects == NULL) { error("Player has NULL closeObjectsVector in EventPerkDeedImplementation::handleObjectMenuSelect"); return 1; } for (int i = 0; i < closeObjects->size(); ++i) { SceneObject* obj = cast<SceneObject*>(closeObjects->get(i).get()); if (obj == NULL) { continue; } SharedObjectTemplate* objectTemplate = obj->getObjectTemplate(); if (objectTemplate == NULL) { continue; } float radius = objectTemplate->getNoBuildRadius(); if (obj->isLairObject() && player->isInRange(obj, radius)) { player->sendSystemMessage("@event_perk:too_close_lair"); // You cannot place a Rental this close to a lair. return 1; } if (obj->isCampStructure() && player->isInRange(obj, radius)) { player->sendSystemMessage("@event_perk:too_close_camp"); // You cannot place a Rental this close to a camp. return 1; } if (radius > 0 && player->isInRange(obj, radius)) { player->sendSystemMessage("@event_perk:too_close_something"); // You are too close to an object to deploy your Rental here. Move away from it. return 1; } if (objectTemplate->isSharedStructureObjectTemplate()) { if (StructureManager::instance()->isInStructureFootprint(cast<StructureObject*>(obj), x, y, 0)) { player->sendSystemMessage("@event_perk:too_close_building"); // You may not place a Rental this close to a building. return 1; } } if (obj->isEventPerk() && player->isInRange(obj, 32) && ++nearbyPerks > 2) { player->sendSystemMessage("@event_perk:too_many_perks"); // There are too many Rentals already deployed in this area. Please move to another location. return 1; } } SortedVector<ManagedReference<ActiveArea* > > activeAreas; zone->getInRangeActiveAreas(x, y, &activeAreas, true); for (int i = 0; i < activeAreas.size(); ++i) { ActiveArea* area = activeAreas.get(i); if (area->isNoBuildArea()) { player->sendSystemMessage("@event_perk:too_close_something"); // You are too close to an object to deploy your Rental here. Move away from it. return 1; } } if (planetManager->isInRangeWithPoi(x, y, 150)) { player->sendSystemMessage("@event_perk:too_close_something"); // You are too close to an object to deploy your Rental here. Move away from it. return 1; } if (perkType != EventPerkDeedTemplate::STATIC) { player->sendSystemMessage("This type of event perk deed is not functional yet."); return 1; } ManagedReference<TangibleObject*> object = generatedObject.get(); if (object == NULL) { object = (server->getZoneServer()->createObject(generatedObjectTemplate.hashCode(), "playerstructures", 1)).castTo<TangibleObject*>(); if (object == NULL) { player->sendSystemMessage("Error generating object. Wrong generatedObjectTemplate or is not a tangible object."); return 1; } generatedObject = object; } EventPerkDataComponent* data = cast<EventPerkDataComponent*>(object->getDataObjectComponent()->get()); if (data == NULL) { player->sendSystemMessage("Error: no dataObjectComponent."); object->destroyObjectFromDatabase(); return 1; } data->setDeed(_this.get()); object->initializePosition(player->getPositionX(), player->getPositionZ(), player->getPositionY()); object->setDirection(Math::deg2rad(player->getDirectionAngle())); zone->transferObject(object, -1, true); generated = true; destroyObjectFromWorld(true); return 0; } return DeedImplementation::handleObjectMenuSelect(player, selectedID); }
void DroidDeedImplementation::fillObjectMenuResponse(ObjectMenuResponse* menuResponse, CreatureObject* player) { DeedImplementation::fillObjectMenuResponse(menuResponse, player); if(isASubChildOf(player)) menuResponse->addRadialMenuItem(20, 3, "@pet/pet_menu:menu_unpack"); //"Ready Droid Unit" }
int DroidDeedImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { if (selectedID == 20) { if (generated || !isASubChildOf(player)) return 1; if (player->isInCombat() || player->isRidingMount() || player->isSwimming() || player->isDead() || player->isIncapacitated() ){ player->sendSystemMessage("@pet/pet_menu:cant_call"); // "You cannot call this pet right now." return 1; } ManagedReference<SceneObject*> datapad = player->getSlottedObject("datapad"); if (datapad == NULL) { player->sendSystemMessage("Datapad doesn't exist when trying to generate droid"); return 1; } // Check if this will exceed maximum number of droids allowed ManagedReference<PlayerManager*> playerManager = player->getZoneServer()->getPlayerManager(); int droidsInDatapad = 0; int maxStoredDroids = playerManager->getBaseStoredDroids(); for (int i = 0; i < datapad->getContainerObjectsSize(); i++) { Reference<SceneObject*> obj = datapad->getContainerObject(i).castTo<SceneObject*>(); if (obj != NULL && obj->isPetControlDevice() ){ Reference<PetControlDevice*> petDevice = cast<PetControlDevice*>(obj.get()); if( petDevice != NULL && petDevice->getPetType() == PetManager::DROIDPET){ droidsInDatapad++; } } } if( droidsInDatapad >= maxStoredDroids){ player->sendSystemMessage("You have too many droids in your datapad"); return 1; } Reference<CreatureManager*> creatureManager = player->getZone()->getCreatureManager(); if( creatureManager == NULL ) return 1; CreatureTemplateManager* creatureTemplateManager = CreatureTemplateManager::instance(); Reference<CreatureTemplate*> creatureTemplate = creatureTemplateManager->getTemplate( mobileTemplate.hashCode() ); if( creatureTemplate == NULL ){ player->sendSystemMessage("wrong droid template;mobileTemplate=[" + mobileTemplate + "]" ); return 1; } Reference<PetControlDevice*> controlDevice = (server->getZoneServer()->createObject(controlDeviceObjectTemplate.hashCode(), 1)).castTo<PetControlDevice*>(); if( controlDevice == NULL ){ player->sendSystemMessage("wrong droid control device template " + controlDeviceObjectTemplate); return 1; } Locker locker(controlDevice); Reference<CreatureObject*> creatureObject = creatureManager->createCreature(generatedObjectTemplate.hashCode(), true, mobileTemplate.hashCode() ); if( creatureObject == NULL ){ controlDevice->destroyObjectFromDatabase(true); player->sendSystemMessage("wrong droid templates;mobileTemplate=[" + mobileTemplate + "];generatedObjectTemplate=[" + generatedObjectTemplate + "]" ); return 1; } Locker clocker(creatureObject, player); Reference<DroidObject*> droid = creatureObject.castTo<DroidObject*>(); if( droid == NULL ) { controlDevice->destroyObjectFromDatabase(true); creatureObject->destroyObjectFromDatabase(true); return 1; } droid->loadTemplateData( creatureTemplate ); droid->setCustomObjectName(StringIdManager::instance()->getStringId(*droid->getObjectName()), true); // Transfer crafting components from deed to droid ManagedReference<SceneObject*> craftingComponents = getSlottedObject("crafted_components"); if(craftingComponents != NULL) { SceneObject* satchel = craftingComponents->getContainerObject(0); // remove all items form satchel and add int he new items Vector<ManagedReference<SceneObject*> > toRemove; for (int i = 0; i < satchel->getContainerObjectsSize(); ++i) { ManagedReference<SceneObject*> sceno = satchel->getContainerObject(i); if (sceno != NULL) { toRemove.add(sceno); } } satchel->removeAllContainerObjects(); for(int i=0;i<toRemove.size();i++) { SceneObject* component = toRemove.get(i); Locker componenetLocker(component); component->destroyObjectFromWorld(true); } // this will change to use stacked modules. we wont care about non droid modules as they arent needed. String key; ManagedReference<DroidComponent*> comp = NULL; HashTableIterator<String, ManagedReference<DroidComponent*> > iterator = modules.iterator(); droid->setResists(0); droid->setHitChance(0); for(int i = 0; i < modules.size(); ++i) { iterator.getNextKeyAndValue(key, comp); if (comp) { satchel->transferObject(comp, -1, false); DataObjectComponentReference* data = comp->getDataObjectComponent(); BaseDroidModuleComponent* module = NULL; if(data != NULL && data->get() != NULL && data->get()->isDroidModuleData()) { module = cast<BaseDroidModuleComponent*>(data->get()); module->initialize(droid); } } } droid->transferObject(craftingComponents, 4, false); craftingComponents->setSendToClient(false); } // Copy color customization from deed to droid CustomizationVariables* customVars = getCustomizationVariables(); if( customVars != NULL ){ for (int i = 0; i < customVars->size(); ++i) { uint8 id = customVars->elementAt(i).getKey(); int16 val = customVars->elementAt(i).getValue(); String name = CustomizationIdManager::instance()->getCustomizationVariable(id); if( name.contains( "color" ) ){ droid->setCustomizationVariable( name, val, true ); } } droid->refreshPaint(); } StringId s; s.setStringId(droid->getObjectName()->getFullPath()); controlDevice->setObjectName(s); controlDevice->setPetType(PetManager::DROIDPET); controlDevice->setMaxVitality(100); controlDevice->setVitality(100); droid->createChildObjects(); controlDevice->setControlledObject(droid); controlDevice->setDefaultCommands(); if (!datapad->transferObject(controlDevice, -1)) { controlDevice->destroyObjectFromDatabase(true); return 1; } datapad->broadcastObject(controlDevice, true); controlDevice->callObject(player); droid->initDroidModules(true); float maxHam = DroidMechanics::determineHam(overallQuality,species); for (int i = 0; i < 9; ++i) { if (i % 3 == 0) { droid->setBaseHAM(i,maxHam,true); droid->setHAM(i,maxHam,true); } else { droid->setBaseHAM(i,maxHam/100,true); droid->setHAM(i,maxHam/100,true); } } //Remove the deed from its container. ManagedReference<SceneObject*> deedContainer = getParent().get(); if (deedContainer != NULL) { destroyObjectFromWorld(true); } generated = true; destroyObjectFromDatabase(true); player->sendSystemMessage("@pet/pet_menu:device_added"); // "A control device has been added to your datapad." return 0; } return DeedImplementation::handleObjectMenuSelect(player, selectedID); }
void PetControlDeviceImplementation::callObject(CreatureObject* player) { if (player->isInCombat() || player->isDead() || player->isIncapacitated() || player->getPendingTask("tame_pet") != NULL) { player->sendSystemMessage("@pet/pet_menu:cant_call"); // You cannot call this pet right now. return; } if (player->isRidingMount()) { player->sendSystemMessage("@pet/pet_menu:mounted_call_warning"); // You cannot call a pet while mounted or riding a vehicle. return; } if (player->getParent() != NULL) { ManagedReference<SceneObject*> strongRef = player->getParentRecursively(SceneObjectType::BUILDING); ManagedReference<BuildingObject*> building; if (strongRef != NULL) building = strongRef.castTo<BuildingObject*>(); if (building == NULL || building->isPrivateStructure()) { player->sendSystemMessage("@pet/pet_menu:private_house"); // You cannot call pets in a private building. return; } } if (!isASubChildOf(player)) return; ManagedReference<TangibleObject*> controlledObject = this->controlledObject.get(); if (controlledObject == NULL || !controlledObject->isAiAgent()) return; ManagedReference<AiAgent*> pet = cast<AiAgent*>(controlledObject.get()); ManagedReference<PlayerObject*> ghost = player->getPlayerObject(); if (ghost->hasActivePet(pet)) return; if (vitality <= 0) { player->sendSystemMessage("@pet/pet_menu:dead_pet"); // This pet is dead. Select DESTROY from the radial menu to delete this pet control device. return; } unsigned int petFaction = pet->getFaction(); if (petFaction != 0) { if (player->getFaction() == 0) { StringIdChatParameter message("@faction_perk:prose_be_declared"); // You must be declared to a faction to use %TT. message.setTT(pet->getDisplayedName()); player->sendSystemMessage(message); return; } if (player->getFaction() != petFaction || ghost->getFactionStatus() == FactionStatus::ONLEAVE) { StringIdChatParameter message("@faction_perk:prose_be_declared_faction"); // You must be a declared %TO to use %TT. message.setTO(pet->getFactionString()); message.setTT(pet->getDisplayedName()); player->sendSystemMessage(message); return; } } if(player->getPendingTask("call_pet") != NULL) { StringIdChatParameter waitTime("pet/pet_menu", "call_delay_finish_pet"); // Already calling a Pet: Call will be finished in %DI seconds. Time nextExecution; Core::getTaskManager()->getNextExecutionTime(player->getPendingTask("call_pet"), nextExecution); int timeLeft = (nextExecution.getMiliTime() / 1000) - System::getTime(); waitTime.setDI(timeLeft); player->sendSystemMessage(waitTime); return; } if (!growPet(player)) return; int currentlySpawned = 0; int spawnedLevel = 0; int maxPets = 1; int maxLevelofPets = 10; int level = pet->getLevel(); if (petType == PetManager::CREATUREPET) { bool ch = player->hasSkill("outdoors_creaturehandler_novice"); if (ch) { maxPets = player->getSkillMod("keep_creature"); maxLevelofPets = player->getSkillMod("tame_level"); } if (level > maxLevelofPets) { player->sendSystemMessage("@pet/pet_menu:control_exceeded"); // Calling this pet would exceed your Control Level ability. return; } ManagedReference<Creature*> creaturePet = cast<Creature*>(pet.get()); if (creaturePet != NULL && creaturePet->isVicious() && (player->getSkillMod("tame_aggro") <= 0 || !ch)) { player->sendSystemMessage("@pet/pet_menu:lack_skill"); // You lack the skill to call a pet of this type. return; } } else if (petType == PetManager::FACTIONPET){ maxPets = 3; } for (int i = 0; i < ghost->getActivePetsSize(); ++i) { ManagedReference<AiAgent*> object = ghost->getActivePet(i); if (object != NULL) { if (object->isCreature() && petType == PetManager::CREATUREPET) { if (++currentlySpawned >= maxPets) { player->sendSystemMessage("@pet/pet_menu:at_max"); // You already have the maximum number of pets of this type that you can call. return; } spawnedLevel += object->getLevel(); if ((spawnedLevel + level) > maxLevelofPets) { player->sendSystemMessage("@pet/pet_menu:control_exceeded"); // Calling this pet would exceed your Control Level ability. return; } } else if (object->isNonPlayerCreatureObject() && petType == PetManager::FACTIONPET) { if (++currentlySpawned >= maxPets) { player->sendSystemMessage("@pet/pet_menu:at_max"); // You already have the maximum number of pets of this type that you can call. return; } } else if (object->isDroidObject() && petType == PetManager::DROIDPET) { if (++currentlySpawned >= maxPets) { player->sendSystemMessage("@pet/pet_menu:at_max"); // You already have the maximum number of pets of this type that you can call. return; } } } } ManagedReference<TradeSession*> tradeContainer = player->getActiveSession(SessionFacadeType::TRADE).castTo<TradeSession*>(); if (tradeContainer != NULL) { server->getZoneServer()->getPlayerManager()->handleAbortTradeMessage(player); } if(player->getCurrentCamp() == NULL && player->getCityRegion() == NULL) { Reference<CallPetTask*> callPet = new CallPetTask(_this.get(), player, "call_pet"); StringIdChatParameter message("pet/pet_menu", "call_pet_delay"); // Calling pet in %DI seconds. Combat will terminate pet call. message.setDI(15); player->sendSystemMessage(message); player->addPendingTask("call_pet", callPet, 15 * 1000); if (petControlObserver == NULL) { petControlObserver = new PetControlObserver(_this.get()); petControlObserver->deploy(); } player->registerObserver(ObserverEventType::STARTCOMBAT, petControlObserver); } else { // Player is in a city or camp, spawn pet immediately if( player->getCooldownTimerMap() == NULL ) return; // Check cooldown if( !player->getCooldownTimerMap()->isPast("petCallOrStoreCooldown") ){ player->sendSystemMessage("@pet/pet_menu:cant_call_1sec"); //"You cannot CALL for 1 second." return; } Locker clocker(controlledObject, player); spawnObject(player); // Set cooldown player->getCooldownTimerMap()->updateToCurrentAndAddMili("petCallOrStoreCooldown", 1000); // 1 sec } }
void PetControlDeviceImplementation::spawnObject(CreatureObject* player) { ZoneServer* zoneServer = getZoneServer(); ManagedReference<TangibleObject*> controlledObject = this->controlledObject.get(); if (controlledObject == NULL) return; if (!isASubChildOf(player)) return; ManagedReference<TradeSession*> tradeContainer = player->getActiveSession(SessionFacadeType::TRADE).castTo<TradeSession*>(); if (tradeContainer != NULL) { server->getZoneServer()->getPlayerManager()->handleAbortTradeMessage(player); } controlledObject->initializePosition(player->getPositionX(), player->getPositionZ(), player->getPositionY()); ManagedReference<CreatureObject*> creature = NULL; if (controlledObject->isCreatureObject()) { creature = cast<CreatureObject*>(controlledObject.get()); creature->setCreatureLink(player); creature->setControlDevice(_this.get()); creature->setFaction(player->getFaction()); creature->setObjectMenuComponent("PetMenuComponent"); if (player->getPvpStatusBitmask() & CreatureFlag::PLAYER) creature->setPvpStatusBitmask(player->getPvpStatusBitmask() - CreatureFlag::PLAYER, true); else creature->setPvpStatusBitmask(player->getPvpStatusBitmask(), true); } Zone* zone = player->getZone(); if (zone == NULL) return; ManagedReference<SceneObject*> parent = player->getParent(); if (parent != NULL && parent->isCellObject()) parent->transferObject(controlledObject, -1, true); else zone->transferObject(controlledObject, -1, true); updateStatus(1); if (petControlObserver != NULL) player->dropObserver(ObserverEventType::STARTCOMBAT, petControlObserver); AiAgent* pet = cast<AiAgent*>(creature.get()); if (pet == NULL) return; ManagedReference<PlayerObject*> ghost = player->getPlayerObject(); ghost->addToActivePets(pet); if (pet->isDroidObject()) { DroidObject* droid = cast<DroidObject*>(pet); if( droid == NULL ) return; // Sanity check that there isn't another power task outstanding droid->removePendingTask( "droid_power" ); // Submit new power task Reference<Task*> droidPowerTask = new DroidPowerTask( droid ); droid->addPendingTask("droid_power", droidPowerTask, 120000); // 2 min if( droid->hasPower() ){ // TODO Temporarily set to autofollow player droid->setFollowObject(player); } else{ droid->handleLowPower(); } } else { pet->setFollowObject(player); } // Not training any commands trainingCommand = 0; }