void StationPlayersCollector::handleSPCharacterShipData(const GameNetworkMessage & message)
{
	DEBUG_FATAL( !getImpl(), ("StationPlayersCollector implementation not set"));
	getImpl()->handleSPCharacterShipData(message);
}
void AffectorRoad::affect (const float worldX, const float worldZ, const int x, const int z, const float amount, const TerrainGenerator::GeneratorChunkData& generatorChunkData) const
{
	if (generatorChunkData.m_legacyRandomGenerator)
	{
		_legacyAffect(worldX, worldZ, x, z, amount, generatorChunkData);
		return;
	}
	if (!isEnabled ())
		return;

	if (amount > 0.f)
	{
		if (m_extent.isWithin (worldX, worldZ))
		{
			const float  width_2        = m_width * 0.5f;
			const float originalHeight = generatorChunkData.heightMap->getData (x, z);

			FindData result;
			if (find (Vector2d (worldX, worldZ), width_2, result))
			{
				const float distanceToCenter = fabsf (result.distanceToCenter);
				const float desiredHeight    = result.height;

				if (WithinRangeInclusiveInclusive (0.f, distanceToCenter, width_2 * (1.f - getFeatherDistance ())))
				{

					if(!m_hasFixedHeights)
					{
						generatorChunkData.heightMap->setData (x, z, desiredHeight);
					}
					else
					{
						// ramped road affector using fixed heights
						generatorChunkData.heightMap->setData (x,z, getRampedHeight(worldX,worldZ,originalHeight));
					}

					//-- clear the flora
					generatorChunkData.floraStaticCollidableMap->setData (x, z, generatorChunkData.floraGroup->getDefaultFlora ());
					generatorChunkData.floraStaticNonCollidableMap->setData (x, z, generatorChunkData.floraGroup->getDefaultFlora ());
					generatorChunkData.floraDynamicNearMap->setData (x, z, generatorChunkData.radialGroup->getDefaultRadial ());
					generatorChunkData.floraDynamicFarMap->setData (x, z, generatorChunkData.radialGroup->getDefaultRadial ());
				}
				else
				{
					//-- height
					const float t = distanceToCenter / width_2;
					DEBUG_FATAL (t < 0.f || t > 1.f, ("t is out of range"));

					if(!m_hasFixedHeights)
					{
						generatorChunkData.heightMap->setData (x, z, linearInterpolate (desiredHeight, originalHeight, t));
					}
					else
					{
						// ramped road affector using fixed heights
						generatorChunkData.heightMap->setData (x, z, getRampedHeight(worldX,worldZ,originalHeight));
					}

				}

				if (WithinRangeInclusiveInclusive (0.f, distanceToCenter, width_2 * (1.f - getFeatherDistanceShader ())))
				{
					//-- set the shader
					if (m_cachedFamilyId != m_familyId)
					{
						m_cachedFamilyId = m_familyId;
						m_cachedSgi      = generatorChunkData.shaderGroup->chooseShader (m_familyId);
					}

					FastRandomGenerator randomGenerator(CoordinateHash::hashTuple(worldX, worldZ));

					ShaderGroup::Info sgi = m_cachedSgi;
					sgi.setChildChoice (randomGenerator.randomFloat());
					generatorChunkData.shaderMap->setData (x, z, sgi);
				}
			}
		}
	}
}
void StationPlayersCollector::ackSPCharacterRankingData()
{
	DEBUG_FATAL( !getImpl(), ("StationPlayersCollector implementation not set"));
	getImpl()->ackSPCharacterRankingData();
}
//======================================================================
// game server generic/global commincation methods
//======================================================================
void StationPlayersCollector::sendToCentralServer(const uint32 serverId, const GameNetworkMessage & message, const bool reliable)
{
	DEBUG_FATAL( !getImpl(), ("StationPlayersCollector implementation not set"));
	getImpl()->sendToCentralServer(serverId, message, reliable);
}
int ServerManufactureSchematicObjectTemplate::getItemCountMax(bool testData) const
{
#ifdef _DEBUG
int testDataValue = 0;
#else
UNREF(testData);
#endif

	const ServerManufactureSchematicObjectTemplate * base = NULL;
	if (m_baseData != NULL)
	{
		base = dynamic_cast<const ServerManufactureSchematicObjectTemplate *>(m_baseData);
#ifdef _DEBUG
		if (testData && base != NULL)
			testDataValue = base->getItemCountMax(true);
#endif
	}

	if (!m_itemCount.isLoaded())
	{
		if (ms_allowDefaultTemplateParams && /*!m_versionOk &&*/ base == NULL)
		{
			DEBUG_WARNING(true, ("Returning default value for missing parameter itemCount in template %s", DataResource::getName()));
			return 0;
		}
		else
		{
			DEBUG_FATAL(base == NULL, ("Template parameter itemCount has not been defined in template %s!", DataResource::getName()));
			return base->getItemCountMax();
		}
	}

	int value = m_itemCount.getMaxValue();
	char delta = m_itemCount.getDeltaType();
	if (delta == '+' || delta == '-' || delta == '_' || delta == '=')
	{
		int baseValue = 0;
		if (m_baseData != NULL)
		{
			if (base != NULL)
				baseValue = base->getItemCountMax();
			else if (ms_allowDefaultTemplateParams)
				DEBUG_WARNING(true, ("No base template for delta, using 0"));
			else
				NOT_NULL(base);
		}
		if (delta == '+')
			value = baseValue + value;
		else if (delta == '-')
			value = baseValue - value;
		else if (delta == '=')
			value = baseValue + static_cast<int>(baseValue * (value / 100.0f));
		else if (delta == '_')
			value = baseValue - static_cast<int>(baseValue * (value / 100.0f));
	}
#ifdef _DEBUG
	if (testData && base != NULL)
	{
	}
#endif

	return value;
}	// ServerManufactureSchematicObjectTemplate::getItemCountMax
void SetupSharedUtility::remove ()
{
	DEBUG_FATAL (!ms_installed, ("SetupSharedUtility::remove not installed"));
	ms_installed = false;
}
void CharacterCreationTracker::remove()
{
	DEBUG_FATAL(!ms_instance,("Not installed.\n"));
	delete ms_instance;
	ms_instance = 0;
}
Exemple #8
0
int Scenegraph::renderFrame(float delta)
{
    static int mouse_button = 0;
    static int mouse_x, mouse_y;
    ScenegraphCamera *c;
    EGLX11EVENT event;

    GFXDEBUG_RESET();

#ifdef _DEBUG
    float t1, t2;
    t1 = getSystemtime();
#endif

    DEBUG_INFO("Scenegraph render delta=%f\n", delta);

    if (cameras.find(currentcamera) == cameras.end())
    {
        DEBUG_NOTIFICATION("No camera defined. Aborting!\n");
        return -1;
    }
    c = cameras[currentcamera];

#ifdef _DEBUG
    t2 = getSystemtime();
    DEBUG_INFO("Profile: cameras.find %f seconds\n", t2-t1);
    t1 = t2;
#endif

    while (display->eventPump(&event))
    {
        switch (event.event)
        {
        case EVENT_KEYEVENT:
            DEBUG_FATAL("Keypress detected, key %c (%d 0x%x)\n",
                               event.u.keyEvent.key,
                               event.u.keyEvent.key,
                               event.u.keyEvent.key);
            switch(event.u.keyEvent.key)
            {
            case 'w':
                c->setCameraPositionDelta(0.0f, 0.0f, -CAMERA_DELTA);
                break;
            case 'a':
                c->setCameraPositionDelta(-CAMERA_DELTA, 0.0f, 0.0f);
                break;
            case 's':
                c->setCameraPositionDelta(0.0f, 0.0f, CAMERA_DELTA);
                break;
            case 'd':
                c->setCameraPositionDelta(CAMERA_DELTA, 0.0f, 0.0f);
                break;
            case 'r':
                c->setCameraPositionDelta(0.0f, CAMERA_DELTA, 0.0f);
                break;
            case 'f':
                c->setCameraPositionDelta(0.0f, -CAMERA_DELTA, 0.0f);
                break;
            case 'z':
                c->setCameraRotationDelta(0.0f, -0.05f, 0.0f);
                break;
            case 'x':
                c->setCameraRotationDelta(0.0f, -0.05f, 0.0f);
                break;
            case 27:
                DEBUG_NOTIFICATION("Escape pressed. Aborting\n");
                return -1;
            }
#if 1
            {
                float x, y, z;
                c->getCameraPosition(&x, &y, &z);
                DEBUG_FATAL("Current camera pos: %f %f %f\n", x, y, z);
                c->getCameraRotation(&x, &y, &z);
                DEBUG_FATAL("Current camera rot: %f %f %f\n", x/3.1415f*180.0f, y/3.1415f*180.0f, z/3.1415f*180.0f);
            }
#endif
            break;
        case EVENT_MOUSEBUTTONEVENT:
            DEBUG_FATAL("Mouse button event, status %d, button id %d\n", event.u.mouseButtonEvent.status, event.u.mouseButtonEvent.button);
            if (event.u.mouseButtonEvent.button == 3 && event.u.mouseButtonEvent.status == true)
            {
                mouse_button = 1;
                mouse_x = event.u.mouseButtonEvent.x;
                mouse_y = event.u.mouseButtonEvent.y;
            }
            else mouse_button = 0;
            break;
        case EVENT_MOUSEMOTIONEVENT:
            if (mouse_button == 0) break;
            //DEBUG_FATAL("Mouse motion X %d Y %d - delta X %d Y %d\n", event.u.mouseMotionEvent.x, event.u.mouseMotionEvent.y,
            //            event.u.mouseMotionEvent.x-mouse_x, event.u.mouseMotionEvent.y-mouse_y);
            c->setCameraRotationDelta(0.0f, (GLfloat)(event.u.mouseMotionEvent.x-mouse_x)*3.1415f/180.0f, (GLfloat)(event.u.mouseMotionEvent.y-mouse_y)*3.1415f/180.0f);
            mouse_x = event.u.mouseMotionEvent.x;
            mouse_y = event.u.mouseMotionEvent.y;
            break;
        case EVENT_QUIT:
            DEBUG_FATAL("System quit signal received.\n");
            return -1;
        default:
            break;
        }
    }

#ifdef _DEBUG
    t2 = getSystemtime();
    DEBUG_INFO("Profile: event pump %f seconds\n", t2-t1);
    t1 = t2;
#endif

    c->applyProjectionMatrix();
    GLMath::Instance()->_glMatrixMode(_GL_MATRIXMODE_MODELVIEW);
    GLMath::Instance()->_glLoadIdentity();

#ifdef _DEBUG
    GLMath::Instance()->_glDebugMatrix(_GL_MATRIXMODE_PROJECTION);
    GLMath::Instance()->_glDebugMatrix(_GL_MATRIXMODE_MODELVIEW);
    t2 = getSystemtime();
    DEBUG_INFO("Profile: matrix formations %f seconds\n", t2-t1);
    t1 = t2;
#endif

    GLWrapper::Instance()->GLCLEAR(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

#ifdef _DEBUG
    t2 = getSystemtime();
    DEBUG_INFO("Profile: glClear %f seconds\n", t2-t1);
    t1 = t2;
#endif

    int total = 0, rendered = 0;
#if 1
    float rot_x, rot_y, rot_z;
    float cpx, cpy, cpz;
    float cx, cy, cz;
    c->getCameraRotation(&rot_x, &rot_y, &rot_z);
    c->getCameraPosition(&cpx, &cpy, &cpz);
    cx = sin(rot_y); cy=0.0f; cz=cos(rot_y);
    //printf("camera rot %f %f %f, pos %f %f %f, view %f %f %f\n", rot_x, rot_y, rot_z, cpx, cpy, cpz, cx, cy, cz);
#endif
    
    std::map <int, ScenegraphObject *>::iterator it = objects.begin();
    for (it = objects.begin(); it != objects.end(); it++)
    {
        DEBUG_INFO("Rendering object %d\n", (*it).first);
#if 1
        float x, y, z, l, dot;
        (*it).second->getPosition(&x, &y, &z);
        x = x-cpx; y = y-cpy; z = z-cpz;
        l = sqrt(x*x + y*y + z*z);
        x /= l; y /= l; z /= l;
        dot = x*cx+y*cy+z*cz;
        //printf("obj direction %f %f %f, dot camera %f\n", x, y, z, dot);
#endif
        (*it).second->isVisible();        
        if (dot < -0.707f)
        {
            GLMath::Instance()->_glPushMatrix();
            (*it).second->render(delta);
            GLMath::Instance()->_glPopMatrix();
            rendered++;
        }
        else
        {
        }
        total++;
#ifdef _DEBUG
        t2 = getSystemtime();
        DEBUG_INFO("Profile: object render %f seconds\n", t2-t1);
        t1 = t2;
#endif
    }
    DEBUG_INFO("culling Total objects per frame %d, rendered %d, hence %02.1f%% coverage\n", total, rendered, (float)100.0f*rendered/total);

    return 0;
}
bool ProcessSpawner::getOutputString(char *buffer, int bufferSize)
{
	if (_returnExistingLine(buffer, bufferSize))
	{
		return true;
	}

	// ----------------------------------------------

	if (!hOutputRead)
	{
		return false;
	}

	DWORD dwAvail = 0;
	if (!::PeekNamedPipe(hOutputRead, NULL, 0, NULL, &dwAvail, NULL))
	{
		// ERROR
		return false;
	}

	if (!dwAvail)
	{
		return false;
	}

	DWORD dwRead;

	if (currentRead >= currentLine)
	{
		const unsigned bufferAvailable = sizeof(readBuffer) - (currentRead - readBuffer);
		unsigned toRead = dwAvail;
		if (toRead > bufferAvailable)
		{
			toRead=bufferAvailable;
		}

		dwRead=0;
		if (!::ReadFile(hOutputRead, currentRead, min(bufferAvailable, dwAvail), &dwRead, NULL) || !dwRead)
		{
			return false;
		}
		dwAvail-=dwRead;
		currentRead+=dwRead;
		if (currentRead==readBuffer+sizeof(readBuffer))
		{
			currentRead=readBuffer;
		}
	}

	if (dwAvail>0)
	{
		const unsigned bufferAvailable = currentLine - currentRead - 1;
		if (bufferAvailable)
		{
			unsigned toRead = dwAvail;
			if (toRead > bufferAvailable)
			{
				toRead=bufferAvailable;
			}

			dwRead=0;
			if (!::ReadFile(hOutputRead, currentRead, min(bufferAvailable, dwAvail), &dwRead, NULL) || !dwRead)
			{
				return false;
			}
			currentRead+=dwRead;

			DEBUG_FATAL(currentRead>=currentLine, (""));
		}
	}

	return _returnExistingLine(buffer, bufferSize);
}
void CharacterCreationTracker::install()
{
	DEBUG_FATAL(ms_instance != NULL,("Called install() twice.\n"));
	ms_instance = new CharacterCreationTracker;
	ExitChain::add(CharacterCreationTracker::remove,"CharacterCreationTracker::remove");
}
DynamicVariableListNestedList::DynamicVariableListNestedList (const DynamicVariableListNestedList &parentList, const std::string &sublistName) :
		m_list(parentList.m_list),
		m_sublistName(parentList.getContextName()+sublistName + '.')
{
	DEBUG_FATAL(sublistName.empty(),("Programmer bug:  passed empty sublist name to NestedList::NestedList.\n"));
}
void TangibleController::handleMessage (const int message, const float value, const MessageQueue::Data* const data, const uint32 flags)
{
	TangibleObject * const owner = getTangibleOwner();
	
	switch (message)
	{
	case CM_pvpMessage:
		{
			const MessageQueuePvpCommand *pvpMsg = dynamic_cast<const MessageQueuePvpCommand *>(data);
			NOT_NULL(pvpMsg);
			Pvp::handlePvpMessage(*owner, *pvpMsg);
		}
		break;
		
	case CM_combatDamageList:
		{
			if (owner->isAuthoritative())
			{
				const MessageQueueCombatDamageList *damageListMessage = 
					dynamic_cast<const MessageQueueCombatDamageList *>(data);
				NOT_NULL(damageListMessage);
				
				const std::vector<CombatEngineData::DamageData> & damageList = 
					damageListMessage->getDamageList();
				if (damageList.size() == 0)
					break;
				
				if (!owner->isInCombat())
				{
					WARNING(true, ("TangibleController setting owner %s to be in "
						"combat to apply damage; we should be able to avoid doing "
						"this!", owner->getNetworkId().getValueString().c_str()));
					owner->setInCombat(true);
				}
				
				// put the damage on the object's current damage list
				
				
				owner->createCombatData();

				CombatEngineData::CombatData * combatData = owner->getCombatData();

				for (std::vector<CombatEngineData::DamageData>::const_iterator 
					iter = damageList.begin(); iter != damageList.end(); ++iter)
				{
					combatData->defenseData.damage.push_back(*iter);
				}
			}
		}
		break;
	
	case CM_directDamage:
		{
			const MessageQueueDirectDamage *damageMessage = 
				dynamic_cast<const MessageQueueDirectDamage *>(data);
			NOT_NULL(damageMessage);
			CombatEngine::damage(*owner, 
				static_cast<ServerWeaponObjectTemplate::DamageType>(damageMessage->getDamageType()), 
				static_cast<uint16>(damageMessage->getHitLocation()),
				damageMessage->getDamageDone());
		}
		break;

	case CM_setOwnerId:
		{
			const MessageQueueNetworkId * const msg = safe_cast<const MessageQueueNetworkId *>(data);
			if(msg)
			{
				owner->setOwnerId(msg->getNetworkId());
			}
		}
		break;
	case CM_setMaxHitPoints:
		{
			const MessageQueueGenericValueType<int> * const msg = safe_cast<const MessageQueueGenericValueType<int> *>(data);
			if(msg)
			{
				owner->setMaxHitPoints(msg->getValue());
			}
		}
		break;
	case CM_setVisible:
		{
			const MessageQueueGenericValueType<bool> * const msg = safe_cast<const MessageQueueGenericValueType<bool> *>(data);
			if(msg)
			{
				owner->setVisible(msg->getValue());
			}
		}
		break;
	case CM_hideFromClient:
		{
			const MessageQueueGenericValueType<bool> * const msg = safe_cast<const MessageQueueGenericValueType<bool> *>(data);
			if(msg)
			{
				owner->setHidden(msg->getValue());
			}
		}
		break;
	case CM_setInvulnerable:
		{
			const MessageQueueGenericValueType<bool> * const msg = safe_cast<const MessageQueueGenericValueType<bool> *>(data);
			if(msg)
			{
				owner->setInvulnerable(msg->getValue());
			}
		}
		break;
	case CM_addLocationTarget:
		{
			const MessageQueueGenericValueType<LocationData> * const msg = safe_cast<const MessageQueueGenericValueType<LocationData> *>(data);
			if(msg)
			{
				owner->addLocationTarget(msg->getValue());
			}
		}
		break;
	case CM_removeLocationTarget:
		{
			const MessageQueueGenericValueType<Unicode::String> * const msg = safe_cast<const MessageQueueGenericValueType<Unicode::String> *>(data);
			if(msg)
			{
				owner->removeLocationTarget(msg->getValue());
			}
		}
		break;
	case CM_setInCombat:
		{
			const MessageQueueGenericValueType<bool> * const msg = safe_cast<const MessageQueueGenericValueType<bool> *>(data);
			if(msg)
			{
				owner->setInCombat(msg->getValue());
			}
		}
		break;
	case CM_addAim:
		{
			owner->addAim();
		}
		break;
	case CM_clearAims:
		{
			owner->clearAims();
		}
		break;
	case CM_alterHitPoints:
		{
			const MessageQueueGenericValueType<std::pair<int, NetworkId> > * const msg = safe_cast<const MessageQueueGenericValueType<std::pair<int, NetworkId> > *>(data);
			if(msg)
			{
				owner->alterHitPoints(msg->getValue().first, false, msg->getValue().second);
			}
		}
		break;
	case CM_addHate:
		{
			const MessageQueueGenericValueType<std::pair<NetworkId, float> > * const msg = safe_cast<const MessageQueueGenericValueType<std::pair<NetworkId, float> > *>(data);
			WARNING((msg == NULL), ("TangibleController::handleMessage(CM_addHate) The message data should never be NULL"));

			if(msg)
			{
				owner->addHate(msg->getValue().first, msg->getValue().second);
			}
		}
		break;
	case CM_setHate:
		{
			const MessageQueueGenericValueType<std::pair<NetworkId, float> > * const msg = safe_cast<const MessageQueueGenericValueType<std::pair<NetworkId, float> > *>(data);
			WARNING((msg == NULL), ("TangibleController::handleMessage(CM_setHate) The message data should never be NULL"));

			if(msg)
			{
				owner->setHate(msg->getValue().first, msg->getValue().second);
			}
		}
		break;
	case CM_removeHateTarget:
		{
			const MessageQueueGenericValueType<NetworkId> * const msg = safe_cast<const MessageQueueGenericValueType<NetworkId> *>(data);
			WARNING((msg == NULL), ("TangibleController::handleMessage(CM_removeHateTarget) The message data should never be NULL"));

			if(msg)
			{
				owner->removeHateTarget(msg->getValue());
			}
		}
		break;
	case CM_clearHateList:
		{
			owner->clearHateList();
		}
		break;
	case CM_resetHateTimer:
		{
			owner->resetHateTimer();
		}
		break;
	case CM_forceHateTarget:
		{
			const MessageQueueGenericValueType<NetworkId> * const msg = safe_cast<const MessageQueueGenericValueType<NetworkId> *>(data);
			WARNING((msg == NULL), ("TangibleController::handleMessage(CM_removeHateTarget) The message data should never be NULL"));

			if(msg)
			{
				owner->forceHateTarget(msg->getValue());
			}
		}
		break;
	case CM_autoExpireHateListTargetEnabled:
		{
			const MessageQueueGenericValueType<bool> * const msg = safe_cast<const MessageQueueGenericValueType<bool> *>(data);
			WARNING((msg == NULL), ("TangibleController::handleMessage(CM_setHateListExpireTargetEnabled) The message data should never be NULL"));

			if (msg != NULL)
			{
				owner->setHateListAutoExpireTargetEnabled(msg->getValue());
			}
		}
		break;
	case CM_setCraftedId:
		{
			const MessageQueueGenericValueType<NetworkId> * const msg = safe_cast<const MessageQueueGenericValueType<NetworkId> *>(data);
			if(msg)
			{
				owner->setCraftedId(msg->getValue());
			}
		}
		break;
	case CM_startCraftingSession:
		{
			const MessageQueueGenericValueType<NetworkId> * const msg = safe_cast<const MessageQueueGenericValueType<NetworkId> *>(data);
			if(msg)
			{
				CreatureObject * crafter = safe_cast<CreatureObject *>(NetworkIdManager::getObjectById(msg->getValue()));
				DEBUG_FATAL(!crafter, ("%s:%s received startCraftingSession controller message for crafter %s, but crafter %s is not loaded on this server!", owner->getObjectTemplateName(), owner->getNetworkId().getValueString().c_str(), msg->getValue().getValueString().c_str(), msg->getValue().getValueString().c_str()));
				if(crafter)
					owner->startCraftingSession(*crafter);
			}
		}
		break;
	case CM_addObjectToOutputSlot:
		{
			const MessageQueueGenericValueType<std::pair<NetworkId, NetworkId> > * const msg = safe_cast<const MessageQueueGenericValueType<std::pair<NetworkId, NetworkId> > *>(data);
			if(msg)
			{
				ServerObject * object = safe_cast<ServerObject *>(NetworkIdManager::getObjectById(msg->getValue().first));
				DEBUG_FATAL(! object, ("%s:%s received addObjectToOutputSlot controller message, but the ingredient %s is not loaded on this server!", owner->getObjectTemplateName(), owner->getNetworkId().getValueString().c_str(), msg->getValue().first.getValueString().c_str()));
				if(object)
				{
					ServerObject * transferer = safe_cast<ServerObject *>(NetworkIdManager::getObjectById(msg->getValue().second));
					// transferer is allowed to be null
					owner->addObjectToOutputSlot(*object, transferer);
				}
			}
		}
		break;
	case CM_setCraftingManufactureSchematic:
		{
			const MessageQueueGenericValueType<NetworkId> * const msg = safe_cast<const MessageQueueGenericValueType<NetworkId> *>(data);
			if(msg)
			{
				ManufactureSchematicObject * schematic = safe_cast<ManufactureSchematicObject *>(NetworkIdManager::getObjectById(msg->getValue()));
				DEBUG_FATAL(! schematic, ("%s:%s received setCraftingManufactureSchematic controller message, but the ingredient %s is not loaded on this server!", owner->getObjectTemplateName(), owner->getNetworkId().getValueString().c_str(), msg->getValue().getValueString().c_str()));
				if(schematic)
				{
					owner->setCraftingManufactureSchematic(*schematic);
				}
			}
		}
		break;
	case CM_clearCraftingManufactureSchematic:
		{
			owner->clearCraftingManufactureSchematic();
		}
		break;
	case CM_setCraftingPrototype:
		{
			const MessageQueueGenericValueType<NetworkId> * const msg = safe_cast<const MessageQueueGenericValueType<NetworkId> *>(data);
			if(msg)
			{
				ServerObject * prototype = safe_cast<ServerObject *>(NetworkIdManager::getObjectById(msg->getValue()));
				DEBUG_FATAL(! prototype, ("%s:%s received setCraftingPrototype controller message, but the ingredient %s is not loaded on this server!", owner->getObjectTemplateName(), owner->getNetworkId().getValueString().c_str(), msg->getValue().getValueString().c_str()));
				if(prototype)
				{
					owner->setCraftingPrototype(*prototype);
				}
			}
		}
		break;
	case CM_clearCraftingPrototype:
		{
			owner->clearCraftingPrototype();
		}
		break;
	case CM_setCreatorId:
		{
			const MessageQueueGenericValueType<NetworkId> * const msg = safe_cast<const MessageQueueGenericValueType<NetworkId> *>(data);
			if(msg)
			{
				owner->setCreatorId(msg->getValue());
			}
		}
		break;
	case CM_setCreatorXp:
		{
			const MessageQueueGenericValueType<int> * const msg = safe_cast<const MessageQueueGenericValueType<int> *>(data);
			if(msg)
			{
				owner->setCreatorXp(msg->getValue());
			}
		}
		break;
	case CM_setCreatorXpType:
		{
			const MessageQueueGenericValueType<int> * const msg = safe_cast<const MessageQueueGenericValueType<int> *>(data);
			if(msg)
			{
				owner->setCreatorXpType(msg->getValue());
			}
		}
		break;
	case CM_setVisibleComponents:
		{
			const MessageQueueGenericValueType<std::vector<int> > * const msg = safe_cast<const MessageQueueGenericValueType<std::vector<int> > *>(data);
			if(msg)
			{
				owner->setVisibleComponents(msg->getValue());
			}
		}
		break;
	case CM_setCraftedType:
		{
			const MessageQueueGenericValueType<int> * const msg = safe_cast<const MessageQueueGenericValueType<int> *>(data);
			if(msg)
			{
				owner->setCraftedType(msg->getValue());
			}
		}
		break;
	case CM_setCondition:
		{
			const MessageQueueGenericValueType<int> * const msg = safe_cast<const MessageQueueGenericValueType<int> *>(data);
			if(msg)
			{
				owner->setCondition(msg->getValue());
			}
		}
		break;
	case CM_clearCondition:
		{
			const MessageQueueGenericValueType<int> * const msg = safe_cast<const MessageQueueGenericValueType<int> *>(data);
			if(msg)
			{
				owner->clearCondition(msg->getValue());
			}
		}
		break;
	case CM_npcConversationStart:
		{
			const MessageQueueStartNpcConversation * const msg = NON_NULL(dynamic_cast<const MessageQueueStartNpcConversation *>(data));
			
			const CachedNetworkId npcId (msg->getNpc ());
			TangibleObject * const npcObject = dynamic_cast<TangibleObject *>(npcId.getObject ());
			if (npcObject)
			{
				owner->startNpcConversation (*npcObject, msg->getConversationName().c_str(), msg->getStarter(), msg->getAppearanceOverrideTemplateCrc());
			}
		}
		break;
		
	case CM_npcConversationStop:
		{				
			owner->endNpcConversation ();
		}
		break;
		
	case CM_npcConversationSelect:
		{
			owner->respondToNpc (static_cast<int>(value));
		}
		break;
	case CM_forwardNpcConversationMessage:
		{
			typedef std::pair<std::pair<StringId, ProsePackage>, Unicode::String> Payload;
			const MessageQueueGenericValueType<Payload> * const msg = safe_cast<const MessageQueueGenericValueType<Payload> *>(data);
			if(msg)
			{
				const Payload & payload = msg->getValue ();
				owner->sendNpcConversationMessage(payload.first.first, payload.first.second, payload.second);
			}
		}
		break;
	case CM_addNpcConversationResponse:
		{
			typedef std::pair<StringId, ProsePackage> Payload;
			const MessageQueueGenericValueType<Payload> * const msg = safe_cast<const MessageQueueGenericValueType<Payload> *>(data);
			if(msg)
			{
				const Payload & payload = msg->getValue ();
				owner->addNpcConversationResponse(payload.first, payload.second);
			}
		}
		break;
	case CM_removeNpcConversationResponse:
		{
			typedef std::pair<StringId, ProsePackage> Payload;
			const MessageQueueGenericValueType<Payload> * const msg = safe_cast<const MessageQueueGenericValueType<Payload> *>(data);
			if(msg)
			{
				const Payload & payload = msg->getValue ();
				owner->removeNpcConversationResponse(payload.first, payload.second);
			}
		}
		break;
	case CM_sendNpcConversationResponses:
		{
			owner->sendNpcConversationResponses();
		}
		break;
	case CM_playerResponseToNpcConversation:
		{
			typedef std::pair<std::string, std::pair<NetworkId, std::pair<StringId, ProsePackage> > > Payload;
			const MessageQueueGenericValueType<Payload> * const msg = safe_cast<const MessageQueueGenericValueType<Payload> *>(data);
			if(msg)
			{
				const Payload & payload = msg->getValue ();
				owner->handlePlayerResponseToNpcConversation(payload.first, payload.second.first, payload.second.second.first, payload.second.second.second);
			}
		}
		break;
	case CM_setBioLink:
		{
			const MessageQueueGenericValueType<NetworkId> * const msg = safe_cast<const MessageQueueGenericValueType<NetworkId> *>(data);
			if(msg)
			{
				const NetworkId & linkId = msg->getValue();
				if (linkId != NetworkId::cms_invalid)
					owner->setBioLink(linkId);
				else
					owner->clearBioLink();
			}
		}
		break;
	case CM_commandQueueForceExecuteCommandFwd:
		{
			MessageQueueCommandQueueForceExecuteCommandFwd const * const cmdMsg = dynamic_cast<const MessageQueueCommandQueueForceExecuteCommandFwd *>(data);
			Command::ErrorCode status = static_cast<Command::ErrorCode>(cmdMsg->getStatus());

			owner->forceExecuteCommand(CommandTable::getCommand(cmdMsg->getCommandHash()), cmdMsg->getTargetId(), cmdMsg->getParams(), status, cmdMsg->getCommandIsFromCommandQueue());
		}
		break;
	case CM_commandQueueEnqueue:
		{
			handleCommandQueueEnqueue(dynamic_cast<const MessageQueueCommandQueueEnqueue *>(data));
		}
		break;
	case CM_commandQueueRemove:
		{
			MessageQueueCommandQueueRemove const *msg = dynamic_cast<MessageQueueCommandQueueRemove const *>(data);
			owner->commandQueueRemove(msg->getSequenceId());
		}
		break;
	case CM_commandQueueEnqueueFwd:
		{
			handleCommandQueueEnqueueFwd(dynamic_cast<const MessageQueueCommandQueueEnqueueFwd *>(data));
		}
		break;
	case CM_setAttackableOverride:
		{
			const MessageQueueGenericValueType<bool> * const msg = safe_cast<const MessageQueueGenericValueType<bool> *>(data);
			if(msg)
			{
				owner->setAttackableOverride(msg->getValue());
			}
		}
		break;
	case CM_addPassiveReveal:
		{
			const MessageQueueGenericValueType<std::pair<std::pair<int, int>, NetworkId> > * const msg = safe_cast<const MessageQueueGenericValueType<std::pair<std::pair<int, int>, NetworkId> > *>(data);
			if(msg)
			{
				owner->addPassiveReveal(msg->getValue().second, msg->getValue().first.first, (msg->getValue().first.second != 0));
			}
		}
		break;
	case CM_removePassiveReveal:
		{
			const MessageQueueGenericValueType<NetworkId> * const msg = safe_cast<const MessageQueueGenericValueType<NetworkId> *>(data);
			if(msg)
			{
				owner->removePassiveReveal(msg->getValue());
			}
		}
		break;
	case CM_removeAllPassiveReveal:
		{
			owner->removeAllPassiveReveal();
		}
		break;
	case CM_addHateOverTime:
		{
			const MessageQueueGenericValueType<std::pair<NetworkId, std::pair<int, float> > > * const msg = safe_cast<const MessageQueueGenericValueType<std::pair<NetworkId, std::pair<int, float> > > *>(data);
			if(msg)
			{
				owner->addHateOverTime(msg->getValue().first, msg->getValue().second.second, msg->getValue().second.first);
			}
		}
		break;
	case CM_addUserToAccessList:
		{
			MessageQueueGenericValueType<std::pair<int, NetworkId> > const *msg = safe_cast<MessageQueueGenericValueType<std::pair<int, NetworkId> > const *>(data);
			WARNING((msg == NULL), ("TangibleController::handleMessage(CM_addUserToAccessList) The message data should never be NULL"));

			if(msg)
			{
				if(msg->getValue().first < 0)
					owner->addUserToAccessList(msg->getValue().second);
				else
					owner->addGuildToAccessList(msg->getValue().first);
			}
		}
		break;
	case CM_removeUserFromAccessList:
		{
			MessageQueueGenericValueType<std::pair<int, NetworkId> > const *msg = safe_cast<MessageQueueGenericValueType<std::pair<int, NetworkId> > const *>(data);
			WARNING((msg == NULL), ("TangibleController::handleMessage(CM_removeUserFromAccessList) The message data should never be NULL"));

			if(msg)
			{
				if(msg->getValue().first < 0)
					owner->removeUserFromAccessList(msg->getValue().second);
				else
					owner->removeGuildFromAccessList(msg->getValue().first);
			}
		}
		break;
	case CM_clearUserAccessList:
		{
			MessageQueueGenericValueType<bool> const *msg = safe_cast<MessageQueueGenericValueType<bool> const *>(data);
			if(msg)
			{
				if(msg->getValue())
					owner->clearGuildAccessList();
				else
					owner->clearUserAccessList();
			}
		}
		break;
	case CM_addObjectEffect:
		{
			MessageQueueGenericValueType<std::pair<std::string, std::pair<std::string, std::pair<std::string, std::pair<Vector, float > > > > > const * msg = safe_cast<MessageQueueGenericValueType<std::pair<std::string, std::pair<std::string, std::pair<std::string, std::pair<Vector, float > > > > > const *>(data);
			if(msg)
			{
				owner->addObjectEffect(msg->getValue().second.first, msg->getValue().second.second.first, msg->getValue().second.second.second.first, msg->getValue().second.second.second.second, msg->getValue().first);
			}
		}
		break;
	case CM_removeObjectEffect:
		{
			MessageQueueGenericValueType<std::string> const * msg = safe_cast<MessageQueueGenericValueType<std::string> const *>(data);
			if(msg)
			{
				owner->removeObjectEffect(msg->getValue());
			}
		}
		break;
	case CM_removeAllObjectEffect:
		{
			MessageQueueGenericValueType<bool> const *msg = safe_cast<MessageQueueGenericValueType<bool> const *>(data);
			if(msg)
			{
				if(msg->getValue())
					owner->removeAllObjectEffects();
			}
		}
		break;
	default:
		ServerController::handleMessage(message, value, data, flags);
		break;
	}
}
/**
 * Send the snapshot to the appropriate server.
 *
 * This function will send messages to the appropriate gameServer to
 * create a proxy for the objects in the snapshot, then it will send a
 * message to central to relinquish authority for the objects.
 *
 * @return true if the objects were sent, false if they were not.
 */
bool SwgSnapshot::send(GameServerConnection *connection) const
{
	PROFILER_AUTO_BLOCK_DEFINE("SwgSnapshot::send");
	
	if (connection==0)
		return false;

	DEBUG_REPORT_LOG(ConfigServerDatabase::getLogObjectLoading(),("Sending Snapshot\n"));

	PROFILER_BLOCK_DEFINE(prebaselinesBlock,"sendPreBaselinesCustomData");
	PROFILER_BLOCK_ENTER(prebaselinesBlock);
	for (LocatorListType::const_iterator loc=m_locatorList.begin(); loc!=m_locatorList.end(); ++loc)
	{
		(*loc)->sendPreBaselinesCustomData(*connection);
	}
	PROFILER_BLOCK_LEAVE(prebaselinesBlock);

	OIDListType oidList;
	m_objectTableBuffer.getObjectList(oidList);

	PROFILER_BLOCK_DEFINE(sendObjectData,"send object data");
	PROFILER_BLOCK_ENTER(sendObjectData);

	static std::vector<BatchBaselinesMessageData> baselines;
	baselines.clear();

	for (OIDListType::iterator i=oidList.begin(); i!=oidList.end(); ++i)
	{
		PROFILER_BLOCK_DEFINE(createBlock, "object create and position");
		PROFILER_BLOCK_ENTER(createBlock);

		const DBSchema::ObjectBufferRow *baseData=m_objectTableBuffer.findConstRowByIndex((*i));
		NOT_NULL(baseData);
	
		NetworkId networkId=(*i);
		DEBUG_FATAL(networkId != baseData->object_id.getValue(),("Object ID and row value didn't match"));

		uint32 crc = baseData->object_template_id.getValue();
		CreateObjectByCrcMessage com(networkId,
									 crc,
									 static_cast<unsigned short>(baseData->type_id.getValue()),
									 true,
									 NetworkId(baseData->contained_by.getValue()));
//		connection->send(com,true);
		DEBUG_REPORT_LOG(ConfigServerDatabase::getLogObjectLoading(),("\tSent CreateObjectMessage for object %s\n",networkId.getValueString().c_str()));

		Transform t;
		Quaternion q(static_cast<real>(baseData->quaternion_w.getValue()),
					 static_cast<real>(baseData->quaternion_x.getValue()),
					 static_cast<real>(baseData->quaternion_y.getValue()),
					 static_cast<real>(baseData->quaternion_z.getValue()));
		q.getTransform(&t); // reorients the transform according to the quaternion

		t.validate();
		
		t.setPosition_p(Vector (static_cast<real>(baseData->x.getValue()), 
								static_cast<real>(baseData->y.getValue()),
								static_cast<real>(baseData->z.getValue())));

		UpdateObjectPositionMessage uopm(
			NetworkId(baseData->object_id.getValue()),
			t,
			t,
			NetworkId(baseData->contained_by.getValue()),
			baseData->slot_arrangement.getValue(),
			NetworkId(baseData->load_with.getValue()),
			baseData->player_controlled.getValue(),
			false);

//		connection->send(uopm,true);

		PROFILER_BLOCK_LEAVE(createBlock);

		PROFILER_BLOCK_DEFINE(encodeData,"encode data");
		PROFILER_BLOCK_ENTER(encodeData);

		bool okToSend = encodeParentClientData(networkId,baseData->type_id.getValue(),baselines);
		okToSend = okToSend && encodeClientData(networkId,baseData->type_id.getValue(),baselines);
		okToSend = okToSend && encodeServerData(networkId,baseData->type_id.getValue(),baselines);
		okToSend = okToSend && encodeSharedData(networkId,baseData->type_id.getValue(),baselines);

		PROFILER_BLOCK_LEAVE(encodeData);
			
		if (okToSend)
		{
			PROFILER_AUTO_BLOCK_DEFINE("connection->send (baselines)");
				
			connection->send(com,true);
			connection->send(uopm,true);
		}
		else
		{
			(*i)=NetworkId::cms_invalid;
		}
	}

	BatchBaselinesMessage bbm(baselines);
	connection->send(bbm,true);

	PROFILER_BLOCK_LEAVE(sendObjectData);

	PROFILER_BLOCK_DEFINE(sendEndBaselines,"send EndBaselines");
	PROFILER_BLOCK_ENTER(sendEndBaselines);
		
	// Send EndBaselines in reverse order (container & portal system requires this)
	for (OIDListType::reverse_iterator r=oidList.rbegin(); r!=oidList.rend(); ++r)
	{
		if (*r != NetworkId::cms_invalid)
		{
			EndBaselinesMessage const ebm(*r);
			connection->send(ebm,true);
		}
//		DEBUG_REPORT_LOG(true, ("\tSent EndBaselinesMessage for object %i\n",(*r).getValue()));
	}
	PROFILER_BLOCK_LEAVE(sendEndBaselines);

	// Send resource data (if any) after all objects but before the post-baselines custom data
	m_resourceTypeBuffer.sendResourceTypeObjects(*connection);
	m_bountyHunterTargetBuffer.sendBountyHunterTargetMessage (*connection);

	// Send post-baselines custom data, such as "UniverseComplete" messages, etc.
	PROFILER_BLOCK_DEFINE(sendPostBaselinesCustomData,"sendPostBaselinesCustomData");
	PROFILER_BLOCK_ENTER(sendPostBaselinesCustomData);
	
	for (LocatorListType::const_iterator loc2=m_locatorList.begin(); loc2!=m_locatorList.end(); ++loc2)
	{
		(*loc2)->sendPostBaselinesCustomData(*connection);
	}
	PROFILER_BLOCK_LEAVE(sendPostBaselinesCustomData);

	// Send any MessageTos for these objects
	// This must happen after EndBaselinesMessage is sent for all of the objects
	{
		PROFILER_AUTO_BLOCK_DEFINE("send MessageTos");

		m_messageBuffer.sendMessages(*connection);
		for (OIDListType::const_iterator i=oidList.begin(); i!=oidList.end(); ++i)
		{
			if (*i != NetworkId::cms_invalid)
				MessageToManager::getInstance().sendMessagesForObject(*i, *connection);
		}
	}

	DEBUG_REPORT_LOG(ConfigServerDatabase::getLogObjectLoading(),("Done sending Snapshot\n"));
	return true;
}
float AffectorRoad::getRampedHeight (const float worldX, const float worldZ,const float terrainHeight) const
{
	if (!m_extent.isWithin (worldX, worldZ))
		return -100.f;

	const float widthSquared = sqr (m_width/2.0f);

	float distanceSquared = widthSquared;
	int foundIndex = -1;

	//-- first, scan how far we are from the points
	{
		const int n = m_pointList.getNumberOfElements ();
		int i;
		for (i = 0; i < n; ++i)
		{
			const float x = m_pointList [i].x;
			const float y = m_pointList [i].y;
			const float thisDistanceSquared = sqr (worldX - x) + sqr (worldZ - y);
			if (thisDistanceSquared < distanceSquared)
			{
				distanceSquared = thisDistanceSquared;
				
				foundIndex = i;
			}
		}
	}

	
	//-- next, scan each line
	{
		const int n = m_pointList.getNumberOfElements () - 1;
		int i;
		for (i = 0; i < n; ++i)
		{
			const float x1 = m_pointList [i].x;
			const float y1 = m_pointList [i].y;  //lint !e578  //-- hides y1 (double)
			const float x2 = m_pointList [i + 1].x;
			const float y2 = m_pointList [i + 1].y;

			const float u = ((worldX - x1) * (x2 - x1) + (worldZ - y1) * (y2 - y1)) / (sqr (x2 - x1) + sqr (y2 - y1));
			if (u >= 0 && u <= 1)
			{
				const float x = x1 + u * (x2 - x1);
				const float y = y1 + u * (y2 - y1);
				const float thisDistanceSquared = sqr (worldX - x) + sqr (worldZ - y);
				if (thisDistanceSquared < distanceSquared)
				{
					distanceSquared = thisDistanceSquared;
					foundIndex = i;
				}
			}
		}
	}

	if (distanceSquared < widthSquared)
	{

		DEBUG_FATAL(foundIndex == -1,("AffectorRoad::getRampedHeight - foundIndex is -1"));
		
		float height = 0.0f;

		// start feathering
		float featherMultiplier = 1.0f;

		const float newFeatherDistance        = (m_width/2.0f) * (1.f - getFeatherDistance ());

		const float newFeatherDistanceSquared = sqr (newFeatherDistance);

		if (distanceSquared >= newFeatherDistanceSquared)
		{
			featherMultiplier = 1.f - (sqrt (distanceSquared) - newFeatherDistance) / (m_width/2.0f - newFeatherDistance);
			const Feather feather(getFeatherFunction());
			featherMultiplier=feather.feather(0.f, 1.f, featherMultiplier);
		}
		// end feathering

		const float startHeight = m_heightList[foundIndex];
		if(foundIndex != m_pointList.getNumberOfElements() - 1)
		{
			// project the world point onto the line between the control points and interp for the height
			const Vector2d position(worldX,worldZ);
			const float endHeight = m_heightList[foundIndex + 1];
			const Vector2d p1(m_pointList [foundIndex].x,m_pointList [foundIndex].y);
			const Vector2d p2(m_pointList [foundIndex+1].x,m_pointList [foundIndex+1].y);
			const float totalDistance = p1.magnitudeBetween(p2);

			const Line2d line (p1,p2);
			const float distToLine = line.computeDistanceTo(position);
			const float realDistToPoint1 = p1.magnitudeBetween(position);
			const float realDistToPoint2 = p2.magnitudeBetween(position);
			const float projectedDistToPoint1 = sqrt(sqr(realDistToPoint1) - sqr(distToLine));
			const float projectedDistToPoint2 = sqrt(sqr(realDistToPoint2) - sqr(distToLine));

			if(totalDistance != 0.0f && projectedDistToPoint1 <= totalDistance && projectedDistToPoint2 <= totalDistance)
			{
				height = startHeight + (projectedDistToPoint1/totalDistance) * (endHeight - startHeight);
			}
			else
			{
				height = startHeight;
			}
		}
		else
		{
			height = startHeight;
		}

		// don't build canyons or ridges due to feathering to 0 height
		const float delta = height - terrainHeight;
		height = terrainHeight + (delta * featherMultiplier);

		return height;
	}

	return -100.f;
}
Exemple #15
0
Extent::~Extent(void)
{
	DEBUG_FATAL(m_referenceCount > 0, ("referenceCount not zero %d", m_referenceCount));
}
int ZlibFile::write(int, const void *)
{
	DEBUG_FATAL(true, ("writing to a zlib file is not supported"));
	return 0;
}
bool ObjectTemplateCustomizationDataWriter::writeToFile(const std::string &pathName, bool allowOverwrite)
{
	//-- Don't write anything if there's no data to write.
	bool hasData = false;

	if (!m_paletteColorData->empty())
		hasData = true;

	if (!m_rangedIntData->empty())
		hasData = true;

	if (!hasData)
	{
		DEBUG_REPORT_LOG(true, ("writeToFile(): no data: skipped writing [%s].\n", pathName.c_str()));
		return true;
	}

	//-- Handle no-overwrite case.
	if (!allowOverwrite)
	{
		FILE *const testFile = fopen(pathName.c_str(), "r");
		if (testFile != NULL)
		{
			fclose(testFile);
			DEBUG_REPORT_LOG(true, ("writeToFile(): overwrite attempt: skipped writing [%s] because it already exists and allowOverwrite == false.\n", pathName.c_str()));
			return false;
		}
	}

	//-- open file
	FILE *const file = fopen(pathName.c_str(), "w");
	if (!file)
	{
		WARNING(true, ("failed to create file [%s].", pathName.c_str()));
		return false;
	}

	//-- sort the output data
	m_paletteColorData->sort();
	m_rangedIntData->sort();

	//-- write palette color variables
	fprintf(file, "paletteColorCustomizationVariables = [");
	{
		int i = 0;
		int const count = static_cast<int>(m_paletteColorData->size());

		const StringList::iterator endIt = m_paletteColorData->end();
		for (StringList::iterator it = m_paletteColorData->begin(); it != endIt; ++it, ++i)
		{
			if (i == (count - 1))
			{
				// -- Fixup last entry to use ] in place of final comma.
				std::string::size_type position = it->rfind(',');
				DEBUG_FATAL(static_cast<int>(position) == static_cast<int>(std::string::npos), ("bad data, where's the final comma?"));

				(*it)[position] = ']';
			}

			fprintf(file, "\n  %s", it->c_str());
		}
	}
	if (m_paletteColorData->empty())
		fprintf(file, "]");
	fprintf(file, "\n\n");

	//-- write ranged int variables
	fprintf(file, "rangedIntCustomizationVariables = [");
	{
		int i = 0;
		int const count = static_cast<int>(m_rangedIntData->size());

		const StringList::iterator endIt = m_rangedIntData->end();
		for (StringList::iterator it = m_rangedIntData->begin(); it != endIt; ++it, ++i)
		{
			if (i == (count - 1))
			{
				// -- Fixup last entry to use ] in place of final comma.
				std::string::size_type position = it->rfind(',');
				DEBUG_FATAL(static_cast<int>(position) == static_cast<int>(std::string::npos), ("bad data, where's the final comma?"));

				(*it)[position] = ']';
			}

			fprintf(file, "\n  %s", it->c_str());
		}
	}
	if (m_rangedIntData->empty())
		fprintf(file, "]");
	fprintf(file, "\n\n");

	fclose(file);

	//-- return success
	return true;
}