int StructureManager::declareResidence(CreatureObject* player, StructureObject* structureObject) { if (!structureObject->isBuildingObject()) { player->sendSystemMessage( "@player_structure:residence_must_be_building"); //Your declared residence must be a building. return 1; } PlayerObject* ghost = player->getPlayerObject(); if (!player->checkCooldownRecovery("declare_residence") && !ghost->isPrivileged()) { Time* timeremaining = player->getCooldownTime("declare_residence"); StringIdChatParameter params("player_structure", "change_residence_time"); //You cannot change residence for %NO hours. params.setTO( String::valueOf( ceil(timeremaining->miliDifference() / -3600000.f))); player->sendSystemMessage(params); return 1; } ManagedReference<BuildingObject*> buildingObject = cast<BuildingObject*>(structureObject); if (!buildingObject->isOwnerOf(player)) { player->sendSystemMessage("@player_structure:declare_must_be_owner"); //You must be the owner of the building to declare residence. return 1; } uint64 objectid = player->getObjectID(); uint64 declaredOidResidence = ghost->getDeclaredResidence(); ManagedReference<BuildingObject*> declaredResidence = server->getObject(declaredOidResidence).castTo<BuildingObject*>(); ManagedReference<CityRegion*> cityRegion = buildingObject->getCityRegion(); CityManager* cityManager = server->getCityManager(); if (declaredResidence != NULL) { if (declaredResidence == buildingObject) { player->sendSystemMessage("@player_structure:already_residence"); //This building is already your residence. return 1; } ManagedReference<CityRegion*> residentCity = declaredResidence->getCityRegion(); if (residentCity != NULL) { Locker lock(residentCity, player); if (residentCity->isMayor(objectid)) { player->sendSystemMessage("@city/city:mayor_residence_change"); //As a city Mayor, your residence is always the city hall of the city in which you are mayor. You cannot declare a new residence. return 1; } cityManager->unregisterCitizen(residentCity, player); } player->sendSystemMessage("@player_structure:change_residence"); //You change your residence to this building. } else { player->sendSystemMessage("@player_structure:declared_residency"); //You have declared your residency here. } if (cityRegion != NULL) { Locker lock(cityRegion, player); if (cityRegion->isMayor(objectid) && structureObject != cityRegion->getCityHall()) { player->sendSystemMessage("@city/city:mayor_residence_change"); //As a city Mayor, your residence is always the city hall of the city in which you are mayor. You cannot declare a new residence. return 1; } cityManager->registerCitizen(cityRegion, player); } //Set the characters home location to this structure. ghost->setDeclaredResidence(buildingObject); if(declaredResidence != NULL){ Locker oldLock(declaredResidence, player); declaredResidence->setResidence(false); } Locker newLock(buildingObject,player); buildingObject->setResidence(true); player->addCooldown("declare_residence", 24 * 3600 * 1000); //1 day return 0; }
void CityRegionImplementation::notifyExit(SceneObject* object) { //pre: no 2 different city regions should ever overlap, only 2 Regions of the same city region if (object->isTangibleObject()) { TangibleObject* tano = cast<TangibleObject*>(object); ManagedReference<Region*> activeRegion = tano->getActiveRegion().castTo<Region*>(); if (activeRegion != NULL) { ManagedReference<CityRegion*> city = activeRegion->getCityRegion(); object->setCityRegion(city); if (city == _this.getReferenceUnsafeStaticCast()) // if its the same city we wait till the object exits the last region return; } else { object->setCityRegion(NULL); } } else { object->setCityRegion(NULL); } if (object->isBazaarTerminal() || object->isVendor()) { if (object->isBazaarTerminal()) bazaars.drop(object->getObjectID()); AuctionTerminalDataComponent* terminalData = NULL; DataObjectComponentReference* data = object->getDataObjectComponent(); if(data != NULL && data->get() != NULL && data->get()->isAuctionTerminalData()) terminalData = cast<AuctionTerminalDataComponent*>(data->get()); if(terminalData != NULL) terminalData->updateUID(); } if (object->isPlayerCreature()) currentPlayers.decrement(); if (isClientRegion()) return; if (object->isCreatureObject()) { CreatureObject* creature = cast<CreatureObject*>(object); StringIdChatParameter params("city/city", "city_leave_city"); //You have left %TO. params.setTO(getRegionName()); creature->sendSystemMessage(params); removeSpecializationModifiers(creature); } if (object->isStructureObject()) { float x = object->getWorldPositionX(); float y = object->getWorldPositionY(); StructureObject* structure = cast<StructureObject*>(object); Locker slocker(&structureListMutex); if (structure->isBuildingObject()) { BuildingObject* building = cast<BuildingObject*>(object); uint64 ownerID = structure->getOwnerObjectID(); ZoneServer* zoneServer = building->getZoneServer(); if (zoneServer != NULL) { ManagedReference<CreatureObject*> owner = zoneServer->getObject(ownerID).castTo<CreatureObject*>(); if(owner != NULL && owner->isPlayerCreature() && building->isResidence() && isCitizen(ownerID)) { CityManager* cityManager = zoneServer->getCityManager(); cityManager->unregisterCitizen(_this.getReferenceUnsafeStaticCast(), owner); } } } completeStructureList.drop(structure->getObjectID()); if (structure->isCivicStructure()) { removeStructure(structure); } else if (structure->isCommercialStructure()) { removeCommercialStructure(structure); } } if (object->isDecoration() && object->getParent().get() == NULL) { removeDecoration(object); } }