#include #define FILTERSCRIPT #define PROP_VW (10000) #define MAX_INTERIORS (146) #define MAX_PROPERTIES (400) #define PROPERTY_FILENAME "properties/properties.txt" // Location of properties file #define PROPERTY_UNIQID_FILE "properties/uniqId.txt" // Location of Uniq Interior Info #define MAX_TYPES (5) #define TYPE_EMPTY (0) #define TYPE_HOUSE (1) #define TYPE_BUSINESS (2) #define TYPE_BANK (3) #define TYPE_COP (4) enum // Property Type Enum E_P_TYPES { tIcon, tName[32] } enum // Uniq Interiors Enum E_INTERIORS { inIntID, Float:inExitX, Float:inExitY, Float:inExitZ, Float:inExitA, inName[64] }; enum // Properties Enum E_PROPERTIES { eInterior, eType, Float:eEntX, Float:eEntY, Float:eEntZ, Float:eEntA, Float:eExitX, Float:eExitY, Float:eExitZ, Float:eExitA, eOwner, ePrice, ePname[64] }; new unid, interiorInfo[MAX_INTERIORS][E_INTERIORS], propPickups[MAX_PROPERTIES] = {-1}, properties[MAX_PROPERTIES][E_PROPERTIES], lastPickup[MAX_PLAYERS] = {-1}, currentInt[MAX_PLAYERS] = {-1}, Float:plPos[MAX_PLAYERS][3], plInt[MAX_PLAYERS]; new propIcons[MAX_TYPES][E_P_TYPES] = { { 0, "" }, // TYPE_EMPTY ( not used ) { 1273, "House" }, // TYPE_HOUSE green house icon { 1272, "Business" }, // TYPE_BUSINESS blue house icon { 1274, "Bank" }, // TYPE_BANK dollar sign icon { 1247, "Police Station" } // Unknown Bribe Star }; // Property Variable Functions ---------------------------------------- stock Float:GetPropertyEntrance( id, &Float:x, &Float:y, &Float:z ){ if( id > MAX_PROPERTIES ) return 0.0; x = properties[id][eEntX]; y = properties[id][eEntY]; z = properties[id][eEntZ]; return properties[id][eEntA]; } stock Float:GetPropertyExit( id, &Float:x, &Float:y, &Float:z ){ if( id > MAX_PROPERTIES ) return 0.0; x = properties[id][eExitX]; y = properties[id][eExitY]; z = properties[id][eExitZ]; return properties[id][eExitA]; } stock GetPropertyInteriorId( id ){ if( id > MAX_PROPERTIES ) return 0; else return properties[id][eInterior]; } stock GetPropertyType( id ){ if( id > MAX_PROPERTIES ) return 0; else return properties[id][eType]; } stock GetPropertyOwner( id ){ if( id > MAX_PROPERTIES ) return -1; else return properties[id][eOwner]; } stock GetPropertyPrice( id ){ if( id > MAX_PROPERTIES ) return -1; else return properties[id][ePrice]; } stock GetPropertyName( id ){ new tmp[64]; if( id > MAX_PROPERTIES ) return tmp; else { format( tmp, 64, "%s", properties[id][ePname] ); return tmp; } } //------------------------------------------------------------------- // Interior Variable Functions -------------------------------------- stock Float:GetInteriorExit( id, &Float:x, &Float:y, &Float:z ){ if( id > MAX_INTERIORS ) return 0.0; else { x = interiorInfo[id][inExitX]; y = interiorInfo[id][inExitY]; z = interiorInfo[id][inExitZ]; return interiorInfo[id][inExitA]; } } stock GetInteriorIntID( id ){ if( id > MAX_INTERIORS ) return -1; else return interiorInfo[id][inIntID]; } stock GetInteriorName( id ){ new tmp[64]; if( id > MAX_PROPERTIES ) return tmp; else { format( tmp, 64, "%s", interiorInfo[id][inName] ); return tmp; } } //-------------------------------------------------------------------- #if defined FILTERSCRIPT public OnFilterScriptInit() { print("\n--------------------------------------"); print("damospidermans property filterscript"); print("--------------------------------------\n"); unid = 0; for( new i = 0; i < MAX_PROPERTIES; i++ ){ properties[i][eType] = TYPE_EMPTY; } ReadInteriorInfo( "properties/interiors.txt" ); ReadPropertyFile( PROPERTY_FILENAME ); return 1; } public OnFilterScriptExit() { for( new i = 0; i < MAX_PROPERTIES; i++ ){ if( propPickups[i] != -1 ){ DestroyPickup( i ); propPickups[i] = -1; } } return 1; } #else main() { print("\n----------------------------------"); print(" Blank Gamemode by your name here"); print("----------------------------------\n"); } #endif public OnGameModeInit() { unid = 0; for( new i = 0; i < MAX_PROPERTIES; i++ ){ properties[i][eType] = TYPE_EMPTY; } ReadInteriorInfo( "properties/interiors.txt" ); ReadPropertyFile( PROPERTY_FILENAME ); return 1; } public OnGameModeExit() { for( new i = 0; i < MAX_PROPERTIES; i++ ){ if( propPickups[i] != -1 ){ DestroyPickup( i ); propPickups[i] = -1; } } return 1; } public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) { if( newinteriorid == 0 ){ currentInt[playerid] = -1; } return 1; } public OnPlayerSpawn( playerid ) { PutPlayerInProperty( playerid, 2 ); return 1; } public OnPlayerPickUpPickup(playerid, pickupid) { printf( "DEBUG: Player %d pickedup Pickup %d Prop Id %d", playerid, pickupid ); lastPickup[playerid] = pickupid; new id = propPickups[pickupid]; if( properties[id][eType] > 0 ){ switch( properties[id][eType] ){ case TYPE_HOUSE:{ // Insert House Crap Here SendClientMessage( playerid, 0x550099FF, "House Property.. type /enter to enter" ); return 1; } case TYPE_BUSINESS:{ // Insert Business Crap Here SendClientMessage( playerid, 0x550099FF, "Business Property.. type /enter to enter" ); return 1; } case TYPE_BANK:{ // Insert Bank Crap Here SendClientMessage( playerid, 0x550099FF, "Bank.. type /enter to enter" ); return 1; } case TYPE_COP:{ // Insert Cop Crap Here SendClientMessage( playerid, 0x550099FF, "Police Station.. type /enter to enter" ); return 1; } } } else SendClientMessage( playerid, 0xFF9900FF, "This property doesn't exist :S" ); return 1; } public OnPlayerCommandText(playerid, cmdtext[]) { new idx; new cmd[256]; cmd = strtok(cmdtext, idx); if (strcmp("/chouse", cmd, true) == 0) { PropertyCommand( playerid, cmd, cmdtext,idx, TYPE_HOUSE ); return 1; } else if (strcmp("/cbus", cmd, true) == 0) { PropertyCommand( playerid, cmd, cmdtext,idx, TYPE_BUSINESS ); return 1; } else if (strcmp("/ccop", cmd, true) == 0) { PropertyCommand( playerid, cmd, cmdtext,idx, TYPE_COP ); return 1; } else if (strcmp("/cbank", cmd, true) == 0) { PropertyCommand( playerid, cmd, cmdtext,idx, TYPE_BANK ); return 1; } else if(strcmp( "/view", cmd, true ) == 0) //Basically lets you view an interior from the interiors.txt file by id { new tmp[256], string[128], uniqId, Float:x, Float:y, Float:z, Float:a; tmp = strtok( cmdtext, idx ); if(!strlen(tmp)){ format( string, 128, "Usage: %s [uniqInteriorId]", cmd ); SendClientMessage( playerid, 0xFF00CC, string ); return 1; } if(!isNumeric(tmp)){ SendClientMessage(playerid, 0x550000, "Uniq Interior Id must be a number" ); return 1; } uniqId = strval( tmp ); if( uniqId > MAX_INTERIORS || uniqId < 0 ){ SendClientMessage( playerid, 0xFFFFCC, "Invalid Uniq Interior Id" ); return 1; } if( GetPlayerInterior( playerid ) == 0 ){ GetPlayerPos( playerid, plPos[playerid][0], plPos[playerid][1], plPos[playerid][2] ); plInt[playerid] = GetPlayerInterior( playerid ); } a = GetInteriorExit( uniqId, x, y, z ); SetPlayerInterior( playerid, GetInteriorIntID( uniqId ) ); SetPlayerPos( playerid, x, y, z ); SetPlayerFacingAngle( playerid, a ); format( string, 128, "UniqId: %d InteriorId: %d Name: %s | Use /return to go to last position", uniqId,GetInteriorIntID( uniqId ), GetInteriorName( uniqId )); SendClientMessage( playerid, 0x556600FF, string ); return 1; } else if( strcmp( "/return", cmd, true ) == 0 ) { SetPlayerPos( playerid, plPos[playerid][0], plPos[playerid][1], plPos[playerid][2] ); SetPlayerInterior( playerid, plInt[playerid] ); return 1; } else if (strcmp("/enter", cmd, true) == 0) { if( lastPickup[playerid] != -1 || properties[lastPickup[playerid]][eType] > 0 ){ new id = propPickups[lastPickup[playerid]], Float:x, Float:y, Float:z; GetPropertyEntrance( id, x, y, z ); if( IsPlayerInRangeOfPoint( playerid, 3.0, x, y, z )){ PutPlayerInProperty( playerid, id ); SendClientMessage( playerid, 0x005599FF, "You have entered a property.. type /exit to leave" ); return 1; } } return 1; } else if (strcmp("/exit", cmd, true) == 0) { if( currentInt[playerid] > -1 && GetPlayerInterior(playerid) == GetPropertyInteriorId( currentInt[playerid] )){ new id = currentInt[playerid], Float:x, Float:y, Float:z, Float:a; a = GetPropertyEntrance( id, x, y, z ); SetPlayerPos( playerid, x, y, z ); SetPlayerFacingAngle( playerid, a ); SetPlayerInterior( playerid, 0 ); SetPlayerVirtualWorld( playerid, 0 ); } currentInt[playerid] = -1; return 1; } return 0; } /** ---------------------------------------------------------------------------- * Property System Functions *--------------------------------------------------------------------------- */ ReadInteriorInfo( fileName[] ){ new File:file_ptr, buf[256], tmp[64], idx, uniqId; file_ptr = fopen( fileName, io_read ); if( file_ptr ){ while( fread( file_ptr, buf, 256 ) > 0){ idx = 0; idx = token_by_delim( buf, tmp, ' ', idx ); if(idx == (-1)) continue; uniqId = strval( tmp ); if( uniqId >= MAX_INTERIORS ) return 0; idx = token_by_delim( buf, tmp, ' ', idx+1 ); if(idx == (-1)) continue; interiorInfo[uniqId][inIntID] = strval( tmp ); idx = token_by_delim( buf, tmp, ' ', idx+1 ); if(idx == (-1)) continue; interiorInfo[uniqId][inExitX] = floatstr( tmp ); idx = token_by_delim( buf, tmp, ' ', idx+1 ); if(idx == (-1)) continue; interiorInfo[uniqId][inExitY] = floatstr( tmp ); idx = token_by_delim( buf, tmp, ' ', idx+1); if(idx == (-1)) continue; interiorInfo[uniqId][inExitZ] = floatstr( tmp ); idx = token_by_delim( buf, tmp, ' ', idx+1 ); if(idx == (-1)) continue; interiorInfo[uniqId][inExitA] = floatstr( tmp ); idx = token_by_delim( buf, interiorInfo[uniqId][inName], ';', idx+1 ); if(idx == (-1)) continue; printf( "Added Prop - %d, %d, %f, %f, %f, %f ( %s )", uniqId, interiorInfo[uniqId][inIntID], interiorInfo[uniqId][inExitX], interiorInfo[uniqId][inExitY], interiorInfo[uniqId][inExitZ], interiorInfo[uniqId][inExitA], interiorInfo[uniqId][inName] ); } printf( "Interiors File read successfully" ); fclose( file_ptr ); return 1; } printf( "Could Not Read Interiors file ( %s )", fileName ); return 0; } // Gets interior exit info from uniq Interior Id. Returns InteriorId or -1 if interior doesn't exist GetInteriorExitInfo( uniqIntId, &Float:exitX, &Float:exitY, &Float:exitZ, &Float:exitA ){ if( uniqIntId < MAX_INTERIORS ){ exitX = interiorInfo[uniqIntId][inExitX]; exitY = interiorInfo[uniqIntId][inExitY]; exitZ = interiorInfo[uniqIntId][inExitZ]; exitA = interiorInfo[uniqIntId][inExitA]; return interiorInfo[uniqIntId][inIntID]; } return -1; } PutPlayerInProperty( playerid, propId, propVW = 0 ){ new Float:x, Float:y, Float:z, Float:a; a = GetPropertyExit( propId, x, y, z ); SetPlayerPos( playerid, x, y, z ); SetPlayerFacingAngle( playerid, a ); SetPlayerInterior( playerid, GetPropertyInteriorId( propId )); SetPlayerVirtualWorld( playerid, (propVW==0)? propId+PROP_VW:propVW ); currentInt[playerid] = propId; } CreateProperty( iconId, Float:entX, Float:entY, Float:entZ, Float:entA, interior, Float:exitX, Float:exitY, Float:exitZ, Float:exitA, p_type ){ new Id = CreatePickup( iconId ,23, entX, entY, entZ ); propPickups[Id] = unid; properties[unid][eInterior] = interior; properties[unid][eEntX] = entX; properties[unid][eEntY] = entY; properties[unid][eEntZ] = entZ; properties[unid][eEntA] = entA; properties[unid][eExitX] = exitX; properties[unid][eExitY] = exitY; properties[unid][eExitZ] = exitZ; properties[unid][eExitA] = exitA; properties[unid][eOwner] = -1; properties[unid][eType] = p_type; return unid++; } ReadPropertyFile( fileName[] ){ new File:file_ptr, tmp[128], buf[256], idx, Float:enX, Float:enY, Float:enZ, Float:enA, Float:exX, Float:exY, Float:exZ, Float:exA, interior, p_type, pIcon; print("Reading Files" ); file_ptr = fopen( fileName, io_read ); if(!file_ptr )return 0; while( fread( file_ptr, buf, 256 ) > 0){ idx = 0; idx = token_by_delim( buf, tmp, ',', idx ); if(idx == (-1)) continue; pIcon = strval( tmp ); idx = token_by_delim( buf, tmp, ',', idx+1 ); if(idx == (-1)) continue; enX = floatstr( tmp ); idx = token_by_delim( buf, tmp, ',', idx+1 ); if(idx == (-1)) continue; enY = floatstr( tmp ); idx = token_by_delim( buf, tmp, ',', idx+1 ); if(idx == (-1)) continue; enZ = floatstr( tmp ); idx = token_by_delim( buf, tmp, ',', idx+1 ); if(idx == (-1)) continue; enA = floatstr( tmp ); idx = token_by_delim( buf, tmp, ',', idx+1 ); if(idx == (-1)) continue; interior = strval( tmp ); idx = token_by_delim( buf, tmp, ',', idx+1 ); if(idx == (-1)) continue; exX = floatstr( tmp ); idx = token_by_delim( buf, tmp, ',', idx+1 ); if(idx == (-1)) continue; exY = floatstr( tmp ); idx = token_by_delim( buf, tmp, ',', idx+1 ); if(idx == (-1)) continue; exZ = floatstr( tmp ); idx = token_by_delim( buf, tmp, ',', idx+1 ); if(idx == (-1)) continue; exA = floatstr( tmp ); idx = token_by_delim( buf, tmp, ';', idx+1 ); if(idx == (-1)) continue; p_type = strval( tmp ); printf( "Creating Prop - %d, %f, %f, %f, %f, %d, %f, %f, %f, %f, %d", pIcon, enX, enY, enZ, enA, interior, exX, exY, exZ, exA, p_type ); CreateProperty( pIcon, enX, enY, enZ, enA, interior, exX, exY, exZ, exA, p_type ); } fclose( file_ptr ); return 1; } // Adds new property to property file AddProperty( uniqIntId, Float:entX, Float:entY, Float:entZ, Float:entA, p_type, fileName[] ){ new Float:exitX, Float:exitY, Float:exitZ, Float:exitA, interiorId, File:file_ptr, tmp[128]; interiorId = GetInteriorExitInfo( uniqIntId, exitX, exitY, exitZ, exitA ); if( interiorId != -1 ){ file_ptr = fopen( fileName, io_append ); if(file_ptr){ format( tmp, 128, "%d, %f, %f, %f, %f, %d, %f, %f, %f, %f, %d ;\r\n", propIcons[p_type][tIcon],entX, entY, entZ, entA, interiorId, exitX, exitY, exitZ, exitA, p_type ); fwrite( file_ptr, tmp ); fclose( file_ptr ); printf( "PropDB - %s", tmp ); return CreateProperty( propIcons[p_type][tIcon], entX, entY, entZ, entA, interiorId, exitX, exitY, exitZ, exitA, p_type ); } } return -1; } PropertyCommand( playerid, cmd[],cmdtext[],idx, p_type ){ if( GetPlayerInterior(playerid) != 0 || GetPlayerVirtualWorld(playerid)!= 0 ){ SendClientMessage(playerid, 0x550000FF, "You can only create properties in Interior 0 and VW 0" ); return 1; } new Float:x, Float:y, Float:z, Float:a, tmp[256], string[128], uniqId, id; GetPlayerPos( playerid, x, y, z ); GetPlayerFacingAngle( playerid, a ); tmp = strtok( cmdtext, idx ); if(!strlen(tmp)){ format( string, 128, "Usage: %s [uniqInteriorId]", cmd ); SendClientMessage( playerid, 0xFF00CC, string ); return 1; } if(!isNumeric(tmp)){ SendClientMessage(playerid, 0x550000, "Uniq Interior Id must be a number" ); return 1; } uniqId = strval( tmp ); if( uniqId > MAX_INTERIORS || uniqId < 0 ){ SendClientMessage( playerid, 0xFFFFCC, "Invalid Uniq Interior Id" ); return 1; } id = AddProperty( uniqId, x, y, z, a, p_type, PROPERTY_FILENAME ); if( id != -1 ){ format( tmp, 256, "Property Type ( %d ) Added Successfully: UniqId: %d Interior: %d IntName: %s",p_type, id, interiorInfo[uniqId][inIntID], interiorInfo[uniqId][inName] ); SendClientMessage( playerid, 0xCC7700, tmp ); }else{ SendClientMessage( playerid, 0x00FF55, "Error: Something went wrong" ); } return 1; } /** *------------------------------------------------------------------------------- *------------------------------------------------------------------------------- */ 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; } // Tokenise by a delimiter // Return string and index of the end determined by the // provided delimiter in delim 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; } 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; }