void SceneObjectImplementation::destroyObjectFromDatabase(bool destroyContainedObjects) { //info("deleting from database", true); if (isPlayerCreature()) { assert(0 && "attempting to delete a player creature from database"); } if(dataObjectComponent != NULL) { dataObjectComponent->notifyObjectDestroyingFromDatabase(); } ZoneServer* server = getZoneServer(); server->destroyObjectFromDatabase(getObjectID()); asSceneObject()->setPersistent(0); if (!destroyContainedObjects) return; SortedVector<ManagedReference<SceneObject*> > destroyedObjects; destroyedObjects.setNoDuplicateInsertPlan(); for (int i = 0; i < getSlottedObjectsSize(); ++i) { ManagedReference<SceneObject*> object = getSlottedObject(i); if (destroyedObjects.put(object) != -1) { Locker locker(object); object->destroyObjectFromDatabase(true); } } for (int j = 0; j < getContainerObjectsSize(); ++j) { ManagedReference<SceneObject*> object = getContainerObject(j); if (destroyedObjects.put(object) != -1) { Locker locker(object); object->destroyObjectFromDatabase(true); } } //Remove all child objects from database for (int i = 0; i < childObjects.size(); ++i) { ManagedReference<SceneObject*> child = childObjects.get(i); if (child == NULL) continue; Locker locker(child); child->destroyObjectFromDatabase(true); } }
SortedVector<ManagedReference<SceneObject*> > ZoneImplementation::getPlanetaryObjectList(const String& mapObjectLocationType) { SortedVector<ManagedReference<SceneObject*> > retVector; retVector.setNoDuplicateInsertPlan(); #ifndef WITH_STM mapLocations->rlock(); #endif try { SortedVector<MapLocationEntry>& entryVector = mapLocations->getLocation(mapObjectLocationType); for (int i = 0; i < entryVector.size(); ++i) { MapLocationEntry entry = entryVector.get(i); retVector.put(entry.getObject()); } } catch (...) { } #ifndef WITH_STM mapLocations->runlock(); #endif return retVector; }
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; }
int StructurePermissionList::grantPermission(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); if (caseSensitive) list->put(playerName); else list->put(playerName.toLowerCase()); return GRANTED; }
void StructurePermissionList::revokeAllPermissions() { Locker locker(&lock); for (int i = 0; i < idPermissionLists.size(); ++i) { SortedVector<uint64>* list = &idPermissionLists.get(i); list->removeAll(); if (idPermissionLists.elementAt(i).getKey() == "ADMIN") { list->put(ownerID); } } }
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()); }
int StructurePermissionList::grantPermission(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); list->put(objectID); return GRANTED; }
void PlayerCreationManager::loadDefaultCharacterItems() { IffStream* iffStream = TemplateManager::instance()->openIffFile( "creation/default_pc_equipment.iff"); if (iffStream == NULL) { error("Couldn't load creation default items."); return; } iffStream->openForm('LOEQ'); uint32 version = iffStream->getNextFormType(); Chunk* versionChunk = iffStream->openForm(version); for (int i = 0; i < versionChunk->getChunksSize(); ++i) { Chunk* ptmpChunk = iffStream->openForm('PTMP'); String templateName; Chunk* nameChunk = iffStream->openChunk('NAME'); nameChunk->readString(templateName); iffStream->closeChunk('NAME'); SortedVector < String > items; for (int j = 1; j < ptmpChunk->getChunksSize(); ++j) { Chunk* itemChunk = iffStream->openChunk('ITEM'); String itemTemplate; int unk1 = itemChunk->readInt(); itemChunk->readString(itemTemplate); itemTemplate = itemTemplate.replaceFirst("shared_", ""); items.put(itemTemplate); iffStream->closeChunk('ITEM'); } defaultCharacterEquipment.put(templateName, items); iffStream->closeForm('PTMP'); } iffStream->closeForm(version); iffStream->closeForm('LOEQ'); delete iffStream; }
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; }
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; }