void EntertainingSessionImplementation::addHealingXpGroup(int xp) { ManagedReference<CreatureObject*> entertainer = this->entertainer.get(); ManagedReference<GroupObject*> group = entertainer->getGroup(); int groupSize = group->getGroupSize(); ManagedReference<PlayerManager*> playerManager = entertainer->getZoneServer()->getPlayerManager(); for(int i = 0; i < groupSize; ++i) { ManagedReference<CreatureObject*> groupMember = group->getGroupMember(i)->isPlayerCreature() ? group->getGroupMember(i).castTo<CreatureObject*>() : NULL; if (groupMember != NULL) { Locker clocker(groupMember, entertainer); if (groupMember->isEntertaining() && groupMember->isInRange(entertainer, 40.0f) && groupMember->hasSkill("social_entertainer_novice")) { String healxptype("entertainer_healing"); if (playerManager != NULL) playerManager->awardExperience(groupMember, healxptype, xp, true); } } } }
void EntertainingSessionImplementation::awardEntertainerExperience() { ManagedReference<CreatureObject*> entertainer = this->entertainer.get(); ManagedReference<PlayerManager*> playerManager = entertainer->getZoneServer()->getPlayerManager(); CreatureObject* player = entertainer->isPlayerCreature() ? cast<CreatureObject*>(entertainer.get()) : NULL; if (player != NULL) { if (flourishXp > 0 && (isDancing() || isPlayingMusic())) { String xptype; if (isDancing()) xptype = "dance"; else if (isPlayingMusic()) xptype = "music"; int groupBonusPercent = 0; int groupBonus = 0; if(player->getGroup() != NULL) { ManagedReference<GroupObject*> group = player->getGroup(); int groupSize = group->getGroupSize(); for(int i = 0; i < groupSize; ++i) { ManagedReference<CreatureObject*> groupMember = group->getGroupMember(i)->isPlayerCreature() ? group->getGroupMember(i).castTo<CreatureObject*>() : NULL; if (groupMember != NULL) { Locker clocker(groupMember, entertainer); if (groupMember->isEntertaining() && groupMember->isInRange(entertainer, 40.0f) && groupMember->hasSkill("social_entertainer_novice")) { ++groupBonusPercent; } } } groupBonus = ceil(flourishXp * (groupBonusPercent / 100)); } flourishXp += groupBonus; if (playerManager != NULL) playerManager->awardExperience(player, xptype, flourishXp, true); //flourishXp--; flourishXp = 0; } if (healingXp > 0) { String healxptype("entertainer_healing"); if (playerManager != NULL) playerManager->awardExperience(player, healxptype, healingXp, true); healingXp = 0; } } healingXp = 0; flourishCount = 0; }
void VendorDataComponent::runVendorUpdate() { ManagedReference<SceneObject*> strongParent = parent.get(); if (strongParent == NULL || strongParent->getZoneServer() == NULL) return; ManagedReference<CreatureObject*> owner = strongParent->getZoneServer()->getObject(getOwnerId()).castTo<CreatureObject*>(); ManagedReference<PlayerManager*> playerManager = strongParent->getZoneServer()->getPlayerManager(); ManagedReference<TangibleObject*> vendor = cast<TangibleObject*>(strongParent.get()); if (owner == NULL || !owner->isPlayerCreature() || playerManager == NULL || vendor == NULL) { return; } scheduleVendorCheckTask(VENDORCHECKINTERVAL); removeAllVendorBarks(); int now = time(0); int last = lastSuccessfulUpdate.getTime(); float hoursSinceLastUpdate = now - last; hoursSinceLastUpdate /= 3600.f; if (maintAmount > 0) inactiveTimer.updateToCurrentTime(); /// parent salaries Locker vlocker(owner, vendor); maintAmount -= getMaintenanceRate() * hoursSinceLastUpdate; if (maintAmount < 0) { vendor->setConditionDamage(-maintAmount, true); } else { vendor->setConditionDamage(0, true); vendor->setMaxCondition(1000, true); } if (isEmpty()) { ManagedReference<ChatManager*> cman = strongParent->getZoneServer()->getChatManager(); String sender = strongParent->getDisplayedName(); UnicodeString subject("@auction:vendor_status_subject"); if (!mail1Sent && time(0) - emptyTimer.getTime() > FIRSTWARNING) { StringIdChatParameter body("@auction:vendor_status_unaccessed"); body.setTO(strongParent->getDisplayedName()); if (cman != NULL) cman->sendMail(sender, subject, body, owner->getFirstName()); mail1Sent = true; } else if (!mail2Sent && time(0) - emptyTimer.getTime() > SECONDWARNING) { StringIdChatParameter body("@auction:vendor_status_endangered"); body.setTO(strongParent->getDisplayedName()); if (cman != NULL) cman->sendMail(sender, subject, body, owner->getFirstName()); mail2Sent = true; } else if (time(0) - emptyTimer.getTime() > EMPTYDELETE) { StringIdChatParameter body("@auction:vendor_status_deleted"); if (cman != NULL) cman->sendMail(sender, subject, body, owner->getFirstName()); VendorManager::instance()->destroyVendor(vendor); vendorCheckTask->cancel(); return; } } else { mail1Sent = false; mail2Sent = false; emptyTimer.updateToCurrentTime(); } if (isOnStrike()) { if (isRegistered()) VendorManager::instance()->handleUnregisterVendor(owner, vendor); if (isVendorSearchEnabled()) setVendorSearchEnabled(false); if (time(0) - inactiveTimer.getTime() > DELETEWARNING) { ManagedReference<ChatManager*> cman = strongParent->getZoneServer()->getChatManager(); String sender = strongParent->getDisplayedName(); UnicodeString subject("@auction:vendor_status_subject"); StringIdChatParameter body("@auction:vendor_status_deleted"); if (cman != NULL) cman->sendMail(sender, subject, body, owner->getFirstName()); VendorManager::instance()->destroyVendor(vendor); vendorCheckTask->cancel(); } } else { /// Award hourly XP assert(vendor->isLockedByCurrentThread()); Locker locker(owner, vendor); playerManager->awardExperience(owner, "merchant", 150 * hoursSinceLastUpdate, false); playerManager->awardExperience(owner, "merchant", awardUsageXP * 50, false); } awardUsageXP = 0; lastSuccessfulUpdate.updateToCurrentTime(); }
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); } } }
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); } } }