//----------------------------------------------------------
|
|
//
|
|
// GRAND LARCENY common functions include.
|
|
//
|
|
//----------------------------------------------------------
|
|
|
|
stock LoadStaticVehiclesFromFile(const filename[])
|
|
{
|
|
new File:file_ptr;
|
|
new line[256];
|
|
new var_from_line[64];
|
|
new vehicletype;
|
|
new Float:SpawnX;
|
|
new Float:SpawnY;
|
|
new Float:SpawnZ;
|
|
new Float:SpawnRot;
|
|
new Color1, Color2;
|
|
new index;
|
|
new vehicles_loaded;
|
|
|
|
file_ptr = fopen(filename,filemode:io_read);
|
|
if(!file_ptr) return 0;
|
|
|
|
vehicles_loaded = 0;
|
|
|
|
while(fread(file_ptr,line,256) > 0)
|
|
{
|
|
index = 0;
|
|
|
|
// Read type
|
|
index = token_by_delim(line,var_from_line,',',index);
|
|
if(index == (-1)) continue;
|
|
vehicletype = strval(var_from_line);
|
|
if(vehicletype < 400 || vehicletype > 611) continue;
|
|
|
|
// Read X, Y, Z, Rotation
|
|
index = token_by_delim(line,var_from_line,',',index+1);
|
|
if(index == (-1)) continue;
|
|
SpawnX = floatstr(var_from_line);
|
|
|
|
index = token_by_delim(line,var_from_line,',',index+1);
|
|
if(index == (-1)) continue;
|
|
SpawnY = floatstr(var_from_line);
|
|
|
|
index = token_by_delim(line,var_from_line,',',index+1);
|
|
if(index == (-1)) continue;
|
|
SpawnZ = floatstr(var_from_line);
|
|
|
|
index = token_by_delim(line,var_from_line,',',index+1);
|
|
if(index == (-1)) continue;
|
|
SpawnRot = floatstr(var_from_line);
|
|
|
|
// Read Color1, Color2
|
|
index = token_by_delim(line,var_from_line,',',index+1);
|
|
if(index == (-1)) continue;
|
|
Color1 = strval(var_from_line);
|
|
|
|
index = token_by_delim(line,var_from_line,';',index+1);
|
|
Color2 = strval(var_from_line);
|
|
|
|
//printf("%d,%.2f,%.2f,%.2f,%.4f,%d,%d",vehicletype,SpawnX,SpawnY,SpawnZ,SpawnRot,Color1,Color2);
|
|
|
|
AddStaticVehicleEx(vehicletype,SpawnX,SpawnY,SpawnZ,SpawnRot,Color1,Color2,(30*60)); // respawn 30 minutes
|
|
|
|
/*new numplate_test[32+1];
|
|
format(numplate_test,32,"GRLC{44AA33}%d",vid);
|
|
SetVehicleNumberPlate(vid, numplate_test);*/
|
|
|
|
vehicles_loaded++;
|
|
}
|
|
|
|
fclose(file_ptr);
|
|
printf("Loaded %d vehicles from: %s",vehicles_loaded,filename);
|
|
return vehicles_loaded;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
|
|
stock strtok(const string[], &index)
|
|
{
|
|
new length = strlen(string);
|
|
while ((index < length) && (string[index] <= ' '))
|
|
{
|
|
index++;
|
|
}
|
|
|
|
new offset = index;
|
|
new result[20];
|
|
while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
|
|
{
|
|
result[index - offset] = string[index];
|
|
index++;
|
|
}
|
|
result[index - offset] = EOS;
|
|
return result;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
|
|
stock strrest(const string[], &index)
|
|
{
|
|
new length = strlen(string);
|
|
while ((index < length) && (string[index] <= ' '))
|
|
{
|
|
index++;
|
|
}
|
|
new offset = index;
|
|
new result[128];
|
|
while ((index < length) && ((index - offset) < (sizeof(result) - 1)))
|
|
{
|
|
result[index - offset] = string[index];
|
|
index++;
|
|
}
|
|
result[index - offset] = EOS;
|
|
return result;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
// Tokenise by a delimiter
|
|
// Return string and index of the end determined by the
|
|
// provided delimiter in delim
|
|
|
|
stock token_by_delim(const string[], return_str[], delim, start_index)
|
|
{
|
|
new x=0;
|
|
while(string[start_index] != EOS && string[start_index] != delim) {
|
|
return_str[x] = string[start_index];
|
|
x++;
|
|
start_index++;
|
|
}
|
|
return_str[x] = EOS;
|
|
if(string[start_index] == EOS) start_index = (-1);
|
|
return start_index;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
|
|
stock isNumeric(const string[])
|
|
{
|
|
new length=strlen(string);
|
|
if (length==0) return false;
|
|
for (new i = 0; i < length; i++)
|
|
{
|
|
if (
|
|
(string[i] > '9' || string[i] < '0' && string[i]!='-' && string[i]!='+') // Not a number,'+' or '-'
|
|
|| (string[i]=='-' && i!=0) // A '-' but not at first.
|
|
|| (string[i]=='+' && i!=0) // A '+' but not at first.
|
|
) return false;
|
|
}
|
|
if (length==1 && (string[0]=='-' || string[0]=='+')) return false;
|
|
return true;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
|
|
stock IsKeyJustDown(key, newkeys, oldkeys)
|
|
{
|
|
if((newkeys & key) && !(oldkeys & key)) return 1;
|
|
return 0;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
|
|
stock PlaySoundForAll(soundid, Float:x, Float:y, Float:z)
|
|
{
|
|
for(new i=0; i<MAX_PLAYERS; i++)
|
|
{
|
|
if(IsPlayerConnected(i))
|
|
{
|
|
PlayerPlaySound(i, soundid, x, y, z);
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
|
|
stock PlaySoundForPlayersInRange(soundid, Float:range, Float:x, Float:y, Float:z)
|
|
{
|
|
for(new i=0; i<MAX_PLAYERS; i++)
|
|
{
|
|
if(IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i,range,x,y,z))
|
|
{
|
|
PlayerPlaySound(i, soundid, x, y, z);
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
|
|
#define RETURN_USER_FAILURE -1
|
|
#define RETURN_USER_MULTIPLE -2
|
|
|
|
stock ReturnUser(text[])
|
|
{
|
|
new pos = 0;
|
|
new userid = RETURN_USER_FAILURE;
|
|
|
|
while(text[pos] < 0x21) { // Strip out leading spaces
|
|
if(text[pos] == 0) return RETURN_USER_FAILURE; // No passed text
|
|
pos++;
|
|
}
|
|
|
|
if(isNumeric(text[pos])) { // Check whole passed string
|
|
userid = strval(text[pos]);
|
|
if(userid >=0 && userid < MAX_PLAYERS)
|
|
{
|
|
if(IsPlayerConnected(userid)) return userid;
|
|
return RETURN_USER_FAILURE;
|
|
}
|
|
}
|
|
|
|
// They entered [part of] a name or the id search failed (check names just incase)
|
|
new len = strlen(text[pos]);
|
|
new count = 0;
|
|
new name[MAX_PLAYER_NAME+1];
|
|
|
|
for(new i = 0; i < MAX_PLAYERS; i++)
|
|
{
|
|
if(IsPlayerConnected(i))
|
|
{
|
|
GetPlayerName(i, name, sizeof(name));
|
|
if(strcmp(name, text[pos], true, len) == 0) // Check segment of name
|
|
{
|
|
if(len == strlen(name)) { // Exact match
|
|
return i;
|
|
}
|
|
else { // Partial match
|
|
count++;
|
|
userid = i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!count) return RETURN_USER_FAILURE;
|
|
if(count > 1) return RETURN_USER_MULTIPLE;
|
|
|
|
return userid;
|
|
}
|
|
|
|
//----------------------------------------------------------
|