bool CreatureManagerImplementation::addWearableItem(CreatureObject* creature, TangibleObject* clothing) { if (!clothing->isWearableObject() && !clothing->isWeaponObject()) return false; ChatManager* chatMan = zoneServer->getChatManager(); SharedTangibleObjectTemplate* tanoData = dynamic_cast<SharedTangibleObjectTemplate*>(clothing->getObjectTemplate()); Vector<uint32>* races = tanoData->getPlayerRaces(); String race = creature->getObjectTemplate()->getFullTemplateString(); if(clothing->isWearableObject()) { if (!races->contains(race.hashCode())) { UnicodeString message; if(creature->getObjectTemplate()->getFullTemplateString().contains("ithorian")) message = "@player_structure:wear_not_ithorian"; else message = "@player_structure:wear_no"; chatMan->broadcastMessage(creature, message, clothing->getObjectID(), creature->getMoodID(), 0); return false; } } ManagedReference<SceneObject*> clothingParent = clothing->getParent(); if (clothingParent == NULL) return false; for (int i = 0; i < clothing->getArrangementDescriptorSize(); ++i) { Vector<String> descriptors = clothing->getArrangementDescriptor(i); for (int j = 0; j < descriptors.size(); ++j) { ManagedReference<SceneObject*> slot = creature->getSlottedObject(descriptors.get(j)); if (slot != NULL) { slot->destroyObjectFromWorld(true); slot->destroyObjectFromDatabase(true); } } } creature->transferObject(clothing, 4, false); creature->doAnimation("pose_proudly"); creature->broadcastObject(clothing, true); UnicodeString message; if(clothing->isWeaponObject()) message = "@player_structure:wear_yes_weapon"; else message = "@player_structure:wear_yes"; chatMan->broadcastMessage(creature, message, clothing->getObjectID(), creature->getMoodID(), 0); return true; }
void GroupObjectImplementation::destroyChatRoom() { if (chatRoom == NULL) return; ManagedReference<ChatRoom*> room = chatRoom->getParent(); ManagedReference<ChatRoom*> parent = room->getParent(); ChatManager* chatManager = server->getZoneServer()->getChatManager(); chatManager->destroyRoom(chatRoom); chatManager->destroyRoom(room); chatRoom = NULL; }
int LuaAiAgent::spatialChat(lua_State* L) { ZoneServer* zoneServer = ServerCore::getZoneServer(); if (zoneServer == NULL) return 0; ChatManager* chatManager = zoneServer->getChatManager(); if (lua_islightuserdata(L, -1)) { StringIdChatParameter* message = (StringIdChatParameter*)lua_touserdata(L, -1); if (realObject != NULL && message != NULL) { chatManager->broadcastMessage(realObject, *message, 0, 0, 0); } } else { String message = lua_tostring(L, -1); if (realObject != NULL) { chatManager->broadcastMessage(realObject, message, 0, 0, 0); } } 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 CreatureManagerImplementation::tame(Creature* creature, CreatureObject* player, bool force) { Zone* zone = creature->getZone(); if (zone == NULL || !creature->isCreature()) return; if(player->getPendingTask("tame_pet") != NULL) { player->sendSystemMessage("You are already taming a pet"); return; } if(player->getPendingTask("call_pet") != NULL) { player->sendSystemMessage("You cannot tame a pet while another is being called"); return; } if (!creature->canTameMe(player) || !creature->isAttackableBy(player)) { player->sendSystemMessage("@pet/pet_menu:sys_cant_tame"); // You can't tame that return; } CreatureTemplate* creatureTemplate = creature->getCreatureTemplate(); if (creatureTemplate == NULL) return; int templateLevel = creatureTemplate->getLevel(); int maxLevelofPets = player->getSkillMod("tame_level"); if (!player->hasSkill("outdoors_creaturehandler_novice") || (templateLevel > maxLevelofPets)) { player->sendSystemMessage("@pet/pet_menu:sys_lack_skill"); // You lack the skill to be able to tame that creature. return; } if ((creature->isVicious() && player->getSkillMod("tame_aggro") < 1) || creature->getChanceToTame(player) <= 0) { player->sendSystemMessage("@pet/pet_menu:sys_lack_skill"); // You lack the skill to be able to tame that creature. return; } ManagedReference<SceneObject*> datapad = player->getSlottedObject("datapad"); if (datapad == NULL) return; if (datapad->getContainerObjectsSize() >= datapad->getContainerVolumeLimit()) { player->sendSystemMessage("@faction_recruiter:datapad_full"); // Your datapad is full. You must first free some space. return; } ManagedReference<PlayerManager*> playerManager = zoneServer->getPlayerManager(); int numberStored = 0; int maxStoredPets = playerManager->getBaseStoredCreaturePets() + player->getSkillMod("stored_pets"); 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::CREATUREPET) { if (++numberStored >= maxStoredPets) { player->sendSystemMessage("@pet/pet_menu:sys_too_many_stored"); // There are too many pets stored in this container. Release some of them to make room for more. return; } } } } ManagedReference<PlayerObject*> ghost = player->getPlayerObject(); int currentlySpawned = 0; int spawnedLevel = 0; int level = creature->getLevel(); int maxPets = player->getSkillMod("keep_creature"); for (int i = 0; i < ghost->getActivePetsSize(); ++i) { ManagedReference<AiAgent*> object = ghost->getActivePet(i); if (object != NULL) { ManagedReference<PetControlDevice*> pcd = object->getControlDevice().get().castTo<PetControlDevice*>(); if (pcd == NULL || pcd->getPetType() != PetManager::CREATUREPET) { continue; } if (++currentlySpawned >= maxPets) { player->sendSystemMessage("@pet/pet_menu:too_many"); // You can't control any more pets. Store one first return; } spawnedLevel += object->getLevel(); if ((spawnedLevel + level) >= maxLevelofPets) { player->sendSystemMessage("Taming this pet would exceed your control level ability."); return; } } } if (force && !ghost->isPrivileged()) force = false; ChatManager* chatManager = player->getZoneServer()->getChatManager(); chatManager->broadcastMessage(player, "@hireling/hireling:taming_1"); // Easy. Locker clocker(creature); int mask = creature->getPvpStatusBitmask(); creature->setPvpStatusBitmask(0, true); if (creature->isAiAgent()) { AiAgent* agent = cast<AiAgent*>(creature); agent->activateLoad("wait"); } ManagedReference<TameCreatureTask*> task = new TameCreatureTask(creature, player, mask, force); player->addPendingTask("tame_pet", task, 8000); }
void GroupObjectImplementation::startChatRoom() { Reference<CreatureObject*> leader = groupMembers.get(0).get().castTo<CreatureObject*>(); ChatManager* chatManager = server->getZoneServer()->getChatManager(); chatRoom = chatManager->createGroupRoom(getObjectID(), leader); }
bool FactionRecruiterContainerComponent::transferObject(SceneObject* sceneObject, SceneObject* object, int containmentType, bool notifyClient, bool allowOverflow) { CoaMessageDataComponent* data = object->getDataObjectComponent()->castTo<CoaMessageDataComponent*>(); if (data == NULL) { return false; } CreatureObject* player = object->getParentRecursively(SceneObjectType::PLAYERCREATURE).get().castTo<CreatureObject*>(); if (player == NULL) { return false; } ZoneServer* zoneServer = player->getZoneServer(); PlayerObject* ghost = player->getPlayerObject(); if (zoneServer == NULL || ghost == NULL) { return false; } if (!sceneObject->isAiAgent()) { return false; } AiAgent* recruiter = cast<AiAgent*>(sceneObject); String recruiterFaction = recruiter->getFactionString().toLowerCase(); bool hasBadge = ghost->hasBadge(Badge::EVENT_PROJECT_DEAD_EYE_1); String faction = data->getFaction().toLowerCase(); StringBuffer response; response << "@encoded_disk/message_fragment:response_event"; if (faction == "rebel") { response << "reb1_"; } else if (faction == "imperial") { response << "imp1_"; } response << recruiterFaction; ChatManager* chatManager = zoneServer->getChatManager(); if (chatManager == NULL) { return false; } Locker locker(recruiter); chatManager->broadcastMessage(recruiter,response.toString(), 0, 0, 0); object->destroyObjectFromWorld(true); object->destroyObjectFromDatabase(); int credits = System::random(500) + 500; player->sendSystemMessage("You receive " + String::valueOf(credits) + " credits."); player->addCashCredits(credits, true); if (!hasBadge) { ghost->awardBadge(Badge::EVENT_PROJECT_DEAD_EYE_1); ghost->increaseFactionStanding(recruiterFaction, 500); } return true; }
void GroupObjectImplementation::startChatRoom(CreatureObject* leader) { ChatManager* chatManager = server->getZoneServer()->getChatManager(); chatRoom = chatManager->createGroupRoom(getObjectID(), leader); }