void LootkitObjectImplementation::createItem() { for (int i = 0; i<comps.size(); ++i) { if (components.get(comps.get(i)) == 0) { return; // Still missing pieces } } ManagedReference<CreatureObject*> player = getPlayer(); if (player != NULL) { player->sendSystemMessage("@loot_kit:new_item_created"); ManagedReference<SceneObject*> inventory = player->getSlottedObject("inventory"); ZoneServer* zoneServer = server->getZoneServer(); ManagedReference<SceneObject*> rewardObject = zoneServer->createObject(reward.get(System::random(reward.size()-1)), 2); Locker clocker(inventory, player); rewardObject->sendTo(player, true); if (inventory->transferObject(rewardObject, -1, true)) { //getParent()->removeObject(_this, true); destroyObjectFromWorld(true); if (isPersistent()) destroyObjectFromDatabase(true); } } }
bool CampSiteActiveAreaImplementation::despawnCamp() { Locker locker(_this.get()); if(!abandoned && campOwner != NULL && campOwner->getZoneServer() != NULL) { /// Get Player Manager PlayerManager* playerManager = campOwner->getZoneServer()->getPlayerManager(); if (playerManager == NULL) { error("playerManager is null"); return false; } float durationUsed = ((float)(System::getTime() - timeCreated)) / (campStructureData->getDuration() / 4); if (durationUsed > 1) durationUsed = 1; int amount = 0; int campXp = campStructureData->getExperience(); amount = (int)(campXp * durationUsed); amount += (int)((visitors.size() -1) * (campXp / 30) * durationUsed); amount += (int)(currentXp * durationUsed); playerManager->awardExperience(campOwner, "camp", amount, true); } Locker tlocker(&taskMutex); if(despawnTask != NULL ) { if(despawnTask->isScheduled()) despawnTask->cancel(); despawnTask = NULL; } if(abandonTask != NULL) { if(abandonTask->isScheduled()) abandonTask->cancel(); abandonTask = NULL; } tlocker.release(); if(campOwner != NULL) campOwner->dropObserver(ObserverEventType::STARTCOMBAT, campObserver); if (camp != NULL) { if(camp->getZone() == NULL) return false; StructureManager::instance()->destroyStructure(camp); } destroyObjectFromWorld(true); destroyObjectFromDatabase(true); return true; }
void ResourceDeedImplementation::destroyDeed() { if (parent.get() != NULL) { destroyObjectFromWorld(true); } if (isPersistent()) destroyObjectFromDatabase(true); generated = true; }
void ResourceDeedImplementation::destroyDeed() { if (parent.get() != NULL) { /*getParent()->removeObject(_this.getReferenceUnsafeStaticCast(), true); broadcastDestroy(_this.getReferenceUnsafeStaticCast(), false);*/ destroyObjectFromWorld(true); } if (isPersistent()) destroyObjectFromDatabase(true); generated = true; }
void PlantObjectImplementation::changeSize(int size) { String plantTemplate = ""; switch (size) { case 0: plantTemplate = "object/tangible/loot/plant_grow/plant_stage_dead.iff"; break; case 1: plantTemplate = "object/tangible/loot/plant_grow/plant_stage_1.iff"; break; case 2: plantTemplate = "object/tangible/loot/plant_grow/plant_stage_2.iff"; break; case 3: plantTemplate = "object/tangible/loot/plant_grow/plant_stage_3.iff"; break; } ManagedReference<ZoneServer*> zoneServer = getZoneServer(); if (zoneServer == NULL) return; ManagedReference<SceneObject*> parent = getParent(); if (parent == NULL || !parent->isCellObject()) return; ManagedReference<SceneObject*> obj = zoneServer->createObject(plantTemplate.hashCode(), getPersistenceLevel()); if (obj == NULL) return; Locker clocker(obj, _this.getReferenceUnsafeStaticCast()); obj->initializePosition(getPositionX(), getPositionZ(), getPositionY()); obj->setDirection(Math::deg2rad(getDirectionAngle())); ManagedReference<PlantObject*> newPlant = cast<PlantObject*>( obj.get()); if (newPlant == NULL) return; newPlant->setWaterLevel(waterLevel); newPlant->setNutrientLevel(nutrientLevel); newPlant->setWaterQuality(waterQuality); newPlant->setNutrientQuality(nutrientQuality); newPlant->setPlantHealth(health); newPlant->initializePlant(size); parent->transferObject(obj, -1); clocker.release(); destroyObjectFromWorld(true); destroyObjectFromDatabase(); }
void TangibleObjectImplementation::setUseCount(uint32 newUseCount, bool notifyClient) { if (useCount == newUseCount) return; setCountdownTimer(newUseCount, notifyClient); if (useCount < 1 && !isCreatureObject()) { destroyObjectFromWorld(true); destroyObjectFromDatabase(true); return; } }
void ResourceContainerImplementation::setQuantity(uint32 quantity, bool doNotify, bool ignoreMax) { Locker _locker(_this.get()); ManagedReference<SceneObject*> parent = getParent(); stackQuantity = quantity; if(stackQuantity < 1) { if(parent != NULL) { /*parent->broadcastDestroy(_this.get(), true); parent->removeObject(_this.get(), false);*/ //setParent(NULL); destroyObjectFromWorld(true); } destroyObjectFromDatabase(true); return; } int newStackSize = 0; if (!ignoreMax && stackQuantity > ResourceContainer::MAXSIZE) { newStackSize = stackQuantity - ResourceContainer::MAXSIZE; stackQuantity = ResourceContainer::MAXSIZE; } if (newStackSize > 0) { if (parent != NULL) { ResourceContainer* harvestedResource = spawnObject->createResource(newStackSize); parent->transferObject(harvestedResource, -1, true); parent->broadcastObject(harvestedResource, true); } } if(!doNotify) return; ResourceContainerObjectDeltaMessage3* rcnod3 = new ResourceContainerObjectDeltaMessage3(_this.get()); rcnod3->updateQuantity(); rcnod3->close(); broadcastMessage(rcnod3, true); }
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 MissionTerminalImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { if (selectedID == 69 && player->hasSkill("combat_smuggler_slicing_01")) { if (player->containsActiveSession(SessionFacadeType::SLICING)) { player->sendSystemMessage("@slicing/slicing:already_slicing"); return 0; } if (!player->checkCooldownRecovery("slicing.terminal")) { player->sendSystemMessage("@slicing/slicing:not_again"); return 0; } //Create Session ManagedReference<SlicingSession*> session = new SlicingSession(player); session->initalizeSlicingMenu(player, _this.get()); return 0; } if (selectedID == 72) { ManagedReference<CityRegion*> city = player->getCityRegion(); if (city != NULL) city->removeMissionTerminal(_this.get()); destroyObjectFromWorld(true); destroyObjectFromDatabase(false); return 0; } return TangibleObjectImplementation::handleObjectMenuSelect(player, selectedID); }
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 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); }
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); }