void CityHallZoneComponent::destroyObjectFromWorld(SceneObject* sceneObject, bool sendSelfDestroy) const { ZoneServer* zoneServer = sceneObject->getZoneServer(); if (zoneServer == NULL || zoneServer->isServerShuttingDown()) { ZoneComponent::destroyObjectFromWorld(sceneObject, sendSelfDestroy); return; } ManagedReference<CityRegion*> cityRegion = sceneObject->getCityRegion().get(); if (cityRegion != NULL ) { Locker clocker(cityRegion, sceneObject); if (cityRegion->getCityHall() == sceneObject) { cityRegion->setCityHall(NULL); } clocker.release(); CityManager* cityManager = zoneServer->getCityManager(); cityManager->destroyCity(cityRegion); } ZoneComponent::destroyObjectFromWorld(sceneObject, sendSelfDestroy); }
int CityVotingMenuComponent::handleObjectMenuSelect(SceneObject* sceneObject, CreatureObject* player, byte selectID) { ManagedReference<CityRegion*> city = sceneObject->getCityRegion(); if (city == NULL || !city->isCitizen(player->getObjectID())) return 0; sceneObject->unlock(); Locker _lock(city, player); CityManager* cityManager = sceneObject->getZoneServer()->getCityManager(); switch (selectID) { case 224: //Standings case 225: cityManager->sendMayoralStandings(city, player, sceneObject); break; case 226: //Vote cityManager->promptMayoralVote(city, player, sceneObject); break; case 227: //Register cityManager->registerForMayoralRace(city, player); break; case 228: //Unregister cityManager->unregisterFromMayoralRace(city, player, false); break; } _lock.release(); sceneObject->wlock(player); return 0; }
int CityDecorationMenuComponent::handleObjectMenuSelect(SceneObject* sceneObject, CreatureObject* player, byte selectedID) { if (!sceneObject->isTangibleObject()) return 0; if (!player->isPlayerCreature()) return 0; if ( selectedID == 233 ) { Reference<CityDecorationTask*> task = new CityDecorationTask(player, cast<TangibleObject*>(sceneObject), CityDecorationTask::PLACE); task->execute(); return 0; } else if (selectedID == 234) { Reference<CityDecorationTask*> task = new CityDecorationTask(player, cast<TangibleObject*>(sceneObject), CityDecorationTask::REMOVE); task->execute(); return 0; } else if (selectedID == 74 || selectedID == 75 || selectedID == 76 || selectedID == 77) { ManagedReference<CityRegion*> city = player->getCityRegion(); CityManager* cityManager = sceneObject->getZoneServer()->getCityManager(); cityManager->alignAmenity(city, player, sceneObject, selectedID - 74); return 0; } return TangibleObjectMenuComponent::handleObjectMenuSelect(sceneObject, player, selectedID); }
int MissionTerminalImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { ManagedReference<CityRegion*> city = player->getCityRegion(); if (selectedID == 69 && player->hasSkill("combat_smuggler_slicing_01")) { if (city != NULL && !city->isClientRegion() && city->isBanned(player->getObjectID())) { player->sendSystemMessage("@city/city:banned_services"); // You are banned from using this city's services. return 0; } 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.getReferenceUnsafeStaticCast()); return 0; } else if (selectedID == 72) { if (city != NULL && city->isMayor(player->getObjectID())) { CityRemoveAmenityTask* task = new CityRemoveAmenityTask(_this.getReferenceUnsafeStaticCast(), city); task->execute(); player->sendSystemMessage("@city/city:mt_removed"); // The object has been removed from the city. } return 0; } else if (selectedID == 74 || selectedID == 75 || selectedID == 76 || selectedID == 77) { CityManager* cityManager = getZoneServer()->getCityManager(); cityManager->alignAmenity(city, player, _this.getReferenceUnsafeStaticCast(), selectedID - 74); return 0; } return TangibleObjectImplementation::handleObjectMenuSelect(player, selectedID); }
int PlaceDecorationComponent::placeStructure(StructureDeed* deed, CreatureObject* creature, float x, float y, int angle) { if(creature == NULL || creature->getZoneServer() == NULL || creature->getCityRegion() == NULL) return 1; CityRegion* city = creature->getCityRegion().get(); CityManager* cityManager = creature->getZoneServer()->getCityManager(); if(cityManager == NULL) return 1; if(!cityManager->canSupportMoreDecorations(city)) { StringIdChatParameter param("city/city", "no_more_decos"); creature->sendSystemMessage(param); return 1; } StructureManager::instance()->placeStructureFromDeed(creature, deed, x, y, angle); return 0; }
void CityRegionImplementation::applySpecializationModifiers(CreatureObject* creature) { if (getZone() == NULL) return; CityManager* cityManager = getZone()->getZoneServer()->getCityManager(); CitySpecialization* cityspec = cityManager->getCitySpecialization(citySpecialization); if (cityspec == NULL) return; if (isBanned(creature->getObjectID())) { return; } Reference<CreatureObject*> creatureReference = creature; Reference<CityRegion*> city = _this.getReferenceUnsafeStaticCast(); typedef VectorMap<String, int> SkillMods; typedef VectorMapEntry<String, int> SkillModsEntry; EXECUTE_ORDERED_TASK_3(creature, creatureReference, cityspec, city, { Locker locker(creatureReference_p); //Remove all current city skillmods creatureReference_p->removeAllSkillModsOfType(SkillModManager::CITY); SkillMods* mods = cityspec_p->getSkillMods(); for (int i = 0; i < mods->size(); ++i) { SkillModsEntry& entry = mods->elementAt(i); if (entry.getKey() == "private_defense" && !city_p->isMilitiaMember(creatureReference_p->getObjectID())) continue; creatureReference_p->addSkillMod(SkillModManager::CITY, entry.getKey(), entry.getValue()); } });
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); } }
void CityRegionImplementation::notifyEnter(SceneObject* object) { if (object->getCityRegion().get() != _this.getReferenceUnsafeStaticCast() && object->isPlayerCreature()) currentPlayers.increment(); object->setCityRegion(_this.getReferenceUnsafeStaticCast()); if (object->isBazaarTerminal() || object->isVendor()) { if (object->isBazaarTerminal()) bazaars.put(object->getObjectID(), cast<TangibleObject*>(object)); 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 (isClientRegion()) return; if (object->isCreatureObject()) { CreatureObject* creature = cast<CreatureObject*>(object); StringIdChatParameter params("city/city", "city_enter_city"); //You have entered %TT (%TO). params.setTT(getRegionName()); UnicodeString strRank = StringIdManager::instance()->getStringId(String("@city/city:rank" + String::valueOf(cityRank)).hashCode()); if (citySpecialization.isEmpty()) { params.setTO(strRank); } else { UnicodeString citySpec = StringIdManager::instance()->getStringId(citySpecialization.hashCode()); params.setTO(strRank + ", " + citySpec); } creature->sendSystemMessage(params); applySpecializationModifiers(creature); } if (object->isStructureObject()) { StructureObject* structure = cast<StructureObject*>(object); CityManager* cityManager = getZone()->getZoneServer()->getCityManager(); Locker slocker(&structureListMutex); if (isLoaded() && !completeStructureList.contains(structure->getObjectID()) && structure->getBaseMaintenanceRate() > 0) { cityManager->sendAddStructureMails(_this.getReferenceUnsafeStaticCast(), structure); } if (structure->isBuildingObject()) { BuildingObject* building = cast<BuildingObject*>(object); uint64 ownerID = structure->getOwnerObjectID(); ManagedReference<CreatureObject*> owner = zone->getZoneServer()->getObject(ownerID).castTo<CreatureObject*>(); if(owner != NULL && owner->isPlayerCreature() && building->isResidence() && !isCitizen(ownerID)) { cityManager->registerCitizen(_this.getReferenceUnsafeStaticCast(), owner); } } completeStructureList.put(structure->getObjectID()); if (structure->isCivicStructure() && !structure->isDecoration()) { addStructure(structure); } else if (structure->isCommercialStructure()) { addCommercialStructure(structure); } if (registered) { zone->registerObjectWithPlanetaryMap(structure); } } if (object->isDecoration() && object->getParent().get() == NULL) { addDecoration(object); } if (registered && cityMissionTerminals.contains(object)) { zone->registerObjectWithPlanetaryMap(object); } if (!registered && citySkillTrainers.contains(object)) { zone->unregisterObjectWithPlanetaryMap(object); } }
int CityManagementMenuComponent::handleObjectMenuSelect(SceneObject* sceneObject, CreatureObject* player, byte selectID) { ManagedReference<CityRegion*> city = sceneObject->getCityRegion(); if (city == NULL) return 1; Locker lock(city, player); CityManager* cityManager = player->getZoneServer()->getCityManager(); switch (selectID) { case 212: //Status Report cityManager->sendStatusReport(city, player, sceneObject); break; case 213: //Citizenship Report cityManager->sendCitizenshipReport(city, player, sceneObject); break; case 214: // Structure Report cityManager->sendStructureReport(city, player, sceneObject); break; case 215: //Treasury Report cityManager->sendTreasuryReport(city, player, sceneObject); break; case 217: // Change Name cityManager->sendChangeCityName(city, player); break; case 218: //Manage Militia if (city->isMayor(player->getObjectID())) cityManager->sendManageMilitia(city, player, sceneObject); break; case 219: //Adjust Taxes cityManager->promptAdjustTaxes(city, player, sceneObject); break; case 220: //Treasury Deposit cityManager->promptDepositCityTreasury(city, player, sceneObject); break; case 221: //Withdraw Treasury cityManager->promptWithdrawCityTreasury(city, player, sceneObject); break; case 222: //Register/Unregister if (city->isRegistered()) cityManager->promptUnregisterCity(city, player, sceneObject); else cityManager->promptRegisterCity(city, player, sceneObject); break; case 223: //City Advancement cityManager->sendCityAdvancement(city, player, sceneObject); break; case 224: //Maintenance Report cityManager->sendMaintenanceReport(city, player, sceneObject); break; case 225: //Set City Specialization cityManager->promptCitySpecialization(city, player, sceneObject); break; case 226: //Toggle Zoning Enabled cityManager->toggleZoningEnabled(city, player); break; case 232: // Restore Mayor Citizenship cityManager->fixMayor(city, player); break; #ifdef CITY_DEBUG case 228: cityManager->expandCity(city); break; case 229: cityManager->contractCity(city); break; case 230: cityManager->processCityUpdate(city); break; case 231: cityManager->updateCityVoting(city,true); break; #endif } return 0; }