void EntertainingSessionImplementation::increaseEntertainerBuff(CreatureObject* patron){ ManagedReference<CreatureObject*> entertainer = this->entertainer.get(); PerformanceManager* performanceManager = SkillManager::instance()->getPerformanceManager(); Performance* performance = NULL; ManagedReference<Instrument*> instrument = getInstrument(entertainer); if (performanceName == "") return; if (dancing) { performance = performanceManager->getDance(performanceName); } else if (playingMusic && instrument != NULL) { performance = performanceManager->getSong(performanceName, instrument->getInstrumentType()); } else { cancelSession(); return; } if(!canGiveEntertainBuff()) return; if (performance == NULL) { // shouldn't happen return; } ManagedReference<PlayerObject*> entPlayer = entertainer->getPlayerObject(); //Check if the patron is a valid buff target //Whether it be passive(in the same group) or active (/setPerform target) if ((!entertainer->isGrouped() || entertainer->getGroupID() != patron->getGroupID()) && entPlayer->getPerformanceBuffTarget() != patron->getObjectID()) { return; } if(isInDenyServiceList(patron)) return; float buffAcceleration = 1 + ((float)entertainer->getSkillMod("accelerate_entertainer_buff") / 100.f); addEntertainerBuffDuration(patron, performance->getType(), 2.0f * buffAcceleration); addEntertainerBuffStrength(patron, performance->getType(), performance->getHealShockWound()); }
void EntertainingSessionImplementation::doEntertainerPatronEffects() { ManagedReference<CreatureObject*> creo = entertainer.get(); if (creo == NULL) return; if (performanceName == "") return; Locker locker(creo); //**DECLARATIONS** VectorMap<ManagedReference<CreatureObject*>, EntertainingData>* patrons = NULL; SkillManager* skillManager = creo->getZoneServer()->getSkillManager(); PerformanceManager* performanceManager = skillManager->getPerformanceManager(); Performance* performance = NULL; ManagedReference<Instrument*> instrument = getInstrument(creo); float woundHealingSkill = 0.0f; float playerShockHealingSkill = 0.0f; float buildingShockHealingSkill = creo->getSkillMod("private_med_battle_fatigue"); float factionPerkSkill = creo->getSkillMod("private_faction_mind_heal"); //**LOAD PATRONS, GET THE PERFORMANCE AND ENT'S HEALING SKILL.** if (dancing) { patrons = &watchers; performance = performanceManager->getDance(performanceName); woundHealingSkill = (float) creo->getSkillMod("healing_dance_wound"); playerShockHealingSkill = (float) creo->getSkillMod("healing_dance_shock"); } else if (playingMusic && instrument != NULL) { patrons = &listeners; performance = performanceManager->getSong(performanceName, instrument->getInstrumentType()); woundHealingSkill = (float) creo->getSkillMod("healing_music_wound"); playerShockHealingSkill = (float) creo->getSkillMod("healing_music_shock"); } else { cancelSession(); return; } if (performance == NULL) { return; } ManagedReference<BuildingObject*> building = creo->getRootParent().get().castTo<BuildingObject*>(); if (building != NULL && factionPerkSkill > 0 && building->isPlayerRegisteredWithin(creo->getObjectID())) { unsigned int buildingFaction = building->getFaction(); unsigned int healerFaction = creo->getFaction(); PlayerObject* ghost = creo->getPlayerObject(); if (ghost != NULL && healerFaction != 0 && healerFaction == buildingFaction && ghost->getFactionStatus() == FactionStatus::OVERT) { woundHealingSkill += factionPerkSkill; playerShockHealingSkill += factionPerkSkill; } } //**DETERMINE WOUND HEAL AMOUNTS.** int woundHeal = ceil(performance->getHealMindWound() * (woundHealingSkill / 100.0f)); int shockHeal = ceil(performance->getHealShockWound() * ((playerShockHealingSkill + buildingShockHealingSkill) / 100.0f)); //**ENTERTAINER HEALS THEIR OWN MIND.** healWounds(creo, woundHeal*(flourishCount+1), shockHeal*(flourishCount+1)); //**APPLY EFFECTS TO PATRONS.** if (patrons != NULL && patrons->size() > 0) { for (int i = 0; i < patrons->size(); ++i) { ManagedReference<CreatureObject*> patron = patrons->elementAt(i).getKey(); try { //**VERIFY THE PATRON IS NOT ON THE DENY SERVICE LIST if (creo->isInRange(patron, 10.0f)) { healWounds(patron, woundHeal*(flourishCount+1), shockHeal*(flourishCount+1)); increaseEntertainerBuff(patron); } else { //patron is not in range, force to stop listening ManagedReference<PlayerManager*> playerManager = patron->getZoneServer()->getPlayerManager(); Locker locker(patron, entertainer.get()); if (dancing) { if (playerManager != NULL) playerManager->stopWatch(patron, creo->getObjectID(), true, false, false, true); if (!patron->isListening()) sendEntertainmentUpdate(patron, 0, "", true); } else if (playingMusic) { if (playerManager != NULL) playerManager->stopListen(patron, creo->getObjectID(), true, false, false, true); if (!patron->isWatching()) sendEntertainmentUpdate(patron, 0, "", true); } } } catch (Exception& e) { error("Unreported exception caught in EntertainingSessionImplementation::doEntertainerPatronEffects()"); } } } //else //System::out << "There are no patrons.\n"; info("EntertainingSessionImplementation::doEntertainerPatronEffects() end"); }