void EntertainingSessionImplementation::doPerformanceAction() { ManagedReference<CreatureObject*> entertainer = this->entertainer.get(); if (entertainer == NULL) return; Locker locker(entertainer); Performance* performance = NULL; PerformanceManager* performanceManager = SkillManager::instance()->getPerformanceManager(); ManagedReference<Instrument*> instrument = getInstrument(entertainer); if (isDancing()) performance = performanceManager->getDance(performanceName); else if (isPlayingMusic() && instrument) performance = performanceManager->getSong(performanceName, instrument->getInstrumentType()); else { cancelSession(); return; } if (performance == NULL) { // shouldn't happen StringBuffer msg; msg << "Performance was null. Please report to www.swgemu.com/bugs ! Name: " << performanceName << " and Type: " << dec << instrument->getInstrumentType(); entertainer->sendSystemMessage(msg.toString()); return; } int actionDrain = performance->getActionPointsPerLoop(); //Adjust cost based upon player's quickness actionDrain = entertainer->calculateCostAdjustment(CreatureAttribute::QUICKNESS, actionDrain); if (entertainer->getHAM(CreatureAttribute::ACTION) <= actionDrain) { if (isDancing()) { stopDancing(); entertainer->sendSystemMessage("@performance:dance_too_tired"); } if (isPlayingMusic()) { stopPlayingMusic(); entertainer->sendSystemMessage("@performance:music_too_tired"); } } else { entertainer->inflictDamage(entertainer, CreatureAttribute::ACTION, actionDrain, false, true); } }
void EntertainingSessionImplementation::doFlourish(int flourishNumber) { ManagedReference<CreatureObject*> entertainer = this->entertainer.get(); int fid = flourishNumber; if (!dancing && !playingMusic) { entertainer->sendSystemMessage("@performance:flourish_not_performing"); return; } PerformanceManager* performanceManager = SkillManager::instance()->getPerformanceManager(); Performance* performance = NULL; ManagedReference<Instrument*> instrument = getInstrument(entertainer); if (dancing) performance = performanceManager->getDance(performanceName); else if (playingMusic && instrument) performance = performanceManager->getSong(performanceName, instrument->getInstrumentType()); else { cancelSession(); return; } if (!performance) { // shouldn't happen StringBuffer msg; msg << "Performance was null. Please report to www.swgemu.com/bugs ! Name: " << performanceName << " and Type: " << dec << instrument->getInstrumentType(); entertainer->sendSystemMessage(msg.toString()); return; } float baseActionDrain = performance->getActionPointsPerLoop() - (int)(entertainer->getHAM(CreatureAttribute::QUICKNESS)/35.f); //float baseActionDrain = -40 + (getQuickness() / 37.5); float flourishActionDrain = baseActionDrain / 2.0; int actionDrain = (int)round((flourishActionDrain * 10 + 0.5) / 10.0); // Round to nearest dec for actual int cost if (entertainer->getHAM(CreatureAttribute::ACTION) <= actionDrain) { entertainer->sendSystemMessage("@performance:flourish_too_tired"); } else { entertainer->inflictDamage(entertainer, CreatureAttribute::ACTION, actionDrain, false, true); if (dancing) { StringBuffer msg; msg << "skill_action_" << fid; entertainer->doAnimation(msg.toString()); } else if (playingMusic) { Flourish* flourish = new Flourish(entertainer, fid); entertainer->broadcastMessage(flourish, true); } //check to see how many flourishes have occurred this tick if(flourishCount < 5) { // Add buff addEntertainerFlourishBuff(); // Grant Experience if(flourishCount < 2) flourishXp += performance->getBaseXp() + performance->getFlourishXpMod(); flourishCount++; } entertainer->notifyObservers(ObserverEventType::FLOURISH, entertainer, fid); entertainer->sendSystemMessage("@performance:flourish_perform"); } }