void VehicleControlDeviceImplementation::storeObject(CreatureObject* player, bool force) { ManagedReference<TangibleObject*> controlledObject = this->controlledObject.get(); if (controlledObject == NULL) return; /*if (!controlledObject->isInQuadTree()) 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); controlledObject->destroyObjectFromWorld(true); if (controlledObject->isCreatureObject()) (cast<CreatureObject*>(controlledObject.get()))->setCreatureLink(NULL); updateStatus(0); }
uint32 DamageOverTime::doBleedingTick(CreatureObject* victim, CreatureObject* attacker) { // TODO: Do we try to resist again? // we need to allow dots to tick while incapped, but not do damage if (victim->isIncapacitated() && victim->isFeigningDeath() == false) return 0; uint32 attr = victim->getHAM(attribute); int absorptionMod = MIN(0, MAX(50, victim->getSkillMod("absorption_bleeding"))); // absorption reduces the strength of a dot by the given %. int damage = (int)(strength * (1.f - absorptionMod / 100.f)); if (attr < damage) { //System::out << "setting strength to " << attr -1 << endl; damage = attr - 1; } Reference<CreatureObject*> attackerRef = attacker; Reference<CreatureObject*> victimRef = victim; uint8 attribute = this->attribute; EXECUTE_TASK_4(attackerRef, victimRef, attribute, damage, { Locker locker(victimRef_p); Locker crossLocker(attackerRef_p, victimRef_p); victimRef_p->inflictDamage(attackerRef_p, attribute_p, damage_p, false); if (victimRef_p->hasAttackDelay()) victimRef_p->removeAttackDelay(); victimRef_p->playEffect("clienteffect/dot_bleeding.cef",""); });
int PetControlDeviceImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { //Logger::info("selected call"); Reference<TangibleObject*> strongRef = controlledObject.get(); if (strongRef == NULL) return 1; AiAgent* pet = cast<AiAgent*>(strongRef.get()); Reference<PlayerObject*> ghost = player->getPlayerObject(); if (selectedID == 44) { if (pet == NULL) { error("null controlled object in pet control device"); return 1; } else { Locker crossLocker(pet, player); callObject(player); } } else if (selectedID == 59) { if (pet == NULL) { error("null controlled object in pet control device"); return 1; } else { if (status == 1 && !ghost->hasActivePet(pet)) { Locker crossLocker(pet, player); callObject(player); } else { Locker crossLocker(pet, player); storeObject(player); } } } return 0; }
void CharacterBuilderTerminalImplementation::enhanceCharacter(CreatureObject* player) { PlayerManager* pm = player->getZoneServer()->getPlayerManager(); pm->enhanceCharacter(player); ManagedReference<PlayerObject*> ghost = player->getPlayerObject(); if (ghost == NULL) return; for (int i = 0; i < ghost->getActivePetsSize(); i++) { ManagedReference<AiAgent*> pet = ghost->getActivePet(i); if (pet != NULL) { Locker crossLocker(pet, player); pm->enhanceCharacter(pet); } } }
int LuaCreatureObject::inflictDamage(lua_State* L) { //int inflictDamage(TangibleObject attacker, int damageType, int damage, boolean destroy, boolean notifyClient = true); int destroy = lua_tonumber(L, -1); int damage = lua_tonumber(L, -2); int damageType = lua_tonumber(L, -3); SceneObject* scene = (SceneObject*) lua_touserdata(L, -4); TangibleObject* attacker = cast<TangibleObject*>(scene); assert(attacker); Locker locker(realObject); Locker crossLocker(attacker, realObject); realObject->inflictDamage(attacker, damageType, damage, destroy); return 0; }
int PetMenuComponent::handleObjectMenuSelect(SceneObject* sceneObject, CreatureObject* player, byte selectedID) { if (!sceneObject->isPet() || player == NULL) return 0; AiAgent* pet = cast<AiAgent*>(sceneObject); if (!player->getPlayerObject()->isPrivileged() && pet->getLinkedCreature().get() != player) return 0; Locker crossLocker(pet, player); ManagedReference<PetControlDevice*> petControlDevice = pet->getControlDevice().get().castTo<PetControlDevice*>(); if (petControlDevice == NULL) return 0; PetManager* petManager = pet->getZoneServer()->getPetManager(); if (petManager == NULL) return 0; Locker locker(petControlDevice); // Store if (selectedID == 59) { if (pet->getLinkedCreature() != player) { ManagedReference<CreatureObject*> owner = pet->getLinkedCreature().get(); if (owner != NULL) { Reference<PetControlDeviceStoreObjectTask*> task = new PetControlDeviceStoreObjectTask(petControlDevice, owner, true); task->execute(); } } else { petControlDevice->storeObject(player); } return 0; } if (pet->getLinkedCreature().get() != player) return 0; switch(selectedID) { case 142: // Train Command: Follow petControlDevice->setTrainingCommand( PetManager::FOLLOW ); break; case 143: // Train Command: Stay petControlDevice->setTrainingCommand( PetManager::STAY ); break; case 144: // Train Command: Guard petControlDevice->setTrainingCommand( PetManager::GUARD ); break; case 145: // Train Command: Friend petControlDevice->setTrainingCommand( PetManager::FRIEND ); break; case 146: // Train Command: Attack petControlDevice->setTrainingCommand( PetManager::ATTACK ); break; case 147: // Train Command: Patrol petControlDevice->setTrainingCommand( PetManager::PATROL ); break; case 148: // Train Command: Get Patrol Point petControlDevice->setTrainingCommand( PetManager::GETPATROLPOINT ); break; case 149: // Train Command: Clear Patrol Points petControlDevice->setTrainingCommand( PetManager::CLEARPATROLPOINTS ); break; case 150: // Train Command: Wedge Formation petControlDevice->setTrainingCommand( PetManager::FORMATION1 ); break; case 151: // Train Command: Column Formation petControlDevice->setTrainingCommand( PetManager::FORMATION2 ); break; case 152: // Train Command: Transfer petControlDevice->setTrainingCommand( PetManager::TRANSFER ); break; case 154: // Train Command: Trick 1 petControlDevice->setTrainingCommand( PetManager::TRICK1 ); break; case 155: // Train Command: Trick 2 petControlDevice->setTrainingCommand( PetManager::TRICK2 ); break; case 158: // Train Command: Group petControlDevice->setTrainingCommand( PetManager::GROUP ); break; case 161: // Train Command: Special Attack 1 petControlDevice->setTrainingCommand( PetManager::SPECIAL_ATTACK1 ); break; case 162: // Train Command: Special Attack 2 petControlDevice->setTrainingCommand( PetManager::SPECIAL_ATTACK2 ); break; case 163: // Train Command: Ranged Attack petControlDevice->setTrainingCommand( PetManager::RANGED_ATTACK ); break; case 164: // Train Command: Store petControlDevice->setTrainingCommand( PetManager::STORE ); break; case 165: // Train Command: Follow Other petControlDevice->setTrainingCommand( PetManager::FOLLOWOTHER ); break; case 166: // Incapacitation Recovery petManager->enqueueOwnerOnlyPetCommand(player, pet, String("petRecover").toLowerCase().hashCode(), ""); break; case 207: // Train Pet As A Mount if (petControlDevice->getPetType() != PetManager::CREATUREPET) { return 0; } petControlDevice->trainAsMount(player); break; case 234: // Recharge/Feed if (petControlDevice->getPetType() == PetManager::DROIDPET) { petManager->enqueueOwnerOnlyPetCommand(player, pet, String("petRecharge").toLowerCase().hashCode(), ""); } else if (petControlDevice->getPetType() == PetManager::CREATUREPET) { petManager->enqueueOwnerOnlyPetCommand(player, pet, String("petFeed").toLowerCase().hashCode(), ""); } break; case 235: // Train Command: Recharge Other petControlDevice->setTrainingCommand( PetManager::RECHARGEOTHER ); break; default: break; } return 0; }
int PetControlDeviceImplementation::handleObjectMenuSelect(CreatureObject* player, byte selectedID) { //Logger::info("selected call"); Reference<TangibleObject*> strongRef = controlledObject.get(); if (strongRef == NULL) return 1; AiAgent* pet = cast<AiAgent*>(strongRef.get()); Reference<PlayerObject*> ghost = player->getPlayerObject(); if (selectedID == 44) { if (pet == NULL) { error("null controlled object in pet control device"); return 1; } else { Reference<AiAgent*> petReference = pet; Reference<CreatureObject*> playerReference = player; Reference<PetControlDevice*> thisReference = _this.getReferenceUnsafeStaticCast(); Core::getTaskManager()->executeTask([thisReference, petReference, playerReference] () { Locker locker(playerReference); Locker crossLocker(petReference, playerReference); Locker controlLocker(thisReference); thisReference->callObject(playerReference); }, "ControlDeviceCallLambda"); } } else if (selectedID == 59) { if (pet == NULL) { error("null controlled object in pet control device"); return 1; } else { if (status == 1 && !ghost->hasActivePet(pet)) { Reference<AiAgent*> petReference = pet; Reference<CreatureObject*> playerReference = player; Reference<PetControlDevice*> thisReference = _this.getReferenceUnsafeStaticCast(); Core::getTaskManager()->executeTask([thisReference, petReference, playerReference] () { Locker locker(playerReference); Locker crossLocker(petReference, playerReference); Locker controlLocker(thisReference); thisReference->callObject(playerReference); }, "ControlDeviceCallLambda2"); } else { Reference<AiAgent*> petReference = pet; Reference<CreatureObject*> playerReference = player; Reference<PetControlDevice*> thisReference = _this.getReferenceUnsafeStaticCast(); Core::getTaskManager()->executeTask([thisReference, petReference, playerReference] () { Locker locker(playerReference); Locker crossLocker(petReference, playerReference); Locker controlLocker(thisReference); thisReference->storeObject(playerReference); }, "ControlDeviceStoreLambda"); } } } return 0; }