void VehicleController::Call() {
    if(body_)	{
        assert(false && "void Vehicle::call() body already exists");
        return;
    }

	PlayerObject* owner = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(owner_));
	
    if(owner->checkIfMountCalled()) {
		LOG(info) << "VehicleController::Call : body already in world " << this->getId();
        return;
    }

    if(!owner->isConnected() || owner->GetCreature()->isDead() || owner->GetCreature()->isIncapacitated()) {
		LOG(info) << "VehicleController::Call : owner statecheck fail for " << this->getId();
        return;
    }

    body_ = new MountObject();

    BString cust;
    cust.initRawBSTR((int8*)Swoop_Customization, BSTRType_ANSI);
    body_->setCustomizationStr("");//cust.getAnsi());
    body_->setCreoGroup(CreoGroup_Vehicle);
    body_->setTypeOptions(0x1080);
    body_->setMoodId(0);
    body_->setCL(0);

    body_->setId(mId + 1);	// Vehicles are created by the VehicleControllerFactory with +2 step for IDs

    body_->set_controller(this->getId());

    body_->set_owner(owner->getId());
    body_->setParentId(0);
    body_->SetTemplate(mPhysicalModel);
    body_->setSpeciesGroup(mNameFile.getAnsi());
    body_->setSpeciesString(mName.getAnsi());
    body_->SetPosture(0);
    body_->setScale(1.0f);

	std::string con = this->getAttribute<std::string>("condition");
	uint32 health_current = atoi(con.substr(0,con.find_first_of("/")).c_str());
	uint32 health_max = atoi(con.substr(con.find_first_of("/")+1,con.find_first_of("/")).c_str());

	for(int8 i = 0; i<9;i++)	{
		body_->InitStatBase(0);
		body_->InitStatCurrent(0);
		body_->InitStatMax(0);
		body_->InitStatWound(0);
	}

	body_->InitStatCurrent(HamBar_Health, health_current);
	body_->InitStatMax(HamBar_Health, health_max);
	
    owner->setMount(body_);
    owner->setMounted(false);
    owner->setMountCalled(false);

    // Set default direction and position for the body.
	body_->mDirection = owner->GetCreature()->mDirection;
    body_->mPosition  = owner->GetCreature()->mPosition;

    // Move it forward 2 meters
    body_->moveForward(2);
	
	auto terrain = gWorldManager->getKernel()->GetServiceManager()->GetService<swganh::terrain::TerrainService>("TerrainService");

	gObjectManager->LoadSlotsForObject(body_);
	
	body_->mPosition.y =	terrain->GetHeight(gWorldManager->getZoneId(), body_->mPosition.x,body_->mPosition.z) + 0.3;

    // Finally rotate it perpendicular to the player.
    body_->rotateRight(90.0f);

    // add to world
    if(!gWorldManager->addObject(body_)) {
		DLOG(info) << "void Vehicle::call() creating vehicle with id "<<body_->getId()<<" failed : couldnt add to world";
        SAFE_DELETE(body_);
        return;
    }

	auto permissions_objects_ = gObjectManager->GetPermissionsMap();
	body_->SetPermissions(permissions_objects_.find(swganh::object::RIDEABLE_PERMISSION)->second.get());//CREATURE_PERMISSION

	//currently done by gWorldManager->addObject(body_)
	//gSpatialIndexManager->createInWorld(body_);

    gMessageLib->sendUpdateTransformMessage(body_);

    owner->setMountCalled(true);

    return;
}
Example #2
0
void VehicleController::Call() {
    if(body_)	{
        assert(false && "void Vehicle::call() body already exists");
        return;
    }

    if(owner_->checkIfMountCalled()) {
        return;
    }

    if(!owner_->isConnected() || owner_->isDead() || owner_->isIncapacitated()) {
        return;
    }

    body_ = new MountObject();

    BString cust;
    cust.initRawBSTR((int8*)Swoop_Customization, BSTRType_ANSI);
    body_->setCustomizationStr(cust.getAnsi());
    body_->setCreoGroup(CreoGroup_Vehicle);
    body_->setTypeOptions(0x1080);
    body_->setMoodId(0);
    body_->setCL(0);

    body_->setId(mId + 1);	// Vehicles are created by the VehicleControllerFactory with +2 step for IDs

    body_->set_controller(this->getId());

    body_->set_owner(owner_->getId());
    body_->setParentId(0);
    body_->setModelString(mPhysicalModel);
    body_->setSpeciesGroup(mNameFile.getAnsi());
    body_->setSpeciesString(mName.getAnsi());
    body_->states.setPosture(0);
    body_->setScale(1.0f);


    std::string con = this->getAttribute<std::string>("condition");
    body_->getHam()->setPropertyValue(HamBar_Health, HamProperty_CurrentHitpoints,atoi(con.substr(0,con.find_first_of("/")).c_str()));
    body_->getHam()->setPropertyValue(HamBar_Health, HamProperty_MaxHitpoints,atoi(con.substr(con.find_first_of("/")+1,con.find_first_of("/")).c_str()));

    owner_->setMount(body_);
    owner_->setMounted(false);
    owner_->setMountCalled(false);

    // Set default direction and position for the body.
    body_->mDirection = owner_->mDirection;
    body_->mPosition  = owner_->mPosition;

    // Move it forward 2 meters
    body_->moveForward(2);

    // And drop it a little below the terrain to allow the client to normalize it.
    //body_->mPosition.y = Heightmap::getSingletonPtr()->getHeight(body_->mPosition.x, body_->mPosition.z) - 0.3f;
    //TODO: Remove this patch when heightmaps are corrected!
    if(owner_) {
        float hmapHighest = Heightmap::getSingletonPtr()->getHeight(body_->mPosition.x, body_->mPosition.z) - 0.3f;
        body_->mPosition.y = gHeightmap->compensateForInvalidHeightmap(hmapHighest, body_->mPosition.y, (float)10.0);
        if(hmapHighest != body_->mPosition.y) {
            DLOG(INFO) << " VehicleController::Call: PlayerID("<<owner_->getId() << ") calling vehicle... Heightmap found inconsistent, compensated height.";
        }
    }//end TODO

    // Finally rotate it perpendicular to the player.
    body_->rotateRight(90.0f);

    // add to world
    if(!gWorldManager->addObject(body_)) {
		DLOG(INFO) << "void Vehicle::call() creating vehicle with id "<<body_->getId()<<" failed : couldnt add to world";
        SAFE_DELETE(body_);
        return;
    }

	//currently done by gWorldManager->addObject(body_)
	//gSpatialIndexManager->createInWorld(body_);

    gMessageLib->sendUpdateTransformMessage(body_);

    owner_->setMountCalled(true);

    return;
}