void WeaponObjectImplementation::createChildObjects() { // Create any child objects in a weapon. ZoneServer* zoneServer = server->getZoneServer(); for (int i = 0; i < templateObject->getChildObjectsSize(); ++i) { ChildObject* child = templateObject->getChildObject(i); if (child == NULL) continue; ManagedReference<SceneObject*> obj = zoneServer->createObject( child->getTemplateFile().hashCode(), getPersistenceLevel()); if (obj == NULL) continue; ContainerPermissions* permissions = obj->getContainerPermissions(); permissions->setOwner(getObjectID()); permissions->setInheritPermissionsFromParent(true); permissions->setDefaultDenyPermission(ContainerPermissions::MOVECONTAINER); permissions->setDenyPermission("owner", ContainerPermissions::MOVECONTAINER); if (!transferObject(obj, child->getContainmentType())) { obj->destroyObjectFromDatabase(true); continue; } childObjects.put(obj); obj->initializeChildObject(_this.getReferenceUnsafeStaticCast()); } }
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); } } }
void SuiManager::handleCharacterBuilderSelectItem(CreatureObject* player, SuiBox* suiBox, uint32 cancel, Vector<UnicodeString>* args) { ZoneServer* zserv = player->getZoneServer(); if (args->size() < 1) return; bool otherPressed = false; int index = 0; if(args->size() > 1) { otherPressed = Bool::valueOf(args->get(0).toString()); index = Integer::valueOf(args->get(1).toString()); } else { index = Integer::valueOf(args->get(0).toString()); } if (!suiBox->isCharacterBuilderBox()) return; ManagedReference<SuiCharacterBuilderBox*> cbSui = cast<SuiCharacterBuilderBox*>( suiBox); CharacterBuilderMenuNode* currentNode = cbSui->getCurrentNode(); PlayerObject* ghost = player->getPlayerObject(); //If cancel was pressed then we kill the box/menu. if (cancel != 0) return; //Back was pressed. Send the node above it. if (otherPressed) { CharacterBuilderMenuNode* parentNode = currentNode->getParentNode(); if(parentNode == NULL) return; cbSui->setCurrentNode(parentNode); ghost->addSuiBox(cbSui); player->sendMessage(cbSui->generateMessage()); return; } CharacterBuilderMenuNode* node = currentNode->getChildNodeAt(index); //Node doesn't exist or the index was out of bounds. Should probably resend the menu here. if (node == NULL) { ghost->addSuiBox(cbSui); player->sendMessage(cbSui->generateMessage()); return; } if (node->hasChildNodes()) { //If it has child nodes, display them. cbSui->setCurrentNode(node); ghost->addSuiBox(cbSui); player->sendMessage(cbSui->generateMessage()); } else { String templatePath = node->getTemplatePath(); if (templatePath.indexOf(".iff") < 0) { // Non-item selections if (templatePath == "unlearn_all_skills") { SkillManager::instance()->surrenderAllSkills(player); player->sendSystemMessage("All skills unlearned."); } else if (templatePath == "cleanse_character") { if (!player->isInCombat()) { player->sendSystemMessage("You have been cleansed from the signs of previous battles."); for (int i = 0; i < 9; ++i) { player->setWounds(i, 0); } player->setShockWounds(0); } else { player->sendSystemMessage("Not within combat."); } } else if (templatePath == "reset_buffs") { if (!player->isInCombat()) { player->sendSystemMessage("Your buffs have been reset."); player->clearBuffs(true); ghost->setFoodFilling(0); ghost->setDrinkFilling(0); } else { player->sendSystemMessage("Not within combat."); } } else if (templatePath.beginsWith("crafting_apron_")) { //"object/tangible/wearables/apron/apron_chef_s01.iff" //"object/tangible/wearables/ithorian/apron_chef_jacket_s01_ith.iff" uint32 itemCrc = ( player->getSpecies() != CreatureObject::ITHORIAN ) ? 0x5DDC4E5D : 0x6C191FBB; ManagedReference<WearableObject*> apron = zserv->createObject(itemCrc, 2).castTo<WearableObject*>(); if (apron == NULL) { player->sendSystemMessage("There was an error creating the requested item. Please contact customer support with this issue."); ghost->addSuiBox(cbSui); player->sendMessage(cbSui->generateMessage()); error("could not create frog crafting apron"); return; } apron->createChildObjects(); if (apron->isWearableObject()) { uint32 bitmask = apron->getOptionsBitmask() | OptionBitmask::YELLOW; apron->setOptionsBitmask(bitmask, false); UnicodeString modName = "(General)"; apron->addSkillMod(SkillModManager::WEARABLE, "general_assembly", 25); apron->addSkillMod(SkillModManager::WEARABLE, "general_experimentation", 25); if(templatePath == "crafting_apron_armorsmith") { modName = "(Armorsmith)"; apron->addSkillMod(SkillModManager::WEARABLE, "armor_assembly", 25); apron->addSkillMod(SkillModManager::WEARABLE, "armor_experimentation", 25); apron->addSkillMod(SkillModManager::WEARABLE, "armor_repair", 25); } else if(templatePath == "crafting_apron_weaponsmith") { modName = "(Weaponsmith)"; apron->addSkillMod(SkillModManager::WEARABLE, "weapon_assembly", 25); apron->addSkillMod(SkillModManager::WEARABLE, "weapon_experimentation", 25); apron->addSkillMod(SkillModManager::WEARABLE, "weapon_repair", 25); apron->addSkillMod(SkillModManager::WEARABLE, "grenade_assembly", 25); apron->addSkillMod(SkillModManager::WEARABLE, "grenade_experimentation", 25); } else if(templatePath == "crafting_apron_tailor") { modName = "(Tailor)"; apron->addSkillMod(SkillModManager::WEARABLE, "clothing_assembly", 25); apron->addSkillMod(SkillModManager::WEARABLE, "clothing_experimentation", 25); apron->addSkillMod(SkillModManager::WEARABLE, "clothing_repair", 25); } else if(templatePath == "crafting_apron_chef") { modName = "(Chef)"; apron->addSkillMod(SkillModManager::WEARABLE, "food_assembly", 25); apron->addSkillMod(SkillModManager::WEARABLE, "food_experimentation", 25); } else if(templatePath == "crafting_apron_architect") { modName = "(Architect)"; apron->addSkillMod(SkillModManager::WEARABLE, "structure_assembly", 25); apron->addSkillMod(SkillModManager::WEARABLE, "structure_experimentation", 25); apron->addSkillMod(SkillModManager::WEARABLE, "structure_complexity", 25); } else if(templatePath == "crafting_apron_droid_engineer") { modName = "(Droid Engineer)"; apron->addSkillMod(SkillModManager::WEARABLE, "droid_assembly", 25); apron->addSkillMod(SkillModManager::WEARABLE, "droid_experimentation", 25); apron->addSkillMod(SkillModManager::WEARABLE, "droid_complexity", 25); } else if(templatePath == "crafting_apron_doctor") { modName = "(Doctor)"; apron->addSkillMod(SkillModManager::WEARABLE, "medicine_assembly", 25); apron->addSkillMod(SkillModManager::WEARABLE, "medicine_experimentation", 25); } else if(templatePath == "crafting_apron_combat_medic") { modName = "(Combat Medic)"; apron->addSkillMod(SkillModManager::WEARABLE, "combat_medicine_assembly", 25); apron->addSkillMod(SkillModManager::WEARABLE, "combat_medicine_experimentation", 25); } UnicodeString apronName = "Crafting Apron " + modName; apron->setCustomObjectName(apronName, false); } ManagedReference<SceneObject*> inventory = player->getSlottedObject("inventory"); apron->sendTo(player, true); inventory->transferObject(apron, -1, true); StringIdChatParameter stringId; stringId.setStringId("@faction_perk:bonus_base_name"); //You received a: %TO. stringId.setTO(apron); player->sendSystemMessage(stringId); } else if (templatePath == "enhance_character") { ManagedReference<SceneObject*> scob = cbSui->getUsingObject(); if (scob != NULL) { if (scob->getGameObjectType() == SceneObjectType::CHARACTERBUILDERTERMINAL) { CharacterBuilderTerminal* bluefrog = cast<CharacterBuilderTerminal*>( scob.get()); bluefrog->enhanceCharacter(player); } } } else if (templatePath == "credits") { player->addCashCredits(50000, true); player->sendSystemMessage("You have received 50.000 Credits"); } else if (templatePath == "faction_rebel") { ghost->increaseFactionStanding("rebel", 100000); } else if (templatePath == "faction_imperial") { ghost->increaseFactionStanding("imperial", 100000); } else if (templatePath == "language") { ManagedReference<SceneObject*> scob = cbSui->getUsingObject(); if (scob != NULL) { if (scob->getGameObjectType() == SceneObjectType::CHARACTERBUILDERTERMINAL) { CharacterBuilderTerminal* bluefrog = cast<CharacterBuilderTerminal*>( scob.get()); bluefrog->giveLanguages(player); } } } else if (templatePath == "apply_dots") { ManagedReference<SceneObject*> scob = cbSui->getUsingObject(); player->addDotState(CreatureState::POISONED, scob->getObjectID(), 100, CreatureAttribute::HEALTH, 60, 80, 0); player->addDotState(CreatureState::BLEEDING, scob->getObjectID(), 100, CreatureAttribute::ACTION, 60, 80, 0); player->addDotState(CreatureState::DISEASED, scob->getObjectID(), 100, CreatureAttribute::ACTION, 60, 80, 0); player->addDotState(CreatureState::ONFIRE, scob->getObjectID(), 100, CreatureAttribute::HEALTH, 60, 80, 0); } else if (templatePath == "clear_dots") { player->clearDots(); } else if (templatePath == "max_xp") { ghost->maximizeExperience(); player->sendSystemMessage("You have maximized all xp types."); } else { if (templatePath.length() > 0) { SkillManager::instance()->awardSkill(templatePath, player, true, true, true); if (player->hasSkill(templatePath)) player->sendSystemMessage("You have learned a skill."); } else { player->sendSystemMessage("Unknown selection."); } } ghost->addSuiBox(cbSui); player->sendMessage(cbSui->generateMessage()); } else { // Items if (templatePath.contains("event_perk")) { if (ghost->getEventPerkCount() >= 5) { player->sendSystemMessage("@event_perk:pro_too_many_perks"); // You cannot rent any more items right now. ghost->addSuiBox(cbSui); player->sendMessage(cbSui->generateMessage()); return; } } ManagedReference<SceneObject*> item = zserv->createObject(node->getTemplateCRC(), 1); if (item == NULL) { player->sendSystemMessage("There was an error creating the requested item. Please contact customer support with this issue."); ghost->addSuiBox(cbSui); player->sendMessage(cbSui->generateMessage()); error("could not create frog item: " + node->getDisplayName()); return; } item->createChildObjects(); if (item->isEventPerkDeed()) { EventPerkDeed* deed = cast<EventPerkDeed*>(item.get()); deed->setOwner(player); ghost->addEventPerk(deed); } ManagedReference<SceneObject*> inventory = player->getSlottedObject("inventory"); item->sendTo(player, true); inventory->transferObject(item, -1, true); StringIdChatParameter stringId; stringId.setStringId("@faction_perk:bonus_base_name"); //You received a: %TO. stringId.setTO(item); player->sendSystemMessage(stringId); ghost->addSuiBox(cbSui); player->sendMessage(cbSui->generateMessage()); } } }
int PlantObjectImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { ManagedReference<SceneObject*> rootParent = getRootParent(); ManagedReference<SceneObject*> parent = getParent(); if (rootParent == NULL || parent == NULL) { return 0; } ManagedReference<BuildingObject*> building = cast<BuildingObject*>( rootParent.get()); if ((building == NULL || !building->isOnAdminList(player) || !parent->isCellObject()) && selectedID >= 69 && selectedID <= 74) { player->sendSystemMessage("@plant_grow:must_be_in_building"); // The plant must be in a building which you administrate. return 0; } if (selectedID == 69) { // Add Nutrients sendResourceSUI(player, 1); } else if (selectedID == 72) { // Add Water sendResourceSUI(player, 2); } else if (selectedID == 70) { // Remove Nutrients nutrientLevel -= 5; if (nutrientLevel < 0) nutrientLevel = 0; player->sendSystemMessage("@plant_grow:remove_nutrients"); } else if (selectedID == 73) { // Remove Water waterLevel -= 5; if (waterLevel < 0) waterLevel = 0; player->sendSystemMessage("@plant_grow:remove_water"); } else if (selectedID == 74) { // Pick Fruit if (fruitCount < 1) return 0; ManagedReference<SceneObject*> inventory = player->getSlottedObject("inventory"); if(inventory->isContainerFullRecursive()){ player->sendSystemMessage("@plant_grow:no_inventory"); // You do not have any inventory space. return 0; } ZoneServer* zserv = player->getZoneServer(); fruitCount--; String fruitTemplate = "object/tangible/item/plant/force_melon.iff"; Reference<SceneObject*> fruit = zserv->createObject(fruitTemplate.hashCode(), 1); if(fruit == NULL) { return 0; } if (!inventory->transferObject(fruit, -1, false, false) ) { fruit->destroyObjectFromDatabase(true); return 0; } inventory->broadcastObject(fruit, true); player->sendSystemMessage("@plant_grow:pick_fruit"); // You pick a piece of fruit from the plant. } return 1; }
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; }
void SceneObjectImplementation::createChildObjects() { if (getZone() == NULL) return; ZoneServer* zoneServer = getZone()->getZoneServer(); bool client = isStaticObject(); for (int i = 0; i < templateObject->getChildObjectsSize(); ++i) { ChildObject* child = templateObject->getChildObject(i); if (child == NULL) continue; ManagedReference<SceneObject*> obj = NULL; if (client) obj = zoneServer->createObject(child->getTemplateFile().hashCode(), "clientobjects", getPersistenceLevel()); else obj = zoneServer->createObject(child->getTemplateFile().hashCode(), getPersistenceLevel()); if (obj == NULL) continue; Locker objLocker(obj, asSceneObject()); Vector3 childPosition = child->getPosition(); childObjects.put(obj); obj->initializePosition(childPosition.getX(), childPosition.getZ(), childPosition.getY()); obj->setDirection(child->getDirection()); if (isBuildingObject() && child->getCellId() >= 0) { BuildingObject* buildingObject = asBuildingObject(); int totalCells = buildingObject->getTotalCellNumber(); try { if (totalCells >= child->getCellId()) { ManagedReference<CellObject*> cellObject = buildingObject->getCell(child->getCellId()); if (cellObject != NULL) { if (!cellObject->transferObject(obj, child->getContainmentType(), true)) { obj->destroyObjectFromDatabase(true); continue; } //cellObject->broadcastObject(obj, false); } else { error("NULL CELL OBJECT"); obj->destroyObjectFromDatabase(true); continue; } } } catch (Exception& e) { error("unreported exception caught in void SceneObjectImplementation::createChildObjects()!"); e.printStackTrace(); } } else { //Create the object outdoors in relation to its parent. Vector3 position; if (obj->isActiveArea()) position = getWorldPosition(); else position = getPosition(); float angle = direction.getRadians(); float x = (Math::cos(angle) * childPosition.getX()) + (childPosition.getY() * Math::sin(angle)); float y = (Math::cos(angle) * childPosition.getY()) - (childPosition.getX() * Math::sin(angle)); x += position.getX(); y += position.getY(); float z = position.getZ() + childPosition.getZ(); float degrees = direction.getDegrees(); Quaternion dir = child->getDirection(); obj->initializePosition(x, z, y); obj->setDirection(dir.rotate(Vector3(0, 1, 0), degrees)); if (obj->isBuildingObject()) { BuildingObject* building = obj->asBuildingObject(); if (building != NULL) { building->createCellObjects(); } } if (!getZone()->transferObject(obj, -1, false)) { obj->destroyObjectFromDatabase(true); continue; } } //childObjects.put(obj); ContainerPermissions* permissions = obj->getContainerPermissions(); permissions->setOwner(getObjectID()); permissions->setInheritPermissionsFromParent(false); permissions->setDefaultDenyPermission(ContainerPermissions::MOVECONTAINER); permissions->setDenyPermission("owner", ContainerPermissions::MOVECONTAINER); obj->initializeChildObject(asSceneObject()); } }