Example #1
0
bool CItemMulti::Ship_MoveDelta( CPointBase pdelta )
{
	// Move the ship one space in some direction.

	ASSERT( m_pRegion->m_iLinkedSectors );

	int znew = GetTopZ() + pdelta.m_z;
	if ( pdelta.m_z > 0 )
	{
		if ( znew >= (UO_SIZE_Z - PLAYER_HEIGHT )-1 )
			return( false );
	}
	else if ( pdelta.m_z < 0 )
	{
		if ( znew <= (UO_SIZE_MIN_Z + 3 ))
			return( false );
	}

	// Move the ship and everything on the deck
	CObjBase * ppObjs[MAX_MULTI_LIST_OBJS+1];
	int iCount = Ship_ListObjs( ppObjs );

	for ( int i=0; i <iCount; i++ )
	{
		CObjBase * pObj = ppObjs[i];
		ASSERT(pObj);
		CPointMap pt = pObj->GetTopPoint();
		pt += pdelta;
		if ( ! pt.IsValidPoint())  // boat goes out of bounds !
		{
			DEBUG_ERR(( "Ship uid=0%x out of bounds\n", (DWORD) GetUID()));
			continue;
		}
		pObj->MoveTo( pt );
		if ( pObj->IsChar())
		{
			ASSERT( m_pRegion->m_iLinkedSectors );
			pObj->RemoveFromView(); // Get rid of the blink/walk
			pObj->Update();
		}
	}

	return( true );
}