All pastes #1752262 Raw Edit

MapAndreas.cpp

public cpp v1 · immutable
#1752262 ·published 2010-01-15 11:22 UTC
rendered paste body
//----------------------------------------------------------////   SA-MP Multiplayer Modification For GTA:SA//   Copyright 2004-2010 SA-MP Team////   Author: Kye 10 Jan 2010////----------------------------------------------------------#include <stdio.h>#include <stdlib.h>#include "MapAndreas.h"//----------------------------------------------------------CMapAndreas::CMapAndreas(){	m_iOperatingMode = MAP_ANDREAS_MODE_NONE;	m_pPointData = NULL;}//----------------------------------------------------------CMapAndreas::~CMapAndreas(){	m_iOperatingMode = MAP_ANDREAS_MODE_NONE;    if(m_pPointData) free(m_pPointData);	m_pPointData = NULL;}//----------------------------------------------------------int CMapAndreas::Init(int iMode){	// check if already inited	if(m_iOperatingMode != MAP_ANDREAS_MODE_NONE) 		return MAP_ANDREAS_ERROR_SUCCESS;	if(iMode == MAP_ANDREAS_MODE_FULL)	{        // allocate the memory we need		m_pPointData = (unsigned short *)calloc(MAP_ANDREAS_POINTS_FULL,sizeof(unsigned short));		if(NULL == m_pPointData) return MAP_ANDREAS_ERROR_MEMORY;		//printf("MapAndreas: allocated %u bytes of memory\n",MAP_ANDREAS_POINTS_FULL*sizeof(unsigned short));				// load the file contents in to our point data buffer		fileInput = fopen(MAP_ANDREAS_HMAP_FILE_FULL,"rb");		if(NULL == fileInput)		{			free(m_pPointData);			m_pPointData = NULL;			return MAP_ANDREAS_ERROR_DATA_FILES;		}				for(int x=0;x<MAP_ANDREAS_POINTS_FULL;x++) {            fread(&m_pPointData[x],1,sizeof(unsigned short),fileInput);		}		fclose(fileInput);		//printf("MapAndreas: file %s read in to memory\n",MAP_ANDREAS_HMAP_FILE_FULL);        m_iOperatingMode = MAP_ANDREAS_MODE_FULL;		return MAP_ANDREAS_ERROR_SUCCESS;	}	else if(iMode == MAP_ANDREAS_MODE_MINIMAL)	{        // allocate the memory we need		m_pPointData = (unsigned short *)calloc(MAP_ANDREAS_POINTS_MINIMAL,sizeof(unsigned short));		if(NULL == m_pPointData) return MAP_ANDREAS_ERROR_MEMORY;		//printf("MapAndreas: allocated %u bytes of memory\n",MAP_ANDREAS_POINTS_MINIMAL*sizeof(unsigned short));				// load the file contents in to our point data buffer		fileInput = fopen(MAP_ANDREAS_HMAP_FILE_MINIMAL,"rb");		if(NULL == fileInput)		{			free(m_pPointData);			m_pPointData = NULL;			return MAP_ANDREAS_ERROR_DATA_FILES;		}				for(int x=0;x<MAP_ANDREAS_POINTS_MINIMAL;x++) {            fread(&m_pPointData[x],1,sizeof(unsigned short),fileInput);		}		fclose(fileInput);		//printf("MapAndreas: file %s read in to memory\n",MAP_ANDREAS_HMAP_FILE_FULL);        m_iOperatingMode = MAP_ANDREAS_MODE_MINIMAL;		return MAP_ANDREAS_ERROR_SUCCESS;	}	else if(iMode == MAP_ANDREAS_MODE_NOCACHE)	{		fileInput = fopen(MAP_ANDREAS_HMAP_FILE_FULL,"rb");		if(NULL == fileInput) return MAP_ANDREAS_ERROR_DATA_FILES;		m_iOperatingMode = iMode;		return MAP_ANDREAS_ERROR_SUCCESS;	}  	else if(iMode == MAP_ANDREAS_MODE_MINCACHE)	{		fileInput = fopen(MAP_ANDREAS_HMAP_FILE_MINIMAL,"rb");		if(NULL == fileInput) return MAP_ANDREAS_ERROR_DATA_FILES;		m_iOperatingMode = MAP_ANDREAS_MODE_MINCACHE;		return MAP_ANDREAS_ERROR_SUCCESS;	}  		return MAP_ANDREAS_ERROR_FAILURE;}//----------------------------------------------------------float CMapAndreas::FindZ_For2DCoord(float X, float Y){	// check for a co-ord outside the map	if(X < -3000.0f || X > 3000.0f || Y > 3000.0f || Y < -3000.0f) return 0.0f;	// get row/col on 6000x6000 grid	int iGridX = ((int)X) + 3000;	int iGridY = (((int)Y) - 3000) * -1;	int iDataPos;   	if(m_iOperatingMode == MAP_ANDREAS_MODE_FULL)	{		iDataPos = (iGridY * 6000) + iGridX; // for every Y, increment by the number of cols, add the col index.		return (float)m_pPointData[iDataPos] / 100.0f; // the data is a float stored as ushort * 100	}	else if(m_iOperatingMode == MAP_ANDREAS_MODE_MINIMAL)	{		iGridX /= 3;		iGridY /= 3;		iDataPos = (iGridY * 2000) + iGridX; // The minimal version is on a 2000x2000 grid.		return (float)m_pPointData[iDataPos] / 100.0f; // the data is a float stored as ushort * 100	}	else if(m_iOperatingMode == MAP_ANDREAS_MODE_NOCACHE)	{		iDataPos = ((iGridY * 6000) + iGridX) * 2;		unsigned short PointData;		fseek(fileInput,iDataPos,SEEK_SET);		fread(&PointData,1,sizeof(unsigned short),fileInput);		return (float)PointData / 100.0f;	}               	else if(m_iOperatingMode == MAP_ANDREAS_MODE_MINCACHE)	{		iGridX /= 3;		iGridY /= 3;		iDataPos = ((iGridY * 2000) + iGridX) * 2;		unsigned short PointData;		fseek(fileInput,iDataPos,SEEK_SET);		fread(&PointData,1,sizeof(unsigned short),fileInput);		return (float)PointData / 100.0f;	}               	return 0.0f;}//----------------------------------------------------------