int LuaSceneObject::getZoneName(lua_State* L) { Zone* zone = realObject->getZone(); String name = ""; if (zone != NULL) { name = zone->getZoneName(); } lua_pushstring(L, name.toCharArray()); return 1; }
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 ForageManagerImplementation::startForaging(CreatureObject* player, int forageType) { if (player == NULL) return; Locker playerLocker(player); int actionCostForage = 50; int mindCostShellfish = 100; int actionCostShellfish = 100; //Check if already foraging. Reference<Task*> pendingForage = player->getPendingTask("foraging"); if (pendingForage != NULL) { if (forageType == ForageManager::SHELLFISH) player->sendSystemMessage("@harvesting:busy"); else player->sendSystemMessage("@skl_use:sys_forage_already"); //"You are already foraging." return; } // Check if mounted if (player->isRidingMount()) { player->sendSystemMessage("@error_message:survey_on_mount"); // You cannot perform that action while mounted on a creature or driving a vehicle. return; } //Check if player is inside a structure. if (player->getParentID() != 0) { if (forageType == ForageManager::SHELLFISH) player->sendSystemMessage("@harvesting:inside"); else player->sendSystemMessage("@skl_use:sys_forage_inside"); //"You can't forage inside a structure." return; } //Check if a player is swimming for shellfish harvesting if (forageType == ForageManager::SHELLFISH && player->isSwimming()){ player->sendSystemMessage("@harvesting:swimming"); return; } //Check if player is in water for shellfish harvesting if (forageType == ForageManager::SHELLFISH && !player->isInWater()){ player->sendSystemMessage("@harvesting:in_water"); return; } //Check for action and deduct cost. if (forageType == ForageManager::SHELLFISH){ //Adjust costs based upon player's Focus and Quickness int mindCost = player->calculateCostAdjustment(CreatureAttribute::FOCUS, mindCostShellfish); int actionCost = player->calculateCostAdjustment(CreatureAttribute::QUICKNESS, actionCostShellfish); if (player->getHAM(CreatureAttribute::MIND) < mindCost + 1 || player->getHAM(CreatureAttribute::ACTION) < actionCost + 1) return; else { player->inflictDamage(player, CreatureAttribute::MIND, mindCost, false, true); player->inflictDamage(player, CreatureAttribute::ACTION, actionCost, false, true); } } else { //Adjust action cost based upon a player's Quickness int actionCost = player->calculateCostAdjustment(CreatureAttribute::QUICKNESS, actionCostForage); if (player->getHAM(CreatureAttribute::ACTION) >= actionCost + 1) player->inflictDamage(player, CreatureAttribute::ACTION, actionCost, false, true); else { player->sendSystemMessage("@skl_use:sys_forage_attrib"); //"You need to rest before you can forage again." return; } } //Collect player's current position. float playerX = player->getPositionX(); float playerY = player->getPositionY(); ManagedReference<ZoneServer*> zoneServer = player->getZoneServer(); //Queue the foraging task. Zone* zone = player->getZone(); if (zone == NULL) return; Reference<Task*> foragingEvent = new ForagingEvent(player, forageType, playerX, playerY, zone->getZoneName()); player->addPendingTask("foraging", foragingEvent, 8500); if(forageType == ForageManager::LAIR){ player->sendSystemMessage("You begin to search the lair for creatures"); //"You begin to search the lair for creatures." } else{ player->sendSystemMessage("@skl_use:sys_forage_start"); //"You begin to search the area for goods." } player->doAnimation("forage"); }