int ResourceManagerImplementation::notifyObserverEvent(uint32 eventType, Observable* observable, ManagedObject* arg1, int64 arg2) { if (eventType == ObserverEventType::POSTURECHANGED) { CreatureObject* creature = cast<CreatureObject*>( observable); if (creature == NULL) { return 0; } // Cancel Sampling on posture change Reference<SampleTask*> task = creature->getPendingTask("sample").castTo<SampleTask*>( ); Reference<SampleResultsTask*> sampleResultsTask = creature->getPendingTask("sampleresults").castTo<SampleResultsTask*>( ); if (task != NULL) { task->stopSampling(); //creature->removePendingTask("sample"); if(sampleResultsTask != NULL) { sampleResultsTask->cancel(); creature->removePendingTask("sampleresults"); } creature->sendSystemMessage("@survey:sample_cancel"); } return 1; } return 0; }
void PetControlDeviceImplementation::cancelSpawnObject(CreatureObject* player) { Reference<Task*> petTask = player->getPendingTask("call_pet"); if(petTask != NULL) { petTask->cancel(); player->removePendingTask("call_pet"); } if (petControlObserver != NULL) player->dropObserver(ObserverEventType::STARTCOMBAT, petControlObserver); }
void VehicleControlDeviceImplementation::cancelSpawnObject(CreatureObject* player) { Reference<Task*> mountTask = player->getPendingTask("call_mount"); if(mountTask) { mountTask->cancel(); player->removePendingTask("call_mount"); } if (vehicleControlObserver != NULL) player->dropObserver(ObserverEventType::STARTCOMBAT, vehicleControlObserver); }
int PetManagerImplementation::notifyDestruction(TangibleObject* destructor, AiAgent* destructedObject, int condition) { if (!destructedObject->isPet() || destructedObject->isDead() || destructedObject->isIncapacitated()) return 1; if (destructedObject->isMount() && destructedObject->hasRidingCreature()) { Reference<CreatureObject*> rider = destructedObject->getSlottedObject("rider").castTo<CreatureObject*>(); if (rider != NULL) { rider->updateCooldownTimer("mount_dismount", 0); rider->executeObjectControllerAction(String("dismount").hashCode()); } } destructor->removeDefender(destructedObject); destructedObject->clearDots(); ManagedReference<PetControlDevice*> petControlDevice = destructedObject->getControlDevice().get().castTo<PetControlDevice*>(); if (!destructor->isKiller() && petControlDevice != NULL && petControlDevice->getPetType() == CREATUREPET) { destructedObject->setCurrentSpeed(0); destructedObject->setPosture(CreaturePosture::INCAPACITATED, true); destructedObject->updateLocomotion(); uint32 incapTime = calculateIncapacitationTimer(destructedObject, condition); Reference<Task*> oldTask = destructedObject->getPendingTask("incapacitationRecovery"); if (oldTask != NULL && oldTask->isScheduled()) { oldTask->cancel(); destructedObject->removePendingTask("incapacitationRecovery"); } bool store = false; if (incapTime > 240) { // store pet after 4 minutes of incap store = true; incapTime = 240; } Reference<Task*> task = new PetIncapacitationRecoverTask(destructedObject, store); destructedObject->addPendingTask("incapacitationRecovery", task, incapTime * 1000); } else { killPet(destructor, destructedObject); } return 0; }
void BountyMissionObjectiveImplementation::cancelCallArakydTask() { Locker locker(&syncMutex); for (int i = 0; i < droidTasks.size(); i++) { Reference<Task*> task = droidTasks.get(i); if (task != NULL) { Reference<CallArakydTask*> callTask = task.castTo<CallArakydTask*>(); if (callTask != NULL && callTask->isScheduled()) { callTask->cancel(); } } } }
void BountyMissionObjectiveImplementation::cancelAllTasks() { Locker locker(&syncMutex); if (targetTask != NULL && targetTask->isScheduled()) { targetTask->cancel(); targetTask = NULL; } for (int i = 0; i < droidTasks.size(); i++) { Reference<Task*> droidTask = droidTasks.get(i); if (droidTask != NULL && droidTask->isScheduled()) { droidTask->cancel(); } } droidTasks.removeAll(); }
int LuaSceneObject::cancelPendingTask(lua_State* L) { String play = lua_tostring(L, -2); String key = lua_tostring(L, -1); String name = play + ":" + key; if (realObject->containsPendingTask(name)) { Reference<ScreenPlayTask*> task = realObject->getPendingTask(name).castTo<ScreenPlayTask*>(); if (task != NULL && task->isScheduled()) { task->cancel(); } realObject->removePendingTask(name); } return 0; }
void VehicleControlDeviceImplementation::storeObject(CreatureObject* player, bool force) { ManagedReference<TangibleObject*> controlledObject = this->controlledObject.get(); if (controlledObject == NULL) return; /*if (!controlledObject->isInQuadTree()) return;*/ if (!force && (player->isInCombat() || player->isDead())) return; if (player->isRidingMount() && player->getParent() == controlledObject) { if (!force && !player->checkCooldownRecovery("mount_dismount")) return; player->executeObjectControllerAction(STRING_HASHCODE("dismount")); if (player->isRidingMount()) return; } Locker crossLocker(controlledObject, player); Reference<Task*> decayTask = controlledObject->getPendingTask("decay"); if (decayTask != NULL) { decayTask->cancel(); controlledObject->removePendingTask("decay"); } controlledObject->destroyObjectFromWorld(true); if (controlledObject->isCreatureObject()) (cast<CreatureObject*>(controlledObject.get()))->setCreatureLink(NULL); updateStatus(0); }
void CreatureManagerImplementation::harvest(Creature* creature, CreatureObject* player, int selectedID) { Zone* zone = creature->getZone(); if (zone == NULL || !creature->isCreature()) return; if (!creature->canHarvestMe(player)) return; if (!player->isInRange(creature, 7)) return; ManagedReference<ResourceManager*> resourceManager = zone->getZoneServer()->getResourceManager(); String restype = ""; float quantity = 0; if (selectedID == 112) { int type = System::random(2); if (quantity == 0 || type == 0) { if(creature->getHideMax() > 0) { restype = creature->getHideType(); quantity = creature->getHideMax(); } } if (quantity == 0 || type == 1) { if(creature->getMeatMax() > 0) { restype = creature->getMeatType(); quantity = creature->getMeatMax(); } } if (quantity == 0 || type == 2) { if(creature->getBoneMax() > 0) { restype = creature->getBoneType(); quantity = creature->getBoneMax(); } } } if (selectedID == 234) { restype = creature->getMeatType(); quantity = creature->getMeatMax(); } else if (selectedID == 235) { restype = creature->getHideType(); quantity = creature->getHideMax(); } else if (selectedID == 236) { restype = creature->getBoneType(); quantity = creature->getBoneMax(); } if(quantity == 0 || restype.isEmpty()) { player->sendSystemMessage("Tried to harvest something this creature didn't have, please report this error"); return; } int quantityExtracted = int(quantity * float(player->getSkillMod("creature_harvesting") / 100.0f)); quantityExtracted = MAX(quantityExtracted, 3); ManagedReference<ResourceSpawn*> resourceSpawn = resourceManager->getCurrentSpawn(restype, player->getZone()->getZoneName()); if (resourceSpawn == NULL) { player->sendSystemMessage("Error: Server cannot locate a current spawn of " + restype); return; } float density = resourceSpawn->getDensityAt(player->getZone()->getZoneName(), player->getPositionX(), player->getPositionY()); String creatureHealth = ""; if (density > 0.80f) { quantityExtracted = int(quantityExtracted * 1.25f); creatureHealth = "creature_quality_fat"; } else if (density > 0.60f) { quantityExtracted = int(quantityExtracted * 1.00f); creatureHealth = "creature_quality_medium"; } else if (density > 0.40f) { quantityExtracted = int(quantityExtracted * 0.75f); creatureHealth = "creature_quality_scrawny"; } else { quantityExtracted = int(quantityExtracted * 0.50f); creatureHealth = "creature_quality_skinny"; } float modifier = 1; int baseAmount = quantityExtracted; if (player->isGrouped()) { modifier = player->getGroup()->getGroupHarvestModifier(player); quantityExtracted = (int)(quantityExtracted * modifier); } if (creature->getParent().get() != NULL) quantityExtracted = 1; resourceManager->harvestResourceToPlayer(player, resourceSpawn, quantityExtracted); /// Send System Messages StringIdChatParameter harvestMessage("skl_use", creatureHealth); harvestMessage.setDI(quantityExtracted); harvestMessage.setTU(resourceSpawn->getFinalClass()); player->sendSystemMessage(harvestMessage); /// Send bonus message if (modifier == 1.2f) player->sendSystemMessage("@skl_use:group_harvest_bonus"); else if (modifier == 1.3f) player->sendSystemMessage("@skl_use:group_harvest_bonus_ranger"); else if (modifier == 1.4f) player->sendSystemMessage("@skl_use:group_harvest_bonus_masterranger"); /// Send group spam if (player->isGrouped()) { StringIdChatParameter bonusMessage("group", "notify_harvest_corpse"); bonusMessage.setTU(player->getFirstName()); bonusMessage.setDI(quantityExtracted); bonusMessage.setTO(resourceSpawn->getFinalClass()); bonusMessage.setTT(creature->getObjectNameStringIdFile(), creature->getObjectNameStringIdName()); ChatSystemMessage* sysMessage = new ChatSystemMessage(bonusMessage); player->getGroup()->broadcastMessage(player, sysMessage, false); } ManagedReference<PlayerManager*> playerManager = zoneServer->getPlayerManager(); int xp = creature->getLevel() * 5 + 19; if(playerManager != NULL) playerManager->awardExperience(player, "scout", xp, true); creature->addAlreadyHarvested(player); if (!creature->hasLoot() && creature->getBankCredits() < 1 && creature->getCashCredits() < 1 && !playerManager->canGroupMemberHarvestCorpse(player, creature)) { Reference<DespawnCreatureTask*> despawn = creature->getPendingTask("despawn").castTo<DespawnCreatureTask*>(); if (despawn != NULL) { despawn->cancel(); despawn->reschedule(1000); } } }
int CreatureManagerImplementation::notifyDestruction(TangibleObject* destructor, AiAgent* destructedObject, int condition) { if (destructedObject->isDead()) return 1; destructedObject->setPosture(CreaturePosture::DEAD, true); destructedObject->updateTimeOfDeath(); ManagedReference<PlayerManager*> playerManager = zoneServer->getPlayerManager(); // lets unlock destructor so we dont get into complicated deadlocks // lets copy the damage map before we remove it all ThreatMap* threatMap = destructedObject->getThreatMap(); ThreatMap copyThreatMap(*threatMap); threatMap->removeObservers(); threatMap->removeAll(); // we can clear the original one if (destructedObject != destructor) destructor->unlock(); bool shouldRescheduleCorpseDestruction = false; try { ManagedReference<CreatureObject*> player = copyThreatMap.getHighestDamageGroupLeader(); uint64 ownerID = 0; if (player != NULL) { if(player->isGrouped()) { ownerID = player->getGroupID(); } else { ownerID = player->getObjectID(); } if (player->isPlayerCreature()) { Locker locker(player, destructedObject); player->notifyObservers(ObserverEventType::KILLEDCREATURE, destructedObject); FactionManager* factionManager = FactionManager::instance(); if (!destructedObject->getPvPFaction().isEmpty() && !destructedObject->isEventMob()) { int level = destructedObject->getLevel(); if(!player->isGrouped()) factionManager->awardFactionStanding(player, destructedObject->getPvPFaction(), level); else factionManager->awardFactionStanding(copyThreatMap.getHighestDamagePlayer(), destructedObject->getPvPFaction(), level); } } } if (playerManager != NULL) playerManager->disseminateExperience(destructedObject, ©ThreatMap); SceneObject* creatureInventory = destructedObject->getSlottedObject("inventory"); if (creatureInventory != NULL && player != NULL && player->isPlayerCreature()) { LootManager* lootManager = zoneServer->getLootManager(); if (destructedObject->isNonPlayerCreatureObject() && !destructedObject->isEventMob()) destructedObject->setCashCredits(lootManager->calculateLootCredits(destructedObject->getLevel())); creatureInventory->setContainerOwnerID(ownerID); lootManager->createLoot(creatureInventory, destructedObject); } CombatManager::instance()->attemptPeace(destructedObject); // Check to see if we can expedite the despawn of this corpse // We can expedite the despawn when corpse has no loot, no credits, player cannot harvest, and no group members in range can harvest shouldRescheduleCorpseDestruction = playerManager->shouldRescheduleCorpseDestruction(player, destructedObject); } catch (...) { destructedObject->scheduleDespawn(); // now we can safely lock destructor again if (destructedObject != destructor) destructor->wlock(destructedObject); throw; } destructedObject->scheduleDespawn(); if (shouldRescheduleCorpseDestruction) { Reference<DespawnCreatureTask*> despawn = destructedObject->getPendingTask("despawn").castTo<DespawnCreatureTask*>(); if (despawn != NULL) { despawn->cancel(); despawn->reschedule(10000); } } // now we can safely lock destructor again if (destructedObject != destructor) destructor->wlock(destructedObject); return 1; }
void CreatureManagerImplementation::droidHarvest(Creature* creature, CreatureObject* droid, int selectedID, int harvestBonus) { // droid and creature are locked coming in. ManagedReference<CreatureObject*> owner = droid->getLinkedCreature(); if (owner == NULL) { return; } Locker pLock(owner); Zone* zone = creature->getZone(); if (zone == NULL || !creature->isCreature()) { return; } // this will perform a range check on the corpse to the droid if (!creature->canDroidHarvestMe(owner,droid)) { owner->sendSystemMessage("@pet/droid_modules:cannot_access_corpse"); return; } ManagedReference<ResourceManager*> resourceManager = zone->getZoneServer()->getResourceManager(); String restype = ""; float quantity = 0; if (selectedID == 234) { restype = creature->getMeatType(); quantity = creature->getMeatMax(); } else if (selectedID == 235) { restype = creature->getHideType(); quantity = creature->getHideMax(); } else if (selectedID == 236) { restype = creature->getBoneType(); quantity = creature->getBoneMax(); } if(quantity == 0 || restype.isEmpty()) { owner->sendSystemMessage("Tried to harvest something this creature didn't have, please report this error"); return; } int ownerSkill = owner->getSkillMod("creature_harvesting"); int quantityExtracted = int(quantity * float(ownerSkill / 100.0f)); // add in droid bonus quantityExtracted = MAX(quantityExtracted, 3); ManagedReference<ResourceSpawn*> resourceSpawn = resourceManager->getCurrentSpawn(restype, droid->getZone()->getZoneName()); if (resourceSpawn == NULL) { owner->sendSystemMessage("Error: Server cannot locate a current spawn of " + restype); return; } float density = resourceSpawn->getDensityAt(droid->getZone()->getZoneName(), droid->getPositionX(), droid->getPositionY()); String creatureHealth = ""; if (density > 0.80f) { quantityExtracted = int(quantityExtracted * 1.25f); creatureHealth = "creature_quality_fat"; } else if (density > 0.60f) { quantityExtracted = int(quantityExtracted * 1.00f); creatureHealth = "creature_quality_medium"; } else if (density > 0.40f) { quantityExtracted = int(quantityExtracted * 0.75f); creatureHealth = "creature_quality_scrawny"; } else { quantityExtracted = int(quantityExtracted * 0.50f); creatureHealth = "creature_quality_skinny"; } float modifier = 1; int baseAmount = quantityExtracted; if (owner->isGrouped()) { modifier = owner->getGroup()->getGroupHarvestModifier(owner); quantityExtracted = (int)(quantityExtracted * modifier); if (owner->getGroup()->getGroupSize() > 2 ) { quantityExtracted -= quantityExtracted * 0.3; // 30% reduction } } if (creature->getParent().get() != NULL) quantityExtracted = 1; int droidBonus = DroidMechanics::determineDroidSkillBonus(ownerSkill,harvestBonus,quantityExtracted); quantityExtracted += droidBonus; // add to droid inventory if there is space available, otherwise to player DroidObject* pet = cast<DroidObject*>(droid); if (pet == NULL) { error("Incoming droid harvest call didnt include a droid!"); return; } if (pet->hasStorage()) { bool didit = resourceManager->harvestResourceToPlayer(droid, resourceSpawn, quantityExtracted); if (!didit) { resourceManager->harvestResourceToPlayer(owner, resourceSpawn, quantityExtracted); } } else { resourceManager->harvestResourceToPlayer(owner, resourceSpawn, quantityExtracted); } /// Send System Messages StringIdChatParameter harvestMessage("skl_use", creatureHealth); harvestMessage.setDI(quantityExtracted); harvestMessage.setTU(resourceSpawn->getFinalClass()); owner->sendSystemMessage(harvestMessage); /// Send bonus message if (modifier == 1.2f) owner->sendSystemMessage("@skl_use:group_harvest_bonus"); else if (modifier == 1.3f) owner->sendSystemMessage("@skl_use:group_harvest_bonus_ranger"); else if (modifier == 1.4f) owner->sendSystemMessage("@skl_use:group_harvest_bonus_masterranger"); /// Send group spam if (owner->isGrouped()) { StringIdChatParameter bonusMessage("group", "notify_harvest_corpse"); bonusMessage.setTU(droid->getDisplayedName()); bonusMessage.setDI(quantityExtracted); bonusMessage.setTO(resourceSpawn->getFinalClass()); bonusMessage.setTT(creature->getObjectNameStringIdFile(), creature->getObjectNameStringIdName()); ChatSystemMessage* sysMessage = new ChatSystemMessage(bonusMessage); owner->getGroup()->broadcastMessage(owner, sysMessage, false); } ManagedReference<PlayerManager*> playerManager = zoneServer->getPlayerManager(); int xp = creature->getLevel() * 5 + 19; if(playerManager != NULL) playerManager->awardExperience(owner, "scout", xp, true); creature->addAlreadyHarvested(owner); if (!creature->hasLoot() && creature->getBankCredits() < 1 && creature->getCashCredits() < 1 && !playerManager->canGroupMemberHarvestCorpse(owner, creature)) { Reference<DespawnCreatureTask*> despawn = creature->getPendingTask("despawn").castTo<DespawnCreatureTask*>(); if (despawn != NULL) { despawn->cancel(); despawn->reschedule(1000); } } }