void FireworkShowMenuComponent::showData(CreatureObject* player, FireworkObject* fireworkShow) const { ManagedReference<PlayerObject*> ghost = player->getPlayerObject(); if (ghost == NULL || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_ADDEVENT) || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_REMOVEEVENT) || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_REORDERSHOW) || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_MODIFYEVENT) || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_DELAYSELECTION)) { return; } DataObjectComponent* data = fireworkShow->getDataObjectComponent()->get(); if (data == NULL || !data->isFireworkShowData()) return; FireworkShowDataComponent* fireworkShowData = cast<FireworkShowDataComponent*>(data); Locker plocker(player); ManagedReference<SuiListBox*> suiBox = new SuiListBox(player, SuiWindowType::FIREWORK_SHOW_ADDEVENT, SuiListBox::HANDLESINGLEBUTTON); suiBox->setPromptTitle("@firework:data_title"); suiBox->setPromptText("@firework:data_prompt"); suiBox->setOkButton(true, "@ok"); suiBox->setUsingObject(fireworkShow); int totalFireworks = fireworkShowData->getTotalFireworkCount(); for (int i = 0; i < totalFireworks; i++) { ManagedReference<FireworkObject*> firework = fireworkShowData->getFirework(i); String fireworkDelay = String::valueOf(float(fireworkShowData->getFireworkDelay(i)) / 1000.f); String menuItem = "(" + String::valueOf(i) + ":" + fireworkDelay + "s) " + firework->getDisplayedName(); suiBox->addMenuItem(menuItem); } ghost->addSuiBox(suiBox); player->sendMessage(suiBox->generateMessage()); }
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 StructureManager::promptWithdrawMaintenance(StructureObject* structure, CreatureObject* creature) { if (!structure->isGuildHall()) { return; } if (!structure->isOnAdminList(creature)) { creature->sendSystemMessage("@player_structure:withdraw_admin_only"); // You must be an administrator to remove credits from the treasury. return; } //Get the most up to date maintenance count. structure->updateStructureStatus(); int surplusMaintenance = structure->getSurplusMaintenance(); if (surplusMaintenance <= 0) { creature->sendSystemMessage("@player_structure:insufficient_funds_withdrawal"); // Insufficent funds for withdrawal. return; } ManagedReference<PlayerObject*> ghost = creature->getPlayerObject(); if (ghost == NULL) return; ManagedReference<SuiInputBox*> sui = new SuiInputBox(creature, SuiWindowType::STRUCTURE_MANAGE_MAINTENANCE); sui->setCallback(new StructureWithdrawMaintenanceSuiCallback(server)); sui->setPromptTitle("@player_structure:withdraw_maintenance"); // Withdraw From Treasury sui->setUsingObject(structure); sui->setPromptText("@player_structure:treasury_prompt " + String::valueOf(surplusMaintenance)); // Treasury: ghost->addSuiBox(sui); creature->sendMessage(sui->generateMessage()); }
void GroupManager::sendMasterLooterList(GroupObject* group, CreatureObject* leader) { //Pre: Leader and group are locked //Post: Leader and group are locked if (group == NULL || leader == NULL) return; ManagedReference<PlayerObject*> ghost = leader->getPlayerObject(); if (ghost == NULL) return; //Close SUI box if already open. ghost->closeSuiWindowType(SuiWindowType::GROUP_LOOT_PICK_LOOTER); //Create Master Looter selection list box. ManagedReference<SuiListBox*> sui = new SuiListBox(leader, SuiWindowType::GROUP_LOOT_PICK_LOOTER); sui->setPromptTitle("@group:master_looter_sui_title"); //"Select Master Looter" sui->setPromptText("@group:choose_master_looter"); //"Choose a Master Looter from the list of available players:" sui->setCancelButton(true, "@ui:cancel"); sui->setOkButton(true, "@ui:ok"); sui->setCallback(new GroupLootPickLooterSuiCallback(leader->getZoneServer())); for (int i = 0; i < group->getGroupSize(); ++i) { ManagedReference<CreatureObject*> member = (group->getGroupMember(i)).castTo<CreatureObject*>(); if (member == NULL || !member->isPlayerCreature()) continue; sui->addMenuItem(member->getFirstName(), member->getObjectID()); } //Send list box to the group leader. ghost->addSuiBox(sui); leader->sendMessage(sui->generateMessage()); }
void PlantObjectImplementation::sendResourceSUI(CreatureObject* player, int type) { ManagedReference<PlayerObject*> ghost = player->getPlayerObject(); if (ghost == NULL) return; ManagedReference<SuiListBox*> suiBox = new SuiListBox(player, SuiWindowType::GROWABLE_PLANT, SuiListBox::HANDLETWOBUTTON); suiBox->setCallback(new GrowablePlantSuiCallback(player->getZoneServer())); suiBox->setPromptTitle("@plant_grow:select_resource_sub"); suiBox->setPromptText("@plant_grow:select_resource_body"); suiBox->setOkButton(true, "@ok"); suiBox->setCancelButton(true, "@cancel"); suiBox->setUsingObject(_this.getReferenceUnsafeStaticCast()); suiBox->setForceCloseDistance(32.f); ManagedReference<SceneObject*> inventory = player->getSlottedObject("inventory"); ManagedReference<SceneObject*> sceneObject = NULL; for (int i=0; i< inventory->getContainerObjectsSize(); i++) { sceneObject = inventory->getContainerObject(i); if (sceneObject == NULL) continue; if (sceneObject->isResourceContainer()) { ManagedReference<ResourceContainer*> rcno = cast<ResourceContainer*>( sceneObject.get()); if (rcno == NULL) continue; ManagedReference<ResourceSpawn*> spawn = rcno->getSpawnObject(); if (spawn == NULL) continue; if ((type == 1 && spawn->isType("organic")) || (type == 2 && spawn->isType("water"))) { suiBox->addMenuItem(spawn->getName(), sceneObject->getObjectID()); } } } if (suiBox->getMenuSize() > 0) { ghost->closeSuiWindowType(SuiWindowType::GROWABLE_PLANT); ghost->addSuiBox(suiBox); player->sendMessage(suiBox->generateMessage()); } else { if (type == 1) player->sendSystemMessage("@plant_grow:no_nutrients"); // You don't have any nutrients. else player->sendSystemMessage("@plant_grow:no_water"); // You don't have any water. } }
void StructureManager::promptFindLostItems(CreatureObject* creature, StructureObject* structure) { ManagedReference<SuiMessageBox*> sui = new SuiMessageBox(creature, 0x00); sui->setUsingObject(structure); sui->setPromptTitle("@player_structure:move_first_item"); //Find Lost Items sui->setPromptText("@player_structure:move_first_item_d"); //This command will move the first item in your house to your location... sui->setCallback(new FindLostItemsSuiCallback(server)); ManagedReference<PlayerObject*> ghost = creature->getPlayerObject(); if (ghost != NULL) { ghost->addSuiBox(sui); creature->sendMessage(sui->generateMessage()); } }
void StructureManager::promptDeleteAllItems(CreatureObject* creature, StructureObject* structure) { ManagedReference<SuiMessageBox*> sui = new SuiMessageBox(creature, 0x00); sui->setUsingObject(structure); sui->setPromptTitle("@player_structure:delete_all_items"); //Delete All Items sui->setPromptText("@player_structure:delete_all_items_d"); //This command will delete every object in your house. Are you ABSOLUTELY sure you want to destroy every object in your house? sui->setCancelButton(true, "@cancel"); sui->setCallback(new DeleteAllItemsSuiCallback(server)); ManagedReference<PlayerObject*> ghost = creature->getPlayerObject(); if (ghost != NULL) { ghost->addSuiBox(sui); creature->sendMessage(sui->generateMessage()); } }
void StructureManager::promptMaintenanceDroid(StructureObject* structure, CreatureObject* creature) { ManagedReference<PlayerObject*> ghost = creature->getPlayerObject(); if (ghost == NULL) return; Vector<DroidObject*> droids; ManagedReference<SceneObject*> datapad = creature->getSlottedObject("datapad"); if(datapad == NULL) { return; } 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::DROIDPET) { DroidObject* pet = cast<DroidObject*>(device->getControlledObject()); if (pet->isMaintenanceDroid()) { droids.add(pet); } } } } if (droids.size() == 0) { creature->sendSystemMessage("@player_structure:no_droids"); return; } ManagedReference<SuiListBox*> box = new SuiListBox(creature,SuiWindowType::STRUCTURE_ASSIGN_DROID); box->setCallback(new StructureAssignDroidSuiCallback(creature->getZoneServer())); box->setPromptText("@sui:assign_droid_prompt"); box->setPromptTitle("@sui:assign_droid_title"); // Configure Effects box->setOkButton(true, "@ok"); // Check if player has a droid called with a maintenance module installed for (int i = 0; i < droids.size(); ++i) { DroidObject* droidObject = droids.elementAt(i); box->addMenuItem(droidObject->getDisplayedName(),droidObject->getObjectID()); } box->setUsingObject(structure); ghost->addSuiBox(box); creature->sendMessage(box->generateMessage()); }
int GogglesObjectMenuComponent::handleObjectMenuSelect(SceneObject* sceneObject, CreatureObject* player, byte selectedID) { if (!sceneObject->isTangibleObject()) return 0; if (!sceneObject->isASubChildOf(player)) return 0; if (selectedID == 81 || selectedID == 82) { ManagedReference<SceneObject*> parent = sceneObject->getParent().get(); if (parent != NULL && parent->isPlayerCreature()) { player->sendSystemMessage("@error_message:equipped_goggles"); return 0; } // Handle color change. ZoneServer* server = player->getZoneServer(); if (server != NULL) { // The color index. String appearanceFilename = sceneObject->getObjectTemplate()->getAppearanceFilename(); VectorMap<String, Reference<CustomizationVariable*> > variables; AssetCustomizationManagerTemplate::instance()->getCustomizationVariables(appearanceFilename.hashCode(), variables, false); // The Sui Box. ManagedReference<SuiColorBox*> cbox = new SuiColorBox(player, SuiWindowType::COLOR_GOGGLES); cbox->setCallback(new ColorGogglesSuiCallback(server)); if (selectedID == 81) cbox->setColorPalette(variables.elementAt(1).getKey()); else cbox->setColorPalette(variables.elementAt(0).getKey()); cbox->setUsingObject(sceneObject); // Add to player. ManagedReference<PlayerObject*> ghost = player->getPlayerObject(); ghost->addSuiBox(cbox); player->sendMessage(cbox->generateMessage()); } } return TangibleObjectMenuComponent::handleObjectMenuSelect(sceneObject, player, selectedID); }
void FireworkShowMenuComponent::reorderShow(CreatureObject* player, FireworkObject* fireworkShow) const { ManagedReference<PlayerObject*> ghost = player->getPlayerObject(); if (ghost == NULL || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_ADDEVENT) || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_REMOVEEVENT) || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_REORDERSHOW) || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_MODIFYEVENT) || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_DELAYSELECTION)) { return; } DataObjectComponent* data = fireworkShow->getDataObjectComponent()->get(); if (data == NULL || !data->isFireworkShowData()) return; FireworkShowDataComponent* fireworkShowData = cast<FireworkShowDataComponent*>(data); Locker plocker(player); ManagedReference<SuiListBox*> suiBox = new SuiListBox(player, SuiWindowType::FIREWORK_SHOW_REORDERSHOW, SuiListBox::HANDLETHREEBUTTON); suiBox->setPromptTitle("@firework:modify_index_title"); // Remove Show Event suiBox->setPromptText("@firework:modify_index_prompt"); // Select the event index for which you would like to modify the delay time. suiBox->setOkButton(true, "@ui:done"); suiBox->setCancelButton(true, "@ui:moveup"); suiBox->setOtherButton(true, "@ui:movedown"); suiBox->setUsingObject(fireworkShow); int totalFireworks = fireworkShowData->getTotalFireworkCount(); for (int i = 0; i < totalFireworks; i++) { ManagedReference<FireworkObject*> firework = fireworkShowData->getFirework(i); String fireworkDelay = String::valueOf(float(fireworkShowData->getFireworkDelay(i)) / 1000.f); String menuItem = "(" + String::valueOf(i) + ":" + fireworkDelay + "s) " + firework->getDisplayedName(); suiBox->addMenuItem(menuItem, firework->getObjectID()); } suiBox->setCallback(new FireworkShowReorderShowSuiCallback(player->getZoneServer())); ghost->addSuiBox(suiBox); player->sendMessage(suiBox->generateMessage()); }
void StructureManager::promptNameStructure(CreatureObject* creature, StructureObject* structure, TangibleObject* object) { ManagedReference<PlayerObject*> ghost = creature->getPlayerObject(); if (ghost == NULL) return; ManagedReference<SuiInputBox*> inputBox = new SuiInputBox(creature, SuiWindowType::OBJECT_NAME); if (object == NULL) { inputBox->setUsingObject(structure); } else { inputBox->setUsingObject(object); } inputBox->setPromptTitle("@base_player:set_name"); //Set Name inputBox->setPromptText("@player_structure:structure_name_prompt"); //Structure Name: inputBox->setMaxInputSize(128); inputBox->setCallback(new NameStructureSuiCallback(server)); inputBox->setForceCloseDistance(32); ghost->addSuiBox(inputBox); creature->sendMessage(inputBox->generateMessage()); }
void StructureManager::promptPayMaintenance(StructureObject* structure, CreatureObject* creature, SceneObject* terminal) { int availableCredits = creature->getCashCredits(); if (availableCredits <= 0) { creature->sendSystemMessage("@player_structure:no_money"); //You do not have any money to pay maintenance. return; } ManagedReference<PlayerObject*> ghost = creature->getPlayerObject(); if (ghost == NULL) return; //Get the most up to date maintenance count. structure->updateStructureStatus(); int surplusMaintenance = (int) floor( (float) structure->getSurplusMaintenance()); ManagedReference<SuiTransferBox*> sui = new SuiTransferBox(creature, SuiWindowType::STRUCTURE_MANAGE_MAINTENANCE); sui->setCallback(new StructurePayMaintenanceSuiCallback(server)); sui->setPromptTitle("@player_structure:select_amount"); //Select Amount sui->setUsingObject(structure); sui->setPromptText( "@player_structure:select_maint_amount \n@player_structure:current_maint_pool " + String::valueOf(surplusMaintenance)); sui->addFrom("@player_structure:total_funds", String::valueOf(availableCredits), String::valueOf(availableCredits), "1"); sui->addTo("@player_structure:to_pay", "0", "0", "1"); ghost->addSuiBox(sui); creature->sendMessage(sui->generateMessage()); }
void StructureManager::reportStructureStatus(CreatureObject* creature, StructureObject* structure) { ManagedReference<PlayerObject*> ghost = creature->getPlayerObject(); if (ghost == NULL) return; //Close the window if it is already open. ghost->closeSuiWindowType(SuiWindowType::STRUCTURE_STATUS); ManagedReference<SuiListBox*> status = new SuiListBox(creature, SuiWindowType::STRUCTURE_STATUS); status->setPromptTitle("@player_structure:structure_status_t"); //Structure Status status->setPromptText( "@player_structure:structure_name_prompt " + structure->getDisplayedName()); //Structure Name: status->setUsingObject(structure); status->setOkButton(true, "@refresh"); status->setCancelButton(true, "@cancel"); status->setCallback(new StructureStatusSuiCallback(server)); ManagedReference<SceneObject*> ownerObject = server->getObject( structure->getOwnerObjectID()); if (ownerObject != NULL && ownerObject->isCreatureObject()) { CreatureObject* owner = cast<CreatureObject*>(ownerObject.get()); status->addMenuItem( "@player_structure:owner_prompt " + owner->getFirstName()); } uint64 declaredOidResidence = ghost->getDeclaredResidence(); ManagedReference<BuildingObject*> declaredResidence = server->getObject(declaredOidResidence).castTo<BuildingObject*>(); if (declaredResidence == structure) { status->addMenuItem("@player_structure:declared_residency"); //You have declared your residency here. } if (structure->isPrivateStructure() && !structure->isCivicStructure()) { status->addMenuItem("@player_structure:structure_private"); //This structure is private } else { status->addMenuItem("@player_structure:structure_public"); //This structure is public } status->addMenuItem( "@player_structure:condition_prompt " + String::valueOf(structure->getDecayPercentage()) + "%"); if (!structure->isCivicStructure()) { // property tax float propertytax = 0.f; if(!structure->isCivicStructure() && structure->getCityRegion() != NULL){ ManagedReference<CityRegion*> city = structure->getCityRegion().get(); if(city != NULL){ propertytax = city->getPropertyTax()/ 100.f * structure->getMaintenanceRate(); status->addMenuItem( "@city/city:property_tax_prompt : " + String::valueOf(ceil(propertytax)) + " cr/hr"); } } // maintenance float secsRemainingMaint = 0.f; if( structure->getSurplusMaintenance() > 0 ){ float totalrate = (float)structure->getMaintenanceRate() + propertytax; secsRemainingMaint = ((float)structure->getSurplusMaintenance() / totalrate)*3600; } status->addMenuItem( "@player_structure:maintenance_pool_prompt " + String::valueOf( (int) floor( (float) structure->getSurplusMaintenance())) + " " + getTimeString( (uint32)secsRemainingMaint ) ); status->addMenuItem( "@player_structure:maintenance_rate_prompt " + String::valueOf(structure->getMaintenanceRate()) + " cr/hr"); status->addMenuItem( "@player_structure:maintenance_mods_prompt " + structure->getMaintenanceMods()); } if (structure->isInstallationObject() && !structure->isGeneratorObject() && !structure->isCivicStructure()) { InstallationObject* installation = cast<InstallationObject*>(structure); float secsRemainingPower = 0.f; if( installation->getSurplusPower() > 0 ){ secsRemainingPower = ((float)installation->getSurplusPower() / (float)installation->getBasePowerRate())*3600; } status->addMenuItem( "@player_structure:power_reserve_prompt " + String::valueOf( (int) installation->getSurplusPower()) + " " + getTimeString( (uint32)secsRemainingPower ) ); status->addMenuItem( "@player_structure:power_consumption_prompt " + String::valueOf( (int) installation->getBasePowerRate()) + " @player_structure:units_per_hour"); } if (structure->isBuildingObject()) { BuildingObject* building = cast<BuildingObject*>(structure); status->addMenuItem( "@player_structure:items_in_building_prompt " + String::valueOf( building->getCurrentNumberOfPlayerItems())); //Number of Items in Building: } ghost->addSuiBox(status); creature->sendMessage(status->generateMessage()); }
int ForceShrineMenuComponent::handleObjectMenuSelect(SceneObject* sceneObject, CreatureObject* creature, byte selectedID) { if (selectedID != 213) return 0; if (creature->getPosture() != CreaturePosture::CROUCHED){ creature->sendSystemMessage("@jedi_trials:show_respect"); // Must show respect return 0; } ManagedReference<PlayerObject*> ghost = creature->getPlayerObject(); if (ghost == NULL) return 0; if (creature->getScreenPlayState("VillageJediProgression") && !creature->hasSkill("force_title_jedi_rank_02")){ ManagedReference<SuiMessageBox*> box = new SuiMessageBox(creature, SuiWindowType::NONE); box->setPromptTitle("@jedi_trials:padawan_trials_title"); // Jedi Trials box->setPromptText("@jedi_trials:padawan_trials_completed"); ghost->addSuiBox(box); creature->sendMessage(box->generateMessage()); SkillManager::instance()->awardSkill("force_title_jedi_rank_02", creature, true, true, true); creature->playEffect("clienteffect/entertainer_dazzle_level_3.cef", ""); // Not sure if it's the right one for this. PlayMusicMessage* pmm = new PlayMusicMessage("sound/intro.snd"); creature->sendMessage(pmm); ghost->setJediState(2); // Trainer number. Pick a random trainer, there are at least 600 in the galaxy. ZoneServer* zoneServer = ghost->getZoneServer(); int randomZone = System::random(zoneServer->getZoneCount() - 1); ManagedReference<Zone*> zone = zoneServer->getZone(randomZone); Vector3 randomTrainer = zone->getCreatureManager()->getRandomJediTrainer(); if ((randomTrainer.getX() == 0) && (randomTrainer.getY() == 0)) { // No trainers on the zone. ManagedReference<Zone*> zone = zoneServer->getZone(0); Vector3 randomTrainer = zone->getCreatureManager()->getRandomJediTrainer(); } Vector3 trainerPositionFinal(randomTrainer.getX(), randomTrainer.getY(), 0); String zoneName = zone->getZoneName(); ghost->setTrainerCoordinates(trainerPositionFinal); ghost->setTrainerZoneName(zoneName); // For the Waypoint. ManagedReference<SceneObject*> inventory = creature->getSlottedObject("inventory"); //Check if inventory is full. if (inventory->hasFullContainerObjects()) { creature->sendSystemMessage("@jedi_spam:inventory_full_jedi_robe"); // You have too many items in your inventory. In order to get your Padawan Robe you must clear out at least one free slot. return 0; } ZoneServer* zserv = creature->getZoneServer(); String PadawanRobe = "object/tangible/wearables/robe/robe_jedi_padawan.iff"; ManagedReference<SceneObject*> padawanRobe = zserv->createObject(PadawanRobe.hashCode(), 1); if (inventory->transferObject(padawanRobe, -1)) { inventory->broadcastObject(padawanRobe, true); } else { padawanRobe->destroyObjectFromDatabase(true); } } else if (!creature->hasSkill("force_title_jedi_novice")){ int rand = System::random(14) + 1; StringBuffer sysmsg; sysmsg << "@jedi_trials:force_shrine_wisdom_" << rand; creature->sendSystemMessage(sysmsg.toString()); } else if (creature->hasSkill("force_title_jedi_rank_02")){ ManagedReference<SceneObject*> inventory = creature->getSlottedObject("inventory"); //Check if inventory is full. if (inventory->hasFullContainerObjects()) { creature->sendSystemMessage("@jedi_spam:inventory_full_jedi_robe"); // You have too many items in your inventory. In order to get your Padawan Robe you must clear out at least one free slot. return 0; } ZoneServer* zserv = creature->getZoneServer(); String PadawanRobe = "object/tangible/wearables/robe/robe_jedi_padawan.iff"; ManagedReference<SceneObject*> padawanRobe = zserv->createObject(PadawanRobe.hashCode(), 1); if (inventory->transferObject(padawanRobe, -1)) { inventory->broadcastObject(padawanRobe, true); } else { padawanRobe->destroyObjectFromDatabase(true); } } return 0; }
bool PlayerCreationManager::createCharacter(MessageCallback* data) { TemplateManager* templateManager = TemplateManager::instance(); ClientCreateCharacterCallback* callback = cast< ClientCreateCharacterCallback*>(data); ZoneClientSession* client = data->getClient(); if (client->getCharacterCount(zoneServer.get()->getGalaxyID()) >= 10) { ErrorMessage* errMsg = new ErrorMessage("Create Error", "You are limited to 10 characters per galaxy.", 0x0); client->sendMessage(errMsg); return false; } PlayerManager* playerManager = zoneServer.get()->getPlayerManager(); SkillManager* skillManager = SkillManager::instance(); //Get all the data and validate it. UnicodeString characterName; callback->getCharacterName(characterName); //TODO: Replace this at some point? if (!playerManager->checkPlayerName(callback)) return false; String raceFile; callback->getRaceFile(raceFile); uint32 serverObjectCRC = raceFile.hashCode(); PlayerCreatureTemplate* playerTemplate = dynamic_cast<PlayerCreatureTemplate*>(templateManager->getTemplate( serverObjectCRC)); if (playerTemplate == NULL) { error("Unknown player template selected: " + raceFile); return false; } int raceID = playerTemplate->getRace(); String fileName = playerTemplate->getTemplateFileName(); String clientTemplate = templateManager->getTemplateFile( playerTemplate->getClientObjectCRC()); RacialCreationData* raceData = racialCreationData.get(fileName); if (raceData == NULL) raceData = racialCreationData.get(0); //Just get the first race, since they tried to create a race that doesn't exist. String profession, customization, hairTemplate, hairCustomization; callback->getSkill(profession); if (profession.contains("jedi")) profession = "crafting_artisan"; callback->getCustomizationString(customization); callback->getHairObject(hairTemplate); callback->getHairCustomization(hairCustomization); float height = callback->getHeight(); height = MAX(MIN(height, playerTemplate->getMaxScale()), playerTemplate->getMinScale()); //validate biography UnicodeString bio; callback->getBiography(bio); bool doTutorial = callback->getTutorialFlag(); //bool doTutorial = false; ManagedReference<CreatureObject*> playerCreature = zoneServer.get()->createObject( serverObjectCRC, 2).castTo<CreatureObject*>(); if (playerCreature == NULL) { error("Could not create player with template: " + raceFile); return false; } Locker playerLocker(playerCreature); playerCreature->createChildObjects(); playerCreature->setHeight(height); playerCreature->setCustomObjectName(characterName, false); //TODO: Validate with Name Manager. client->setPlayer(playerCreature); playerCreature->setClient(client); // Set starting cash and starting bank playerCreature->setCashCredits(startingCash, false); playerCreature->setBankCredits(startingBank, false); ManagedReference<PlayerObject*> ghost = playerCreature->getPlayerObject(); if (ghost != NULL) { //Set skillpoints before adding any skills. ghost->setSkillPoints(skillPoints); ghost->setStarterProfession(profession); } addCustomization(playerCreature, customization, playerTemplate->getAppearanceFilename()); addHair(playerCreature, hairTemplate, hairCustomization); if (!doTutorial) { addProfessionStartingItems(playerCreature, profession, clientTemplate, false); addStartingItems(playerCreature, clientTemplate, false); addRacialMods(playerCreature, fileName, playerTemplate->getStartingSkills(), playerTemplate->getStartingItems(), false); } else { addProfessionStartingItems(playerCreature, profession, clientTemplate, true); addStartingItems(playerCreature, clientTemplate, true); addRacialMods(playerCreature, fileName, playerTemplate->getStartingSkills(), playerTemplate->getStartingItems(), true); } // Set starting cash and starting bank playerCreature->setCashCredits(startingCash, false); playerCreature->setBankCredits(startingBank, false); if (ghost != NULL) { ghost->setAccountID(client->getAccountID()); if (!freeGodMode) { try { uint32 accID = client->getAccountID(); ManagedReference<Account*> playerAccount = playerManager->getAccount(accID); if (playerAccount == NULL) { playerCreature->destroyPlayerCreatureFromDatabase(true); return false; } int accountPermissionLevel = playerAccount->getAdminLevel(); String accountName = playerAccount->getUsername(); if(accountPermissionLevel > 0 && (accountPermissionLevel == 9 || accountPermissionLevel == 10 || accountPermissionLevel == 12 || accountPermissionLevel == 15)) { playerManager->updatePermissionLevel(playerCreature, accountPermissionLevel); /* Reference<ShipControlDevice*> shipControlDevice = zoneServer->createObject(STRING_HASHCODE("object/intangible/ship/sorosuub_space_yacht_pcd.iff"), 1).castTo<ShipControlDevice*>(); //ShipObject* ship = (ShipObject*) server->createObject(STRING_HASHCODE("object/ship/player/player_sorosuub_space_yacht.iff"), 1); Reference<ShipObject*> ship = zoneServer->createObject(STRING_HASHCODE("object/ship/player/player_basic_tiefighter.iff"), 1).castTo<ShipObject*>(); shipControlDevice->setControlledObject(ship); if (!shipControlDevice->transferObject(ship, 4)) info("Adding of ship to device failed"); ManagedReference<SceneObject*> datapad = playerCreature->getSlottedObject("datapad"); if (datapad != NULL) { if (!datapad->transferObject(shipControlDevice, -1)) { shipControlDevice->destroyObjectFromDatabase(true); } } else { shipControlDevice->destroyObjectFromDatabase(true); error("could not get datapad from player"); } */ } if (accountPermissionLevel < 9) { try { StringBuffer query; //query << "SELECT UNIX_TIMESTAMP(creation_date) FROM characters c WHERE galaxy_id = " << zoneServer.get()->getGalaxyID() << " AND account_id = " << client->getAccountID() << " ORDER BY creation_date desc;"; uint32 galaxyId = zoneServer.get()->getGalaxyID(); uint32 accountId = client->getAccountID(); query << "(SELECT UNIX_TIMESTAMP(c.creation_date) as t FROM characters as c WHERE c.account_id = " << accountId << " AND c.galaxy_id = " << galaxyId << " ORDER BY c.creation_date DESC) UNION (SELECT UNIX_TIMESTAMP(d.creation_date) FROM deleted_characters as d WHERE d.account_id = " << accountId << " AND d.galaxy_id = " << galaxyId << " ORDER BY d.creation_date DESC) ORDER BY t DESC LIMIT 1"; Reference<ResultSet*> res = ServerDatabase::instance()->executeQuery(query); if (res != NULL && res->next()) { uint32 sec = res->getUnsignedInt(0); Time timeVal(sec); if (timeVal.miliDifference() < 86400000) { ErrorMessage* errMsg = new ErrorMessage("Create Error", "You are only permitted to create one character every 24 hours. Repeat attempts prior to 24 hours elapsing will reset the timer.", 0x0); client->sendMessage(errMsg); playerCreature->destroyPlayerCreatureFromDatabase(true); return false; } //timeVal.se } } catch (DatabaseException& e) { error(e.getMessage()); } Locker locker(&charCountMutex); if (lastCreatedCharacter.containsKey(accID)) { Time lastCreatedTime = lastCreatedCharacter.get(accID); if (lastCreatedTime.miliDifference() < 86400000) { ErrorMessage* errMsg = new ErrorMessage("Create Error", "You are only permitted to create one character every 24 hours. Repeat attempts prior to 24 hours elapsing will reset the timer.", 0x0); client->sendMessage(errMsg); playerCreature->destroyPlayerCreatureFromDatabase(true); return false; } else { lastCreatedTime.updateToCurrentTime(); lastCreatedCharacter.put(accID, lastCreatedTime); } } else { lastCreatedCharacter.put(accID, Time()); } } } catch (Exception& e) { error(e.getMessage()); } } else { playerManager->updatePermissionLevel(playerCreature, PermissionLevelList::instance()->getLevelNumber("admin")); } if (doTutorial) playerManager->createTutorialBuilding(playerCreature); else playerManager->createSkippedTutorialBuilding(playerCreature); ValidatedPosition* lastValidatedPosition = ghost->getLastValidatedPosition(); lastValidatedPosition->update(playerCreature); ghost->setBiography(bio); ghost->setRaceID(raceID); ghost->setLanguageID(playerTemplate->getDefaultLanguage()); } playerCreature->setLevel(1); ClientCreateCharacterSuccess* msg = new ClientCreateCharacterSuccess( playerCreature->getObjectID()); playerCreature->sendMessage(msg); ChatManager* chatManager = zoneServer.get()->getChatManager(); chatManager->addPlayer(playerCreature); String firstName = playerCreature->getFirstName(); String lastName = playerCreature->getLastName(); try { StringBuffer query; query << "INSERT INTO `characters_dirty` (`character_oid`, `account_id`, `galaxy_id`, `firstname`, `surname`, `race`, `gender`, `template`)" << " VALUES (" << playerCreature->getObjectID() << "," << client->getAccountID() << "," << zoneServer.get()->getGalaxyID() << "," << "'" << firstName.escapeString() << "','" << lastName.escapeString() << "'," << raceID << "," << 0 << ",'" << raceFile.escapeString() << "')"; ServerDatabase::instance()->executeStatement(query); } catch (DatabaseException& e) { error(e.getMessage()); } playerManager->addPlayer(playerCreature); // Copy claimed veteran rewards from player's alt character uint32 accID = client->getAccountID(); ManagedReference<Account*> playerAccount = playerManager->getAccount(accID); if (playerAccount != NULL && ghost != NULL) { // Find the first alt character ManagedReference<CreatureObject*> altPlayer = NULL; CharacterList* characters = playerAccount->getCharacterList(); for(int i = 0; i < characters->size(); ++i) { CharacterListEntry* entry = &characters->get(i); if(entry->getGalaxyID() == zoneServer.get()->getGalaxyID() && entry->getFirstName() != playerCreature->getFirstName() ) { altPlayer = playerManager->getPlayer(entry->getFirstName()); if( altPlayer != NULL ){ break; } } } // Record the rewards if alt player was found if( altPlayer != NULL && altPlayer->getPlayerObject() != NULL){ Locker alocker( altPlayer ); for( int i = 0; i < playerManager->getNumVeteranRewardMilestones(); i++ ){ int milestone = playerManager->getVeteranRewardMilestone(i); String claimedReward = altPlayer->getPlayerObject()->getChosenVeteranReward(milestone); if( !claimedReward.isEmpty() ){ ghost->addChosenVeteranReward(milestone,claimedReward); } } } } client->addCharacter(playerCreature->getObjectID(), zoneServer.get()->getGalaxyID()); JediManager::instance()->onPlayerCreated(playerCreature); ManagedReference<SuiMessageBox*> box = new SuiMessageBox(playerCreature, SuiWindowType::NONE); box->setPromptTitle("PLEASE NOTE"); box->setPromptText("You are limited to creating one character every 24 hours. Attempting to create another character or deleting your character before the 24 hour timer expires will reset the timer."); ghost->addSuiBox(box); playerCreature->sendMessage(box->generateMessage()); ghost->recalculateCombatLevel(playerCreature); return true; }
void GroupManager::changeLootRule(GroupObject* group, int newRule) { //Pre: group is locked //Post: group is locked if (group == NULL) return; if (group->getLootRule() == newRule) //Don't change to the same rule. return; //This ensures that the loot rule abbreviations are next to the Leader's name. if (newRule != MASTERLOOTER || group->getMasterLooterID() == 0) group->setMasterLooterID(group->getLeader()->getObjectID()); String promptText; switch (newRule) { case FREEFORALL: promptText = "@group:selected_free4all"; break; case MASTERLOOTER: promptText = "@group:selected_master"; notifyMasterLooter(group); break; case LOTTERY: promptText = "@group:selected_lotto"; break; case RANDOM: promptText = "@group:selected_random"; break; default: return; //Invalid Loot Rule Selected. Stop. } group->setLootRule(newRule); group->updateLootRules(); //Send update packet to all members. //Notify group members of the new rule with an SUI box. for (int i = 0; i < group->getGroupSize(); ++i) { ManagedReference<CreatureObject*> member = (group->getGroupMember(i)).castTo<CreatureObject*>(); if (member == NULL || !member->isPlayerCreature() || member == group->getLeader()) continue; ManagedReference<PlayerObject*> ghost = member->getPlayerObject(); if (ghost == NULL) continue; //Close SUI box if already open. ghost->closeSuiWindowType(SuiWindowType::GROUP_LOOT_CHANGED); ManagedReference<SuiMessageBox*> sui = new SuiMessageBox(member, SuiWindowType::GROUP_LOOT_CHANGED); sui->setPromptTitle("@group:loot_changed"); //"Loot Type Changed." sui->setPromptText(promptText); sui->setCancelButton(true, "@group:ok"); sui->setOkButton(true, "@group:leave_group"); sui->setCallback(new GroupLootChangedSuiCallback(member->getZoneServer())); ghost->addSuiBox(sui); member->sendMessage(sui->generateMessage()); } }
int DroidCustomKitObjectMenuComponent::handleObjectMenuSelect(SceneObject* sceneObject, CreatureObject* player, byte selectedID) { if (player == NULL) return 0; if (!sceneObject->isASubChildOf(player)) return 0; if (selectedID != 20) return TangibleObjectMenuComponent::handleObjectMenuSelect(sceneObject, player, selectedID); if(!sceneObject->isTangibleObject()) return 0; ManagedReference<TangibleObject*> kitTano = cast<TangibleObject*>(sceneObject); if(kitTano == NULL) return 0; uint64 targetID = player->getTargetID(); ZoneServer* server = player->getZoneServer(); if (server == NULL) return 0; ManagedReference<TangibleObject*> target = server->getObject(targetID, true).castTo<TangibleObject*>(); if (target == NULL || !target->isDroidObject()) { player->sendSystemMessage("You can only use this tool to customize droids"); return 0; } //permission check CreatureObject* droid = cast<CreatureObject*>(target.get()); uint64 ownerID = droid->getCreatureLinkID(); if ( ownerID != player->getObjectID()){ bool hasConsent = false; ManagedReference<CreatureObject*> targetOwner = server->getObject(ownerID, true).castTo<CreatureObject*>(); if (targetOwner != NULL) { Locker crossLock(targetOwner, player); ManagedReference<PlayerObject*> ghostOwner = targetOwner->getPlayerObject(); for (int i = 0; i < ghostOwner->getConsentListSize(); ++i) { String entryName = ghostOwner->getConsentName(i); if (!entryName.isEmpty()){ if (entryName == player->getFirstName().toLowerCase()){ hasConsent = true; } } } } if (!hasConsent){ player->sendSystemMessage("You require consent to customize another player's droid"); return 0; } } //end permission check Locker clocker(droid, player); String appearanceFilename = target->getObjectTemplate()->getAppearanceFilename(); VectorMap<String, Reference<CustomizationVariable*> > variables; AssetCustomizationManagerTemplate::instance()->getCustomizationVariables(appearanceFilename.hashCode(), variables, false); int numPalette = 0; for(int i = 0; i< variables.size(); ++i) { String varkey = variables.elementAt(i).getKey(); if (varkey.contains("color")) { ++numPalette; } } if (numPalette == 0) { player->sendSystemMessage("No customization options available on this droid"); // protocol droids return 0; } DroidObject* painted = cast<DroidObject*>(droid); if (painted != NULL){ painted->refreshPaint(); } ManagedReference<SuiListBox*> frameTrimSelector = new SuiListBox(player, SuiWindowType::CUSTOMIZE_KIT); frameTrimSelector->setUsingObject(player); frameTrimSelector->setCallback(new CustomDroidSuiCallback(server, numPalette, kitTano)); frameTrimSelector->setUsingObject(target); frameTrimSelector->setPromptTitle("Customize"); frameTrimSelector->setPromptText("Please select the customization action you would like to take"); frameTrimSelector->addMenuItem("Color Frame"); if (numPalette > 1 ) { frameTrimSelector->addMenuItem("Color Trim"); } if (numPalette > 2 ) { frameTrimSelector->addMenuItem("Color Extra Trim"); } frameTrimSelector->setCancelButton(true, ""); frameTrimSelector->setOkButton(true, "@ok"); ManagedReference<PlayerObject*> ghost = player->getPlayerObject(); ghost->addSuiBox(frameTrimSelector); player->sendMessage(frameTrimSelector->generateMessage()); return 0; }
void StructureManager::promptPayUncondemnMaintenance(CreatureObject* creature, StructureObject* structure) { ManagedReference<PlayerObject*> ghost = creature->getPlayerObject(); if (ghost == NULL) { return; } int uncondemnCost = -structure->getSurplusMaintenance(); ManagedReference<SuiMessageBox*> sui; String text; if (creature->getCashCredits() + creature->getBankCredits() >= uncondemnCost) { //Owner can un-condemn the structure. sui = new SuiMessageBox(creature, SuiWindowType::STRUCTURE_UNCONDEMN_CONFIRM); if (sui == NULL) { //TODO: what message should be shown here? return; } //TODO: investigate sui packets to see if it is possible to send StringIdChatParameter directly. String textStringId = "@player_structure:structure_condemned_owner_has_credits"; text = StringIdManager::instance()->getStringId( textStringId.hashCode()).toString(); text = text.replaceFirst("%DI", String::valueOf(uncondemnCost)); sui->setCancelButton(true, "@cancel"); sui->setCallback( new StructurePayUncondemnMaintenanceSuiCallback(server)); } else { //Owner cannot un-condemn the structure. sui = new SuiMessageBox(creature, SuiWindowType::NONE); if (sui == NULL) { //TODO: what message should be shown here? return; } //TODO: investigate sui packets to see if it is possible to send StringIdChatParameter directly. String textStringId = "@player_structure:structure_condemned_owner_no_credits"; text = StringIdManager::instance()->getStringId( textStringId.hashCode()).toString(); text = text.replaceFirst("%DI", String::valueOf(uncondemnCost)); sui->setCancelButton(false, "@cancel"); } sui->setPromptText(text); sui->setOkButton(true, "@ok"); sui->setPromptTitle("@player_structure:fix_condemned_title"); sui->setUsingObject(structure); ghost->addSuiBox(sui); creature->sendMessage(sui->generateMessage()); }
void FireworkShowMenuComponent::addEvent(CreatureObject* player, FireworkObject* fireworkShow) const { DataObjectComponent* data = fireworkShow->getDataObjectComponent()->get(); if (data == NULL || !data->isFireworkShowData()) return; FireworkShowDataComponent* fireworkShowData = cast<FireworkShowDataComponent*>(data); int curFireworks = fireworkShowData->getTotalFireworkCount(); int showCapacity = fireworkShow->getCapacity(); ManagedReference<PlayerObject*> ghost = player->getPlayerObject(); if (ghost == NULL) return; if (curFireworks >= showCapacity && !ghost->isPrivileged()) { player->sendSystemMessage("This firework show is at full capacity."); return; } if (ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_ADDEVENT) || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_REMOVEEVENT) || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_REORDERSHOW) || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_MODIFYEVENT) || ghost->hasSuiBoxWindowType(SuiWindowType::FIREWORK_SHOW_DELAYSELECTION)) { return; } Locker plocker(player); ManagedReference<SuiListBox*> suiBox = new SuiListBox(player, SuiWindowType::FIREWORK_SHOW_ADDEVENT, SuiListBox::HANDLETWOBUTTON); suiBox->setPromptTitle("Select Show Addition"); suiBox->setPromptText("Select the firework to append to the end of the show package."); suiBox->setOkButton(true, "@ok"); suiBox->setCancelButton(true, "@cancel"); suiBox->setUsingObject(fireworkShow); ManagedReference<SceneObject*> inventory = player->getSlottedObject("inventory"); SceneObject* sceneObject = NULL; for (int i = 0; i < inventory->getContainerObjectsSize(); i++) { sceneObject = inventory->getContainerObject(i); if (sceneObject == NULL) continue; FireworkObject* firework = cast<FireworkObject*>(sceneObject); if (firework == NULL) continue; DataObjectComponent* data = firework->getDataObjectComponent()->get(); if (data != NULL && data->isFireworkShowData()) continue; if (sceneObject->getObjectID() != fireworkShow->getObjectID()) { String itemWithUseCount = sceneObject->getDisplayedName() + " (" + firework->getUseCount() + ")"; suiBox->addMenuItem(itemWithUseCount, sceneObject->getObjectID()); } } suiBox->setCallback(new FireworkShowAddEventSuiCallback(player->getZoneServer())); ghost->addSuiBox(suiBox); player->sendMessage(suiBox->generateMessage()); }