ManagedWeakReference<SceneObject*> SceneObjectImplementation::getRootParent() { ManagedReference<SceneObject*> grandParent = getParent(); ManagedReference<SceneObject*> tempParent = NULL; if (grandParent == NULL) return NULL; #ifdef DEBUG_GETROOT_PARENT SortedVector<ManagedReference<SceneObject*> > parents; parents.setNoDuplicateInsertPlan(); #endif while ((tempParent = grandParent->getParent()) != NULL && grandParent != asSceneObject()) { grandParent = tempParent; #ifdef DEBUG_GETROOT_PARENT if (parents.contains(grandParent)) return NULL; else parents.put(grandParent); #endif } if (grandParent == asSceneObject()) return NULL; ManagedWeakReference<SceneObject*> weak = grandParent.get(); return weak; }
int StructurePermissionList::togglePermission(const String& listName, const String& playerName, bool caseSensitive) { Locker locker(&lock); if(playerName == ownerName) return CANTCHANGEOWNER; if (!permissionLists.contains(listName)) return LISTNOTFOUND; SortedVector<String>* list = &permissionLists.get(listName); String name = ""; if (caseSensitive) name = playerName; else name = playerName.toLowerCase(); //If they exist, remove them. if (list->contains(name)) { list->drop(name); return REVOKED; } list->put(name); return GRANTED; }
void GroupObjectImplementation::updatePvPStatusNearCreature(CreatureObject* creature) { CloseObjectsVector* creatureCloseObjects = (CloseObjectsVector*) creature->getCloseObjects(); SortedVector<QuadTreeEntry*> closeObjectsVector; creatureCloseObjects->safeCopyReceiversTo(closeObjectsVector, CloseObjectsVector::CREOTYPE); for (int i = 0; i < groupMembers.size(); i++) { CreatureObject* member = groupMembers.get(i).get().get(); if (closeObjectsVector.contains(member)) { if (creature->isPlayerCreature()) member->sendPvpStatusTo(creature); if (member->isPlayerCreature()) creature->sendPvpStatusTo(member); } } }
int StructurePermissionList::togglePermission(const String& listName, const uint64 objectID) { Locker locker(&lock); if(objectID == ownerID) return CANTCHANGEOWNER; if (!idPermissionLists.contains(listName)) return LISTNOTFOUND; SortedVector<uint64>* list = &idPermissionLists.get(listName); //If they exist, remove them. if (list->contains(objectID)) { list->drop(objectID); return REVOKED; } list->put(objectID); return GRANTED; }
void CityRegionImplementation::cleanupCitizens() { Locker slocker(&structureListMutex); SortedVector<uint64> ownerIds; ownerIds.setNoDuplicateInsertPlan(); for (int i = 0; i < completeStructureList.size(); ++i) { uint64 oid = completeStructureList.get(i); ManagedReference<BuildingObject*> building = Core::getObjectBroker()->lookUp(oid).castTo<BuildingObject*>(); if (building != NULL) { if (building->isResidence()) { uint64 owner = building->getOwnerObjectID(); ownerIds.put(owner); } } } SortedVector<uint64> removeIds; removeIds.setNoDuplicateInsertPlan(); for (int i = 0; i < citizenList.size(); ++i) { uint64 id = citizenList.get(i); if (!ownerIds.contains(id)) removeIds.put(id); else if (isBanned(id)) removeBannedPlayer(id); } for (int i = 0; i < removeIds.size(); ++i) { removeCitizen(removeIds.get(i)); } if(getMayorID() != 0 && !isCitizen(getMayorID())) addCitizen(getMayorID()); }
bool SkillManager::surrenderSkill(const String& skillName, CreatureObject* creature, bool notifyClient) { Skill* skill = skillMap.get(skillName.hashCode()); if (skill == NULL) return false; Locker locker(creature); SkillList* skillList = creature->getSkillList(); if(skillName == "force_title_jedi_novice" && getForceSensitiveSkillCount(creature, true) > 0) { return false; } if(skillName.beginsWith("force_sensitive_") && getForceSensitiveSkillCount(creature, false) <= 24 && creature->hasSkill("force_title_jedi_rank_01")) return false; for (int i = 0; i < skillList->size(); ++i) { Skill* checkSkill = skillList->get(i); if (checkSkill->isRequiredSkillOf(skill)) return false; } if(creature->hasSkill("force_title_jedi_rank_03") && skillName.contains("force_discipline_") && !knightPrereqsMet(creature, skillName)) { return false; } //If they have already surrendered the skill, then return true. if (!creature->hasSkill(skill->getSkillName())) return true; creature->removeSkill(skill, notifyClient); //Remove skill modifiers VectorMap<String, int>* skillModifiers = skill->getSkillModifiers(); ManagedReference<PlayerObject*> ghost = creature->getPlayerObject(); for (int i = 0; i < skillModifiers->size(); ++i) { VectorMapEntry<String, int>* entry = &skillModifiers->elementAt(i); creature->removeSkillMod(SkillModManager::SKILLBOX, entry->getKey(), entry->getValue(), notifyClient); } if (ghost != NULL) { //Give the player the used skill points back. ghost->addSkillPoints(skill->getSkillPointsRequired()); //Remove abilities but only if the creature doesn't still have a skill that grants the //ability. Some abilities are granted by multiple skills. For example Dazzle for dancers //and musicians. Vector<String>* skillAbilities = skill->getAbilities(); if (skillAbilities->size() > 0) { SortedVector<String> abilitiesLost; for (int i = 0; i < skillAbilities->size(); i++) { abilitiesLost.put(skillAbilities->get(i)); } for (int i = 0; i < skillList->size(); i++) { Skill* remainingSkill = skillList->get(i); Vector<String>* remainingAbilities = remainingSkill->getAbilities(); for(int j = 0; j < remainingAbilities->size(); j++) { if (abilitiesLost.contains(remainingAbilities->get(j))) { abilitiesLost.drop(remainingAbilities->get(j)); if (abilitiesLost.size() == 0) { break; } } } } if (abilitiesLost.size() > 0) { removeAbilities(ghost, abilitiesLost, notifyClient); } } //Remove draft schematic groups Vector<String>* schematicsGranted = skill->getSchematicsGranted(); SchematicMap::instance()->removeSchematics(ghost, *schematicsGranted, notifyClient); //Update maximum experience. updateXpLimits(ghost); /// Update Force Power Max ghost->setForcePowerMax(creature->getSkillMod("jedi_force_power_max"), true); SkillList* list = creature->getSkillList(); int totalSkillPointsWasted = 250; for (int i = 0; i < list->size(); ++i) { Skill* skill = list->get(i); totalSkillPointsWasted -= skill->getSkillPointsRequired(); } if (ghost->getSkillPoints() != totalSkillPointsWasted) { creature->error("skill points mismatch calculated: " + String::valueOf(totalSkillPointsWasted) + " found: " + String::valueOf(ghost->getSkillPoints())); ghost->setSkillPoints(totalSkillPointsWasted); } ManagedReference<PlayerManager*> playerManager = creature->getZoneServer()->getPlayerManager(); if (playerManager != NULL) { creature->setLevel(playerManager->calculatePlayerLevel(creature)); } } /// Update client with new values for things like Terrain Negotiation CreatureObjectDeltaMessage4* msg4 = new CreatureObjectDeltaMessage4(creature); msg4->updateAccelerationMultiplierBase(); msg4->updateAccelerationMultiplierMod(); msg4->updateSpeedMultiplierBase(); msg4->updateSpeedMultiplierMod(); msg4->updateRunSpeed(); msg4->updateTerrainNegotiation(); msg4->close(); creature->sendMessage(msg4); SkillModManager::instance()->verifySkillBoxSkillMods(creature); return true; }