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);
}
Beispiel #2
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;
}