void GroupObjectImplementation::removeMember(SceneObject* member) { ManagedReference<SceneObject*> obj = member; for (int i = 0; i < groupMembers.size(); i++) { SceneObject* scno = groupMembers.get(i).get().get(); if (scno == member) { GroupObjectDeltaMessage6* grp = new GroupObjectDeltaMessage6(_this.getReferenceUnsafeStaticCast()); grp->startUpdate(1); groupMembers.remove(i, grp); grp->close(); broadcastMessage(grp); } } if (member->isPlayerCreature()) { // Remove member's pets CreatureObject* playerCreature = cast<CreatureObject*>(member); RemovePetsFromGroupTask* task = new RemovePetsFromGroupTask(playerCreature, _this.getReferenceUnsafeStaticCast()); task->execute(); //Close any open Group SUIs. ManagedReference<PlayerObject*> ghost = playerCreature->getPlayerObject(); if (ghost != NULL) { ghost->closeSuiWindowType(SuiWindowType::GROUP_LOOT_RULE); ghost->closeSuiWindowType(SuiWindowType::GROUP_LOOT_CHANGED); ghost->closeSuiWindowType(SuiWindowType::GROUP_LOOT_PICK_LOOTER); } //Reset Master Looter if needed. if (getMasterLooterID() == playerCreature->getObjectID()) { ManagedReference<CreatureObject*> groupLeader = (getLeader()).castTo<CreatureObject*>(); GroupManager::instance()->changeMasterLooter(_this.getReferenceUnsafeStaticCast(), groupLeader, false); } if (hasSquadLeader()) { removeGroupModifiers(playerCreature); } if (playerCreature->getPlayerObject() != NULL) { PlayerObject* ghost = playerCreature->getPlayerObject(); ghost->removeWaypointBySpecialType(WaypointObject::SPECIALTYPE_NEARESTMISSIONFORGROUP); } Zone* zone = playerCreature->getZone(); if (zone != NULL) { scheduleUpdateNearestMissionForGroup(zone->getPlanetCRC()); } } calcGroupLevel(); }
void SuiManager::sendMessageBox(SceneObject* usingObject, SceneObject* player, const String& title, const String& text, const String& okButton, const String& screenplay, const String& callback) { if (usingObject == NULL) return; if (player == NULL || !player->isCreatureObject()) return; CreatureObject* creature = cast<CreatureObject*>(player); PlayerObject* playerObject = creature->getPlayerObject(); if (playerObject != NULL) { ManagedReference<SuiMessageBox*> messageBox = new SuiMessageBox(creature, 0x00); messageBox->setCallback(new LuaSuiCallback(creature->getZoneServer(), screenplay, callback)); messageBox->setPromptTitle(title); messageBox->setPromptText(text); messageBox->setUsingObject(usingObject); messageBox->setOkButton(true, okButton); messageBox->setCancelButton(true, "@cancel"); messageBox->setForceCloseDistance(32.f); creature->sendMessage(messageBox->generateMessage()); playerObject->addSuiBox(messageBox); } }
CreatureObject* CreatureManagerImplementation::spawnCreature(uint32 templateCRC, uint32 objectCRC, float x, float z, float y, uint64 parentID, bool persistent) { CreatureTemplate* creoTempl = creatureTemplateManager->getTemplate(templateCRC); if (creoTempl == NULL) return spawnCreature(objectCRC, x, z, y, parentID); CreatureObject* creature = NULL; String templateToSpawn; if (objectCRC == 0) { templateToSpawn = getTemplateToSpawn(templateCRC); objectCRC = templateToSpawn.hashCode(); } creature = createCreature(objectCRC, persistent, templateCRC); if (creature != NULL && creature->isAiAgent()) { AiAgent* npc = cast<AiAgent*>(creature); npc->loadTemplateData(creoTempl); } else if (creature == NULL) { error("could not spawn template " + templateToSpawn); } placeCreature(creature, x, z, y, parentID); // ensuring the combat level and max HAM is correct. if( creature->isPlayerCreature() ) creature->getPlayerObject()->recalculateCombatLevel(creature); return creature; }
void PlayerZoneComponent::teleport(SceneObject* sceneObject, float newPositionX, float newPositionZ, float newPositionY, uint64 parentID) { //sceneObject->setTeleporting(true); CreatureObject* player = NULL; if (sceneObject->isPlayerCreature()) { player = cast<CreatureObject*>( sceneObject); } if (player != NULL && sceneObject->getParent() != NULL && parentID != 0) { ManagedReference<SceneObject*> par = sceneObject->getParent(); if (par->isVehicleObject() || par->isMount()) { player->executeObjectControllerAction(String("dismount").hashCode()); } } ZoneComponent::teleport(sceneObject, newPositionX, newPositionZ, newPositionY, parentID); if (player != NULL) { PlayerObject* ghost = player->getPlayerObject(); ghost->setTeleporting(true); ghost->updateLastValidatedPosition(); player->setMovementCounter(0); ghost->setClientLastMovementStamp(0); } }
void FactionManager::awardPvpFactionPoints(TangibleObject* killer, CreatureObject* destructedObject) { if (killer->isPlayerCreature() && destructedObject->isPlayerCreature()) { CreatureObject* killerCreature = cast<CreatureObject*>(killer); ManagedReference<PlayerObject*> ghost = killerCreature->getPlayerObject(); ManagedReference<PlayerObject*> killedGhost = destructedObject->getPlayerObject(); if (killer->isRebel() && destructedObject->isImperial()) { ghost->increaseFactionStanding("rebel", 75); ghost->decreaseFactionStanding("imperial", 75); killedGhost->decreaseFactionStanding("imperial", 75); //TODO: find formulas } else if (killer->isImperial() && destructedObject->isRebel()) { ghost->increaseFactionStanding("imperial", 75); ghost->decreaseFactionStanding("rebel", 75); killedGhost->decreaseFactionStanding("rebel", 75); } } else if (destructedObject->isPlayerCreature()) { ManagedReference<PlayerObject*> ghost = destructedObject->getPlayerObject(); if (killer->getFaction() != destructedObject->getFaction()) { if (killer->isRebel() && destructedObject->isImperial()) { ghost->decreaseFactionStanding("imperial", 75); //TODO: find formulas } else if (killer->isImperial() && destructedObject->isRebel()) { ghost->decreaseFactionStanding("rebel", 75); } } } }
void SuiManager::sendInputBox(SceneObject* terminal, SceneObject* player, const String& play, const String& callback, const String& prompt, const String& button) { if (terminal == NULL) return; if (player == NULL || !player->isCreatureObject()) return; CreatureObject* creature = cast<CreatureObject*>(player); PlayerObject* playerObject = creature->getPlayerObject(); if (playerObject != NULL) { ManagedReference<SuiInputBox*> confirmSui = new SuiInputBox(creature, 0x00); confirmSui->setCallback(new LuaSuiCallback(creature->getZoneServer(), play, callback)); confirmSui->setUsingObject(terminal); confirmSui->setPromptText(prompt); confirmSui->setOkButton(true, button); confirmSui->setOtherButton(false, ""); confirmSui->setCancelButton(false, ""); confirmSui->setForceCloseDistance(32); creature->sendMessage(confirmSui->generateMessage()); playerObject->addSuiBox(confirmSui); } }
void SuiManager::sendListBox(SceneObject* usingObject, SceneObject* player, const String& title, const String& text, const uint8& numOfButtons, const String& cancelButton, const String& otherButton, const String& okButton, LuaObject& options, const String& screenplay, const String& callback) { if (usingObject == NULL) return; if (player == NULL || !player->isCreatureObject()) return; CreatureObject* creature = cast<CreatureObject*>(player); PlayerObject* playerObject = creature->getPlayerObject(); if (playerObject != NULL) { ManagedReference<SuiListBox*> box = NULL; switch (numOfButtons) { case 1: box = new SuiListBox(creature, 0x00, SuiListBox::HANDLESINGLEBUTTON); box->setCancelButton(false, ""); box->setOtherButton(false, ""); box->setOkButton(true, okButton); break; case 2: box = new SuiListBox(creature, 0x00, SuiListBox::HANDLETWOBUTTON); box->setCancelButton(true, cancelButton); box->setOtherButton(false, ""); box->setOkButton(true, okButton); break; case 3: box = new SuiListBox(creature, 0x00, SuiListBox::HANDLETHREEBUTTON); box->setCancelButton(true, cancelButton); box->setOtherButton(true, otherButton); box->setOkButton(true, okButton); break; default: return; break; } if(options.isValidTable()){ for(int i = 1; i <= options.getTableSize(); ++i){ String optionString = options.getStringAt(i); box->addMenuItem(optionString); } options.pop(); } box->setCallback(new LuaSuiCallback(creature->getZoneServer(), screenplay, callback)); box->setPromptTitle(title); box->setPromptText(text); box->setUsingObject(usingObject); box->setForceCloseDistance(32.f); creature->sendMessage(box->generateMessage()); playerObject->addSuiBox(box); } }
void PlayerZoneComponent::updateZoneWithParent(SceneObject* sceneObject, SceneObject* newParent, bool lightUpdate, bool sendPackets) { ZoneComponent::updateZoneWithParent(sceneObject, newParent, lightUpdate, sendPackets); if (sceneObject->getParent() != NULL && sceneObject->isPlayerCreature()) { CreatureObject* player = cast<CreatureObject*>( sceneObject); PlayerObject* ghost = player->getPlayerObject(); ghost->setSavedParentID(sceneObject->getParentID()); } }
/** * Is called when an object was removed * @param object object that has been inserted */ int PlayerContainerComponent::notifyObjectRemoved(SceneObject* sceneObject, SceneObject* object, SceneObject* destination) { CreatureObject* creo = dynamic_cast<CreatureObject*>(sceneObject); if (object->isArmorObject()) { PlayerManager* playerManager = creo->getZoneServer()->getPlayerManager(); playerManager->removeEncumbrancies(creo, cast<ArmorObject*>(object)); } if (object->isTangibleObject()) { TangibleObject* tano = cast<TangibleObject*>(object); tano->removeSkillModsFrom(creo); } if (object->isInstrument()) { if (creo->isPlayingMusic()) creo->stopEntertaining(); } if (creo->getPlayerObject().get() != NULL && creo->getPlayerObject()->isJedi()) { if ((object->isRobeObject() && cast<RobeObject*>( object)->getSkillRequired() != "") || (object->isWeaponObject() && cast<WeaponObject*>(object)->isJediWeapon())) VisibilityManager::instance()->increaseVisibility(creo); } //this it to update the equipment list //we need a DeltaVector with all the slotted objects it seems /*CreatureObjectMessage6* msg6 = new CreatureObjectMessage6(creo); creo->broadcastMessage(msg6, true, true);*/ if (object->isTangibleObject() && object->getArrangementDescriptorSize() != 0 && object->getArrangementDescriptor(0).size() != 0) { String arrangement = object->getArrangementDescriptor(0).get(0); //CHK if (arrangement != "mission_bag" && arrangement != "ghost" && arrangement != "bank") { creo->removeWearableObject(cast<TangibleObject*>(object), true); } } if (creo != NULL && object->isTangibleObject()) { ManagedReference<TangibleObject*> tano = cast<TangibleObject*>(object); tano->removeTemplateSkillMods(creo); } return ContainerComponent::notifyObjectRemoved(sceneObject, object, destination); }
/** * Is called when this object has been inserted with an object * @param object object that has been inserted */ int PlayerContainerComponent::notifyObjectInserted(SceneObject* sceneObject, SceneObject* object) const { CreatureObject* creo = dynamic_cast<CreatureObject*>(sceneObject); if (creo == NULL) { return 0; } if (object->isArmorObject()) { PlayerManager* playerManager = sceneObject->getZoneServer()->getPlayerManager(); playerManager->applyEncumbrancies(creo, cast<ArmorObject*>(object)); } if (object->isTangibleObject()) { TangibleObject* tano = cast<TangibleObject*>(object); tano->applySkillModsTo(creo); } if (object->isInstrument() && creo->isEntertaining()) creo->stopEntertaining(); //this it to update the equipment list //we need a DeltaVector with all the slotted objects it seems /*CreatureObjectMessage6* msg6 = new CreatureObjectMessage6(creo); creo->broadcastMessage(msg6, true, true);*/ if (object->isTangibleObject() && object->getArrangementDescriptorSize() != 0 && object->getArrangementDescriptor(0)->size() != 0) { const String& arrangement = object->getArrangementDescriptor(0)->get(0); if (arrangement != "mission_bag" && arrangement != "ghost" && arrangement != "bank") { creo->addWearableObject(object->asTangibleObject(), true); } } if (object->isTangibleObject()) { ManagedReference<TangibleObject*> tano = object->asTangibleObject(); tano->addTemplateSkillMods(creo); } // Jedi stuff below. PlayerObject* ghost = creo->getPlayerObject(); if (ghost && ghost->isJedi()) { if (object->isRobeObject()) { ghost->recalculateForcePower(); } else if (object->isWeaponObject()) { WeaponObject* weaponObject = cast<WeaponObject*>(object); if (weaponObject->isJediWeapon()) { VisibilityManager::instance()->increaseVisibility(creo, VisibilityManager::SABERVISMOD); } } } return ContainerComponent::notifyObjectInserted(sceneObject, object); }
/** * Is called when an object was removed * @param object object that has been inserted */ int PlayerContainerComponent::notifyObjectRemoved(SceneObject* sceneObject, SceneObject* object, SceneObject* destination) const { CreatureObject* creo = dynamic_cast<CreatureObject*>(sceneObject); if (creo == NULL) { return 0; } if (object->isArmorObject()) { PlayerManager* playerManager = creo->getZoneServer()->getPlayerManager(); playerManager->removeEncumbrancies(creo, cast<ArmorObject*>(object)); } if (object->isTangibleObject()) { TangibleObject* tano = cast<TangibleObject*>(object); tano->removeSkillModsFrom(creo); } if (object->isInstrument()) { if (creo->isPlayingMusic()) creo->stopEntertaining(); } //this it to update the equipment list //we need a DeltaVector with all the slotted objects it seems /*CreatureObjectMessage6* msg6 = new CreatureObjectMessage6(creo); creo->broadcastMessage(msg6, true, true);*/ if (object->isTangibleObject() && object->getArrangementDescriptorSize() != 0 && object->getArrangementDescriptor(0)->size() != 0) { const String& arrangement = object->getArrangementDescriptor(0)->get(0); //CHK if (arrangement != "mission_bag" && arrangement != "ghost" && arrangement != "bank") { creo->removeWearableObject(object->asTangibleObject(), true); } } if (object->isTangibleObject()) { ManagedReference<TangibleObject*> tano = object->asTangibleObject(); tano->removeTemplateSkillMods(creo); } // Jedi stuff below. PlayerObject* ghost = creo->getPlayerObject(); if (ghost && ghost->isJedi()) { if (object->isRobeObject()) { ghost->recalculateForcePower(); } } return ContainerComponent::notifyObjectRemoved(sceneObject, object, destination); }
int DestroyStructureSessionImplementation::initializeSession() { //TODO: Temporary until CreatureObject* dependency removed. if (!creatureObject->isPlayerCreature()) return cancelSession(); creatureObject->addActiveSession(SessionFacadeType::DESTROYSTRUCTURE, _this.getReferenceUnsafeStaticCast()); Locker _lock(structureObject, creatureObject); CreatureObject* player = cast<CreatureObject*>( creatureObject.get()); String no = "\\#FF6347 @player_structure:can_redeed_no_suffix \\#."; String yes = "\\#32CD32 @player_structure:can_redeed_yes_suffix \\#."; String redeed = (structureObject->isRedeedable()) ? yes : no; StringBuffer maint; maint << "@player_structure:redeed_maintenance \\#" << ((structureObject->isRedeedable()) ? "32CD32 " : "FF6347 ") << structureObject->getSurplusMaintenance() << "/" << structureObject->getRedeedCost() << "\\#."; StringBuffer entry; entry << "@player_structure:confirm_destruction_d1 "; entry << "@player_structure:confirm_destruction_d2 \n\n"; entry << "@player_structure:confirm_destruction_d3a "; entry << "\\#32CD32 @player_structure:confirm_destruction_d3b \\#. "; entry << "@player_structure:confirm_destruction_d4 \n"; entry << "@player_structure:redeed_confirmation " << redeed; StringBuffer cond; cond << "@player_structure:redeed_condition \\#32CD32 " << (structureObject->getMaxCondition() - structureObject->getConditionDamage()) << "/" << structureObject->getMaxCondition() << "\\#."; ManagedReference<SuiListBox*> sui = new SuiListBox(player); sui->setCallback(new DestroyStructureRequestSuiCallback(creatureObject->getZoneServer())); sui->setCancelButton(true, "@no"); sui->setOkButton(true, "@yes"); sui->setUsingObject(structureObject); sui->setPromptTitle(structureObject->getDisplayedName()); sui->setPromptText(entry.toString()); sui->addMenuItem("@player_structure:can_redeed_alert " + redeed); sui->addMenuItem(cond.toString()); sui->addMenuItem(maint.toString()); player->getPlayerObject()->addSuiBox(sui); player->sendMessage(sui->generateMessage()); return 0; }
void SuiManager::sendTransferBox(SceneObject* usingObject, SceneObject* player, const String& title, const String& text, LuaObject& optionsAddFrom, LuaObject& optionsAddTo, const String& screenplay, const String& callback) { if (usingObject == NULL) return; if (player == NULL || !player->isCreatureObject()) return; CreatureObject* creature = cast<CreatureObject*>(player); PlayerObject* playerObject = creature->getPlayerObject(); if (playerObject != NULL) { ManagedReference<SuiTransferBox*> box = NULL; box = new SuiTransferBox(creature, 0x00); if(optionsAddFrom.isValidTable()){ String optionAddFromTextString = optionsAddFrom.getStringAt(1); String optionAddFromStartingString = optionsAddFrom.getStringAt(2); String optionAddFromRatioString = optionsAddFrom.getStringAt(3); box->addFrom(optionAddFromTextString, optionAddFromStartingString, optionAddFromStartingString, optionAddFromRatioString); optionsAddFrom.pop(); } if(optionsAddTo.isValidTable()){ String optionAddToTextString = optionsAddTo.getStringAt(1); String optionAddToStartingString = optionsAddTo.getStringAt(2); String optionAddToRatioString = optionsAddTo.getStringAt(3); box->addTo(optionAddToTextString, optionAddToStartingString, optionAddToStartingString, optionAddToRatioString); optionsAddTo.pop(); } box->setCallback(new LuaSuiCallback(creature->getZoneServer(), screenplay, callback)); box->setPromptTitle(title); box->setPromptText(text); box->setUsingObject(usingObject); box->setForceCloseDistance(32.f); creature->sendMessage(box->generateMessage()); playerObject->addSuiBox(box); } }
void SuiManager::sendKeypadSui(SceneObject* keypad, SceneObject* creatureSceneObject, const String& play, const String& callback) { if (keypad == NULL) return; if (creatureSceneObject == NULL || !creatureSceneObject->isCreatureObject()) return; CreatureObject* creature = cast<CreatureObject*>(creatureSceneObject); PlayerObject* playerObject = creature->getPlayerObject(); if (playerObject != NULL) { ManagedReference<SuiKeypadBox*> keypadSui = new SuiKeypadBox(creature, 0x00); keypadSui->setCallback(new LuaSuiCallback(creature->getZoneServer(), play, callback)); keypadSui->setUsingObject(keypad); keypadSui->setForceCloseDisabled(); creature->sendMessage(keypadSui->generateMessage()); playerObject->addSuiBox(keypadSui); } }
void PlayerZoneComponent::switchZone(SceneObject* sceneObject, const String& newTerrainName, float newPostionX, float newPositionZ, float newPositionY, uint64 parentID) { if (sceneObject->isPlayerCreature()) { CreatureObject* player = cast<CreatureObject*>( sceneObject); PlayerObject* ghost = player->getPlayerObject(); ManagedReference<SceneObject*> par = sceneObject->getParent(); if (par != NULL && (par->isVehicleObject() || par->isMount())) { player->executeObjectControllerAction(String("dismount").hashCode()); } ghost->setSavedParentID(0); ghost->setTeleporting(true); ghost->updateLastValidatedPosition(); player->setMovementCounter(0); ghost->setClientLastMovementStamp(0); ghost->unloadSpawnedChildren(); } ZoneComponent::switchZone(sceneObject, newTerrainName, newPostionX, newPositionZ, newPositionY, parentID); }
int DestroyStructureSessionImplementation::sendDestroyCode() { //TODO: Temporary until CreatureObject* dependency removed. if (!creatureObject->isPlayerCreature()) return cancelSession(); Locker structureLock(structureObject); Locker _lock(creatureObject, structureObject); CreatureObject* player = cast<CreatureObject*>( creatureObject.get()); destroyCode = System::random(899999) + 100000; String no = "\\#FF6347 @player_structure:will_not_redeed_confirm \\#."; String yes = "\\#32CD32 @player_structure:will_redeed_confirm \\#."; String redeed = (structureObject->isRedeedable()) ? yes : no; StringBuffer entry; entry << "@player_structure:your_structure_prefix "; entry << redeed << " @player_structure:will_redeed_suffix \n\n"; entry << "Code: " << destroyCode; ManagedReference<SuiInputBox*> sui = new SuiInputBox(player); sui->setCallback(new DestroyStructureCodeSuiCallback(player->getZoneServer())); sui->setUsingObject(structureObject); sui->setPromptTitle("@player_structure:confirm_destruction_t"); //Confirm Structure Deletion sui->setPromptText(entry.toString()); sui->setCancelButton(true, "@cancel"); sui->setMaxInputSize(6); player->getPlayerObject()->addSuiBox(sui); player->sendMessage(sui->generateMessage()); return 0; }
void FsVillageAreaImplementation::notifyEnter(SceneObject* player) { ActiveAreaImplementation::notifyEnter(player); if (!player->isPlayerCreature()) { return; } float x = player->getPositionX(); float y = player->getPositionY(); float diffY = y - getPositionY(); float diffX = x - getPositionX(); float angle = atan2(diffY == 0.f ? 1 : diffY, diffX == 0.f ? 1 : diffX); CreatureObject* playerCreature = cast<CreatureObject*>(player); PlayerObject* ghost = playerCreature->getPlayerObject(); float rad = getRadius() * 1.05; float newPosX = getPositionX() + (cos(angle) * rad); float newPosY = getPositionY() + (sin(angle) * rad); // Those who aren't a valid player, do not currently have or have had the Village elder quest cannot enter. if (ghost != NULL) { if (ghost->hasGodMode()) return; if (!ghost->hasActiveQuestBitSet(PlayerQuestData::FS_VILLAGE_ELDER) && !ghost->hasCompletedQuestsBitSet(PlayerQuestData::FS_VILLAGE_ELDER)) { playerCreature->teleport(newPosX, getZone()->getHeight(newPosX, newPosY), newPosY, 0); playerCreature->sendSystemMessage("@base_player:fs_village_unavailable"); } else if (playerCreature->isInCombat()) { playerCreature->teleport(newPosX, getZone()->getHeight(newPosX, newPosY), newPosY, 0); playerCreature->sendSystemMessage("@base_player:fs_village_no_combat"); } } }
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); }
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() ); } } }
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; }
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); }