Skip to content

Instantly share code, notes, and snippets.

@Southclaws
Created November 20, 2014 11:58
Show Gist options
  • Save Southclaws/d892815fea6aa0f66c75 to your computer and use it in GitHub Desktop.
Save Southclaws/d892815fea6aa0f66c75 to your computer and use it in GitHub Desktop.
#define FILTERSCRIPT
#include <a_samp>
#include <sscanf2>
#include <md-sort>
stock Float:Distance2D(Float:x1, Float:y1, Float:x2, Float:y2)
return floatsqroot( ((x1-x2)*(x1-x2)) + ((y1-y2)*(y1-y2)) );
#define MAX_DATA (2117)
#define MAX_BLOCK (199)
#define MAX_BLOCK_SIZE (512)
enum e_data
{
e_data_func[32],
e_data_modl,
Float: e_data_posx,
Float: e_data_posy,
Float: e_data_posz,
e_data_rest[192]
}
new
data[MAX_DATA][e_data],
blockdata[MAX_BLOCK][MAX_BLOCK_SIZE][e_data],
blockvalid[MAX_BLOCK],
blocksize[MAX_BLOCK],
Float: blockpos[MAX_BLOCK][3];
public OnFilterScriptInit()
{
new
File:fi,
line[256],
idx,
block = 1;
blockvalid[0] = 1;
fi = fopen("mapsort/input.map", io_read);
while(fread(fi, line))
{
if(line[0] == 'C') // CreateObject
{
sscanf(line, "p<(>s[32]p<,>dfffp<)>s[192]{s[3]}",
data[idx][e_data_func],
data[idx][e_data_modl],
data[idx][e_data_posx],
data[idx][e_data_posy],
data[idx][e_data_posz],
data[idx][e_data_rest]);
}
if(line[0] == 'R') // RemoveBuilding
{
sscanf(line, "p<(>s[32]p<,>'playerid'dfffp<)>s[192]{s[3]}",
data[idx][e_data_func],
data[idx][e_data_modl],
data[idx][e_data_posx],
data[idx][e_data_posy],
data[idx][e_data_posz],
data[idx][e_data_rest]);
}
idx++;
}
fclose(fi);
printf("> loaded %d objects", idx + 1);
print("Sorting by Y");
SortDeepArray(data, e_data_posy);
print("Sorting by X");
SortDeepArray(data, e_data_posx);
print("Splitting into blockdata");
new
Float:ldistance,
Float:ndistance;
for(new i; i < idx; i++)
{
if(i == 0)
{
ldistance = Distance2D(data[i][e_data_posx], data[i][e_data_posy], data[i+1][e_data_posx], data[i+1][e_data_posy]);
ndistance = Distance2D(data[i][e_data_posx], data[i][e_data_posy], data[i+1][e_data_posx], data[i+1][e_data_posy]);
}
else if(i == idx - 1)
{
ldistance = Distance2D(data[i][e_data_posx], data[i][e_data_posy], data[i-1][e_data_posx], data[i-1][e_data_posy]);
ndistance = Distance2D(data[i][e_data_posx], data[i][e_data_posy], data[i-1][e_data_posx], data[i-1][e_data_posy]);
}
else
{
ldistance = Distance2D(data[i][e_data_posx], data[i][e_data_posy], data[i-1][e_data_posx], data[i-1][e_data_posy]);
ndistance = Distance2D(data[i][e_data_posx], data[i][e_data_posy], data[i+1][e_data_posx], data[i+1][e_data_posy]);
}
//printf("ldistance: %f - ndistance: %f", ldistance, ndistance);
if(ldistance > 200.0)
{
if(ndistance > 200.0)
{
print("Anomalous result");
strcat(blockdata[0][blocksize[0]][e_data_func], data[i][e_data_func], 32);
blockdata[0][blocksize[0]][e_data_modl] = data[i][e_data_modl];
blockdata[0][blocksize[0]][e_data_posx] = data[i][e_data_posx];
blockdata[0][blocksize[0]][e_data_posy] = data[i][e_data_posy];
blockdata[0][blocksize[0]][e_data_posz] = data[i][e_data_posz];
strcat(blockdata[0][blocksize[0]][e_data_rest], data[i][e_data_rest], 32);
blocksize[0]++;
continue;
}
printf("Creating new block %d", block);
block++;
blockvalid[block] = 1;
}
strcat(blockdata[block][blocksize[block]][e_data_func], data[i][e_data_func], 32);
blockdata[block][blocksize[block]][e_data_modl] = data[i][e_data_modl];
blockdata[block][blocksize[block]][e_data_posx] = data[i][e_data_posx];
blockdata[block][blocksize[block]][e_data_posy] = data[i][e_data_posy];
blockdata[block][blocksize[block]][e_data_posz] = data[i][e_data_posz];
strcat(blockdata[block][blocksize[block]][e_data_rest], data[i][e_data_rest], 32);
blocksize[block]++;
}
printf("Split into %d blockdata", block);
for(new i; i < block; i++)
GetBlockAveragePosition(i);
for(new i = 2; i < block - 1; i++)
{
if(!blockvalid[i])
continue;
ldistance = Distance2D(blockpos[i][0], blockpos[i][1], blockpos[i-1][0], blockpos[i-1][1]);
ndistance = Distance2D(blockpos[i][0], blockpos[i][1], blockpos[i+1][0], blockpos[i+1][1]);
printf("block %d : ldistance: %f ndistance: %f", i, ldistance, ndistance);
if(ldistance < 200.0)
{
printf("Merging block %d and lower %d", i, i-1);
MergeBlocks(i, i-1);
if(ndistance < 200.0)
{
printf("Merging block %d and next %d", i, i+1);
MergeBlocks(i, i+1);
}
}
}
for(new i; i < block; i++)
{
if(blockvalid[i])
SaveBlock(i);
}
return 1;
}
GetBlockAveragePosition(block)
{
for(new i; i < blocksize[block]; i++)
{
blockpos[block][0] += blockdata[block][i][e_data_posx];
blockpos[block][1] += blockdata[block][i][e_data_posy];
blockpos[block][2] += blockdata[block][i][e_data_posz];
}
blockpos[block][0] /= float(blocksize[block]);
blockpos[block][1] /= float(blocksize[block]);
blockpos[block][2] /= float(blocksize[block]);
printf("Block %d average position: %f, %f, %f", block, blockpos[block][0], blockpos[block][1], blockpos[block][2]);
}
MergeBlocks(target, source)
{
for(new i; i < blocksize[source]; i++)
{
strcat(blockdata[target][blocksize[target]][e_data_func], blockdata[source][i][e_data_func], 32);
blockdata[target][blocksize[target]][e_data_modl] = blockdata[source][i][e_data_modl];
blockdata[target][blocksize[target]][e_data_posx] = blockdata[source][i][e_data_posx];
blockdata[target][blocksize[target]][e_data_posy] = blockdata[source][i][e_data_posy];
blockdata[target][blocksize[target]][e_data_posz] = blockdata[source][i][e_data_posz];
strcat(blockdata[target][blocksize[target]][e_data_rest], blockdata[source][i][e_data_rest], 32);
blocksize[target]++;
}
blockvalid[source] = false;
}
SaveBlock(block)
{
new
File:file,
filename[64],
line[256];
format(filename, 64, "mapsort/mb%d_%f,%f,%f.map", block, blockpos[block][0], blockpos[block][1], blockpos[block][2]);
file = fopen(filename, io_write);
for(new i; i < blocksize[block]; i++)
{
if(blockdata[block][i][e_data_func][0] == EOS)
continue;
format(line, 256, "%s(%d, %f, %f, %f, %s);\r\n",
blockdata[block][i][e_data_func],
blockdata[block][i][e_data_modl],
blockdata[block][i][e_data_posx],
blockdata[block][i][e_data_posy],
blockdata[block][i][e_data_posz],
blockdata[block][i][e_data_rest]);
fwrite(file, line);
}
fclose(file);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment