int BountyMissionObjectiveImplementation::handleNpcTargetReceivesDamage(ManagedObject* arg1) { CreatureObject* target = NULL; target = cast<CreatureObject*>(arg1); ManagedReference<MissionObject* > mission = this->mission.get(); ManagedReference<CreatureObject*> owner = getPlayerOwner(); if (owner != NULL && target != NULL && target->getFirstName() == owner->getFirstName() && target->isPlayerCreature() && objectiveStatus == HASBIOSIGNATURESTATUS) { updateMissionStatus(mission->getMissionLevel()); String diffString = "easy"; if (mission->getMissionLevel() == 3) { diffString = "hard"; } else if (mission->getMissionLevel() == 2) { diffString = "medium"; } target->getZoneServer()->getChatManager()->broadcastMessage(npcTarget, "@mission/mission_bounty_neutral_" + diffString + ":m" + String::valueOf(mission->getMissionNumber()) + "v", 0, 0, 0); return 1; } return 0; }
void ManufactureSchematicImplementation::sendBaselinesTo(SceneObject* player) { ManagedReference<DraftSchematic* > draftSchematic = this->draftSchematic; if (!player->isPlayerCreature() || draftSchematic == NULL) return; CreatureObject* playerCreature = cast<CreatureObject*>( player); ManufactureSchematicObjectMessage3* msco3; if(prototype != NULL) msco3 = new ManufactureSchematicObjectMessage3(_this.getReferenceUnsafeStaticCast(), playerCreature->getFirstName()); else msco3 = new ManufactureSchematicObjectMessage3(getObjectID(), complexity, playerCreature->getFirstName()); player->sendMessage(msco3); // MSCO6 ManufactureSchematicObjectMessage6* msco6 = new ManufactureSchematicObjectMessage6(getObjectID(), draftSchematic->getClientObjectCRC()); player->sendMessage(msco6); // MSCO8 ManufactureSchematicObjectMessage8* msco8 = new ManufactureSchematicObjectMessage8(getObjectID()); player->sendMessage(msco8); // MSCO9 ManufactureSchematicObjectMessage9* msco9 = new ManufactureSchematicObjectMessage9(getObjectID()); player->sendMessage(msco9); }
void GroupManager::makeLeader(GroupObject* group, CreatureObject* player, CreatureObject* newLeader) { // Pre: player locked // Post: player locked player->unlock(); try { group->wlock(); if (group->getLeader() != player) { player->sendSystemMessage("@group:must_be_leader"); group->unlock(); player->wlock(); return; } if (!group->hasMember(newLeader) || !newLeader->isPlayerCreature()) { group->unlock(); player->wlock(); return; } group->makeLeader(newLeader); String firstNameLeader; firstNameLeader = "[Offline player]"; if (newLeader->isPlayerCreature()) { CreatureObject* playerLeader = cast<CreatureObject*>( newLeader); if (playerLeader->isOnline()) firstNameLeader= playerLeader->getFirstName(); } StringIdChatParameter message; message.setStringId("group", "new_leader"); // %TU is now the group leader. message.setTU(newLeader); for (int i = 0; i < group->getGroupSize(); i++) { Reference<CreatureObject*> play = ( group->getGroupMember(i)).castTo<CreatureObject*>(); if (play->isPlayerCreature()) play->sendSystemMessage(message); } group->unlock(); } catch (...) { group->unlock(); player->wlock(); throw; } player->wlock(); }
void BountyMissionObjectiveImplementation::handleNpcTargetKilled(ManagedObject* arg1) { CreatureObject* attacker = NULL; attacker = cast<CreatureObject*>(arg1); ManagedReference<MissionObject* > mission = this->mission.get(); ManagedReference<CreatureObject*> owner = getPlayerOwner(); if (owner == NULL) return; if (attacker != NULL && attacker->getFirstName() == owner->getFirstName() && attacker->isPlayerCreature()) { //Target killed by player, complete mission. complete(); } else { //Target killed by other player, fail mission. owner->sendSystemMessage("@mission/mission_generic:failed"); // Mission failed abort(); removeMissionFromPlayer(); } }
void StructurePermissionList::sendTo(CreatureObject* creature, const String& listName) { ZoneServer* zoneServer = creature->getZoneServer(); ReadLocker locker(&lock); if (!idPermissionLists.contains(listName)) { return; } PermissionListCreateMessage* listMsg = new PermissionListCreateMessage(listName); SortedVector<uint64>* list = &idPermissionLists.get(listName); Vector<uint64> invalidIDs; for (int i = 0; i < list->size(); ++i) { Reference<SceneObject*> object = zoneServer->getObject(list->get(i)); if (object != NULL && object->isPlayerCreature()) { CreatureObject* player = object.castTo<CreatureObject*>(); String name = player->getFirstName(); listMsg->addName(name); } else if (object != NULL && object->isGuildObject()) { GuildObject* guild = object.castTo<GuildObject*>(); String name = "guild:" + guild->getGuildAbbrev(); listMsg->addName(name); } else { invalidIDs.add(list->get(i)); } } for (int i = 0; i < invalidIDs.size(); i++) { list->drop(invalidIDs.get(i)); } listMsg->generateMessage(); creature->sendMessage(listMsg); }
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 PlayerContainerComponent::canAddObject(SceneObject* sceneObject, SceneObject* object, int containmentType, String& errorDescription) { CreatureObject* creo = dynamic_cast<CreatureObject*>(sceneObject); if (object->isTangibleObject() && containmentType == 4) { TangibleObject* wearable = cast<TangibleObject*>( object); SharedTangibleObjectTemplate* tanoData = dynamic_cast<SharedTangibleObjectTemplate*>(wearable->getObjectTemplate()); Vector<uint32>* races = tanoData->getPlayerRaces(); String race = creo->getObjectTemplate()->getFullTemplateString(); if (!races->contains(race.hashCode())) { errorDescription = "You lack the necessary requirements to wear this object"; return TransferErrorCode::PLAYERUSEMASKERROR; } if (creo->isPlayerCreature()) { if (!wearable->isNeutral()) { ManagedReference<PlayerObject*> playerObject = creo->getPlayerObject(); if (wearable->isImperial() && (playerObject->getFactionStatus() == FactionStatus::ONLEAVE || !creo->isImperial())) { errorDescription = "You lack the necessary requirements to wear this object"; return TransferErrorCode::PLAYERUSEMASKERROR; } if (wearable->isRebel() && (playerObject->getFactionStatus() == FactionStatus::ONLEAVE || !creo->isRebel())) { errorDescription = "You lack the necessary requirements to wear this object"; return TransferErrorCode::PLAYERUSEMASKERROR; } } } } if (object->isArmorObject() && containmentType == 4) { PlayerManager* playerManager = sceneObject->getZoneServer()->getPlayerManager(); if (!playerManager->checkEncumbrancies(dynamic_cast<CreatureObject*>(sceneObject), cast<ArmorObject*>( object))) { errorDescription = "You lack the necessary secondary stats to equip this item"; return TransferErrorCode::NOTENOUGHENCUMBRANCE; } } if (object->isRobeObject() && containmentType == 4) { ManagedReference<RobeObject*> robe = cast<RobeObject*>( object); String skillRequired = robe->getSkillRequired(); if (!creo->hasSkill(skillRequired) && skillRequired != ""){ errorDescription = "You are not eligible to wear this robe."; return TransferErrorCode::PLAYERUSEMASKERROR; } } if (object->isWeaponObject() && containmentType == 4) { ManagedReference<WeaponObject*> weapon = cast<WeaponObject*>( object); int bladeColor = weapon->getBladeColor(); if (weapon->isJediWeapon()){ if (bladeColor == 31) { errorDescription = "@jedi_spam:lightsaber_no_color"; return TransferErrorCode::PLAYERUSEMASKERROR; } if (weapon->getCraftersName() != creo->getFirstName()) { errorDescription = "@jedi_spam:not_your_lightsaber"; return TransferErrorCode::PLAYERUSEMASKERROR; } } } return ContainerComponent::canAddObject(sceneObject, object, containmentType, errorDescription); }
int PlayerContainerComponent::canAddObject(SceneObject* sceneObject, SceneObject* object, int containmentType, String& errorDescription) { CreatureObject* creo = dynamic_cast<CreatureObject*>(sceneObject); if (object->isTangibleObject() && containmentType == 4) { TangibleObject* wearable = cast<TangibleObject*>( object); SharedTangibleObjectTemplate* tanoData = dynamic_cast<SharedTangibleObjectTemplate*>(wearable->getObjectTemplate()); Vector<uint32>* races = tanoData->getPlayerRaces(); String race = creo->getObjectTemplate()->getFullTemplateString(); if (!races->contains(race.hashCode())) { errorDescription = "You lack the necessary requirements to wear this object"; return TransferErrorCode::PLAYERUSEMASKERROR; } if (creo->isPlayerCreature()) { if (!wearable->isNeutral()) { ManagedReference<PlayerObject*> playerObject = creo->getPlayerObject(); if (wearable->isImperial() && (playerObject->getFactionStatus() == FactionStatus::ONLEAVE || !creo->isImperial())) { errorDescription = "You lack the necessary requirements to wear this object"; return TransferErrorCode::PLAYERUSEMASKERROR; } if (wearable->isRebel() && (playerObject->getFactionStatus() == FactionStatus::ONLEAVE || !creo->isRebel())) { errorDescription = "You lack the necessary requirements to wear this object"; return TransferErrorCode::PLAYERUSEMASKERROR; } } } } if (object->isArmorObject() && containmentType == 4) { PlayerManager* playerManager = sceneObject->getZoneServer()->getPlayerManager(); if (!playerManager->checkEncumbrancies(dynamic_cast<CreatureObject*>(sceneObject), cast<ArmorObject*>( object))) { errorDescription = "You lack the necessary secondary stats to equip this item"; return TransferErrorCode::NOTENOUGHENCUMBRANCE; } } if (object->isWearableObject() && containmentType == 4) { ManagedReference<WearableObject*> wearable = cast<WearableObject*>( object); SharedTangibleObjectTemplate* wearableData = dynamic_cast<SharedTangibleObjectTemplate*>(wearable->getObjectTemplate()); Vector<String> skillsRequired = wearableData->getCertificationsRequired(); if (skillsRequired.size() > 0) { bool hasSkill = false; for (int i = 0; i < skillsRequired.size(); i++) { String skill = skillsRequired.get(i); if (!skill.isEmpty() && creo->hasSkill(skill)) { hasSkill = true; break; } } if (!hasSkill) { errorDescription = "@error_message:insufficient_skill"; // You lack the skill to use this item. return TransferErrorCode::PLAYERUSEMASKERROR; } } } if (object->isWeaponObject() && containmentType == 4) { ManagedReference<WeaponObject*> weapon = cast<WeaponObject*>( object); int bladeColor = weapon->getBladeColor(); if (weapon->isJediWeapon()){ if (bladeColor == 31) { errorDescription = "@jedi_spam:lightsaber_no_color"; return TransferErrorCode::PLAYERUSEMASKERROR; } if (weapon->getCraftersName() != creo->getFirstName()) { errorDescription = "@jedi_spam:not_your_lightsaber"; return TransferErrorCode::PLAYERUSEMASKERROR; } } } return ContainerComponent::canAddObject(sceneObject, object, containmentType, errorDescription); }
void ChatManagerImplementation::broadcastMessage(CreatureObject* player, const UnicodeString& message, uint64 target, uint32 moodid, uint32 mood2) { Zone* zone = player->getZone(); PlayerObject* myGhost = NULL; bool godMode = false; if (zone == NULL) return; int language = 0; String firstName; if (player->isPlayerCreature() /*|| !((Player *)player)->isChatMuted() */) { CreatureObject* playerCreature = cast<CreatureObject*>(player); if (playerCreature) { firstName = playerCreature->getFirstName().toLowerCase(); myGhost = playerCreature->getPlayerObject(); } if (myGhost) language = myGhost->getLanguageID(); } if (myGhost) { if (myGhost->hasGodMode()) godMode = true; } StringIdChatParameter* param = NULL; if (message[0] == '@' && message.indexOf(":") != -1) { param = new StringIdChatParameter(message.toString()); } CloseObjectsVector* closeObjects = (CloseObjectsVector*) player->getCloseObjects(); SortedVector<QuadTreeEntry*> closeEntryObjects(200, 50); if (closeObjects != NULL) { closeObjects->safeCopyTo(closeEntryObjects); } else { player->info("Null closeobjects vector in ChatManager::broadcastMessage", true); zone->getInRangeObjects(player->getWorldPositionX(), player->getWorldPositionY(), 128, &closeEntryObjects, true); } float range = defaultSpatialChatDistance; float specialRange = spatialChatDistances.get(mood2); if (specialRange != -1) { range = specialRange; } try { for (int i = 0; i < closeEntryObjects.size(); ++i) { SceneObject* object = cast<SceneObject*>(closeEntryObjects.get(i)); if (player->isInRange(object, range)) { //Notify observers that are expecting spatial chat. if (object->getObserverCount(ObserverEventType::SPATIALCHATRECEIVED)) { ManagedReference<ChatMessage*> chatMessage = new ChatMessage(); chatMessage->setString(message.toString()); EXECUTE_TASK_3(object, chatMessage, player, { if (player_p == NULL || object_p == NULL) return; Locker locker(object_p); SortedVector<ManagedReference<Observer*> > observers = object_p->getObservers(ObserverEventType::SPATIALCHATRECEIVED); for (int oc = 0; oc < observers.size(); oc++) { Observer* observer = observers.get(oc); Locker clocker(observer, object_p); if (observer->notifyObserverEvent(ObserverEventType::SPATIALCHATRECEIVED, object_p, chatMessage_p, player_p->getObjectID()) == 1) object_p->dropObserver(ObserverEventType::SPATIALCHATRECEIVED, observer); } }); } if (object->isPlayerCreature()) { CreatureObject* creature = cast<CreatureObject*>(object); PlayerObject* ghost = creature->getPlayerObject(); if (ghost == NULL) continue; if (!ghost->isIgnoring(firstName) || godMode) { SpatialChat* cmsg = NULL; if (param == NULL) { cmsg = new SpatialChat(player->getObjectID(), creature->getObjectID(), message, target, moodid, mood2, language); } else { cmsg = new SpatialChat(player->getObjectID(), creature->getObjectID(), *param, target, moodid, mood2); } creature->sendMessage(cmsg); } } else if( object->isPet() ){ AiAgent* pet = cast<AiAgent*>(object); if (pet == NULL ) continue; if( pet->isDead() || pet->isIncapacitated() ) continue; PetManager* petManager = server->getPetManager(); Locker clocker(pet, player); petManager->handleChat( player, pet, message.toString() ); } } }