rendered paste body#include <a_samp>
#include <dutils>
#define COLOR_WHITE 0xFFFFFFAA
#define COLOR_GREEN 0x33AA33AA
#define COLOR_RED 0xAA3333AA
#define MAX_OBJECTS 250
#define FILE_OBJECT "objects.txt"
#define FILE_INPUT "inputobjects.txt"
new bool:started;
enum objectinfo{
objmodelid,
Float:objx,
Float:objy,
Float:objz,
Float:objrx,
Float:objry,
Float:objrz,
objid,
bool:created,
objdistance,
bool:air
}
new objectp[MAX_PLAYERS][objectinfo];
new totalobjs;
enum cobjectinfo{
cobjmodelid,
Float:cobjx,
Float:cobjy,
Float:cobjz,
Float:cobjrx,
Float:cobjry,
Float:cobjrz
}
new objectc[MAX_OBJECTS][cobjectinfo];
public OnFilterScriptInit(){
print("---------------------------");
print(" Sackys Map Editor v0.1 :) ");
print("---------------------------");
if(fexist(FILE_OBJECT))fcreate(FILE_OBJECT);
if(fexist(FILE_INPUT)){
new File:fhandle = fopen(FILE_INPUT,io_read);
new temp[MAX_STRING];
new create[256];
while(fread(fhandle,temp,sizeof(temp))){
new createmodelid,Float:createx,Float:createy,Float:createz,Float:createrx,Float:createry,Float:createrz;
create = strrest(temp,0);
new tmp[16];
strmid(tmp,create,0,13);
if(equal(tmp,"CreateObject(",true)){
new tmp2[256];
new idx;
tmp2 = strtok(create,idx,',');
strdel(tmp2,0,13);
createmodelid = strval(tmp2);
tmp2 = strtok(create,idx,',');
createx = floatstr(tmp2);
tmp2 = strtok(create,idx,',');
createy = floatstr(tmp2);
tmp2 = strtok(create,idx,',');
createz = floatstr(tmp2);
tmp2 = strtok(create,idx,',');
createrx = floatstr(tmp2);
tmp2 = strtok(create,idx,',');
createry = floatstr(tmp2);
tmp2 = strtok(create,idx,',');
createrz = floatstr(tmp2);
CreateObject(createmodelid,createx,createy,createz,createrx,createry,createrz);
objectc[totalobjs][cobjmodelid] = createmodelid;
objectc[totalobjs][cobjx] = createx;
objectc[totalobjs][cobjy] = createy;
objectc[totalobjs][cobjz] = createz;
objectc[totalobjs][cobjrx] = createrx;
objectc[totalobjs][cobjry] = createry;
objectc[totalobjs][cobjrz] = createrz;
totalobjs++;
}
}
}
}
public OnPlayerConnect(playerid){
if(started == false){
SetTimer("SMETime",250,1);
}
SendClientMessage(playerid,COLOR_WHITE,"Welcome to Sackys Map Editor 0.1, to get started type /ohelp");
}
public OnPlayerDisconnect(playerid){
if(objectp[playerid][created] == true){
DestroyPlayerObject(playerid);
}
objectp[playerid][air] = false;
}
#define dcmd(%1,%2,%3) if ((strcmp(%3, "/%1", true, %2+1) == 0)&&(((%3[%2+1]==0)&&(dcmd_%1(playerid,"")))||((%3[%2+1]==32)&&(dcmd_%1(playerid,%3[%2+2]))))) return 1
new tmpit[256];
new stringit[256];
public OnPlayerCommandText(playerid,cmdtext[]){
dcmd(object,6,cmdtext);
dcmd(cut,3,cmdtext);
dcmd(dis,3,cmdtext);
dcmd(set,3,cmdtext);
dcmd(reset,5,cmdtext);
dcmd(unset,5,cmdtext);
dcmd(air,3,cmdtext);
dcmd(up,2,cmdtext);
dcmd(dn,2,cmdtext);
dcmd(rot,3,cmdtext);
dcmd(roll,4,cmdtext);
dcmd(pitch,5,cmdtext);
dcmd(yaw,3,cmdtext);
dcmd(current,7,cmdtext);
dcmd(query,5,cmdtext);
dcmd(gotoobj,7,cmdtext);
dcmd(ohelp,5,cmdtext);
}
dcmd_object(playerid,params[]){
if(objectp[playerid][created] == true){
SendClientMessage(playerid,COLOR_RED,"You have already Created an object");
return 1;
}
new idx;
tmpit = strtok(params,idx);
if(!strlen(tmpit)){
SendClientMessage(playerid,COLOR_WHITE,"USAGE: /object [modelid] [distance]");
return 1;
}
new createid = strval(tmpit);
tmpit = strtok(params,idx);
if(!strlen(tmpit)){
SendClientMessage(playerid,COLOR_WHITE,"USAGE: /object [modelid] [distance]");
return 1;
}
new distance = strval(tmpit);
new Float:x,Float:y,Float:z,Float:x2,Float:y2,Float:a,Float:ang;
GetPlayerPos(playerid,x,y,z);
GetXYInFrontOfPlayer(playerid,x2,y2,distance);
GetPlayerFacingAngle(playerid,a);
if(a > 180){
ang = floatsub(a,180.0);
}
else{
ang = floatadd(a,180.0);
}
new id = CreatePlayerObject(playerid,createid,x2,y2,z,0.0,0.0,ang,distance);
format(stringit,sizeof(stringit),"You just Created an object with the modelid %d, distance %dm and objectid %d",createid,distance,id);
SendClientMessage(playerid,COLOR_GREEN,stringit);
return true;
}
dcmd_cut(playerid,params[]){
if(objectp[playerid][created] == false){
SendClientMessage(playerid,COLOR_RED,"You have not Created an object");
return 1;
}
DestroyPlayerObject(playerid);
SendClientMessage(playerid,COLOR_GREEN,"You Destroyed your object");
#pragma unused params
return true;
}
dcmd_dis(playerid,params[]){
if(objectp[playerid][created] == false){
SendClientMessage(playerid,COLOR_RED,"You have not Created an object");
return 1;
}
new idx;
tmpit = strtok(params,idx);
if(!strlen(tmpit)){
SendClientMessage(playerid,COLOR_WHITE,"USAGE: /dis [distance]");
return 1;
}
objectp[playerid][objdistance] = strval(tmpit);
format(stringit,sizeof(stringit),"You set your object distance to %d",objectp[playerid][objdistance]);
SendClientMessage(playerid,COLOR_GREEN,stringit);
return true;
}
dcmd_set(playerid,params[]){
if(objectp[playerid][created] == false){
SendClientMessage(playerid,COLOR_RED,"You have not Created an object");
return 1;
}
new idx;
tmpit = strrest(params,idx);
if(!strlen(tmpit)){
format(stringit,sizeof(stringit),"You Set your object (ID: %d)",objectp[playerid][objid]);
}
else{
format(stringit,sizeof(stringit),"You Set your object (ID: %d) Comment: %s",objectp[playerid][objid],tmpit);
}
SendClientMessage(playerid,COLOR_GREEN,stringit);
AddObjectLog(playerid,tmpit);
objectp[playerid][created] = false;
objectc[objectp[playerid][objid]][cobjmodelid] = objectp[playerid][objmodelid];
objectc[objectp[playerid][objid]][cobjx] = objectp[playerid][objx];
objectc[objectp[playerid][objid]][cobjy] = objectp[playerid][objy];
objectc[objectp[playerid][objid]][cobjz] = objectp[playerid][objz];
objectc[objectp[playerid][objid]][cobjrx] = objectp[playerid][objrx];
objectc[objectp[playerid][objid]][cobjry] = objectp[playerid][objry];
objectc[objectp[playerid][objid]][cobjrz] = objectp[playerid][objrz];
return true;
}
dcmd_reset(playerid,params[]){
if(objectp[playerid][created] == true){
SendClientMessage(playerid,COLOR_RED,"You already have an active object");
return 1;
}
new idx;
tmpit = strtok(params,idx);
if(!strlen(tmpit)){
SendClientMessage(playerid,COLOR_WHITE,"USAGE: /reset [objectid]");
return 1;
}
new cid = strval(tmpit);
DestroyObject(cid);
new Float:x,Float:y,Float:z,Float:x2,Float:y2,Float:a,Float:ang;
GetPlayerPos(playerid,x,y,z);
GetXYInFrontOfPlayer(playerid,x2,y2,5);
GetPlayerFacingAngle(playerid,a);
if(a > 180){
ang = floatsub(a,180.0);
}
else{
ang = floatadd(a,180.0);
}
new id = CreatePlayerObject(playerid,objectc[cid][cobjmodelid],x2,y2,z,objectc[cid][cobjrx],objectc[cid][cobjry],ang,5);
format(stringit,sizeof(stringit),"You just Reset an object with the modelid %d, distance %dm and objectid %d",objectc[cid][cobjmodelid],5,id);
SendClientMessage(playerid,COLOR_GREEN,stringit);
return true;
}
dcmd_unset(playerid,params[]){
if(objectp[playerid][created] == true){
SendClientMessage(playerid,COLOR_RED,"You already have an active object");
return 1;
}
new idx;
tmpit = strtok(params,idx);
if(!strlen(tmpit)){
SendClientMessage(playerid,COLOR_WHITE,"USAGE: /unset [objectid]");
return 1;
}
new cid = strval(tmpit);
DestroyObject(cid);
format(stringit,sizeof(stringit),"You destroyed object %d",cid);
SendClientMessage(playerid,COLOR_GREEN,stringit);
return true;
}
dcmd_air(playerid,params[]){
new idx;
tmpit = strtok(params,idx);
if(equal(tmpit,"on",true)){
if(objectp[playerid][air] == true){
SendClientMessage(playerid,COLOR_RED,"You have alrady activated air");
return 1;
}
objectp[playerid][air] = true;
new Float:x,Float:y,Float:z;
GetPlayerPos(playerid,x,y,z);
SetPlayerPos(playerid,x,y,z+5);
TogglePlayerControllable(playerid,false);
SendClientMessage(playerid,COLOR_GREEN,"Air Mode On");
return 1;
}
if(equal(tmpit,"off",true)){
if(objectp[playerid][air] == false){
SendClientMessage(playerid,COLOR_RED,"You don't have air on at the moment");
return 1;
}
objectp[playerid][air] = false;
TogglePlayerControllable(playerid,true);
SendClientMessage(playerid,COLOR_GREEN,"Air Mode Off");
return 1;
}
SendClientMessage(playerid,COLOR_WHITE,"USAGE: /air [on/off]");
return true;
}
dcmd_up(playerid,params[]){
new idx;
tmpit = strtok(params,idx);
new Float:x,Float:y,Float:z;
GetPlayerPos(playerid,x,y,z);
if(!strlen(tmpit)){
SetPlayerPos(playerid,x,y,z+5);
return 1;
}
if(objectp[playerid][air] == true){
TogglePlayerControllable(playerid,true);
SetPlayerPos(playerid,x,y,z+strval(tmpit));
TogglePlayerControllable(playerid,false);
return 1;
}
SetPlayerPos(playerid,x,y,z+strval(tmpit));
return true;
}
dcmd_dn(playerid,params[]){
new idx;
tmpit = strtok(params,idx);
new Float:x,Float:y,Float:z;
GetPlayerPos(playerid,x,y,z);
if(!strlen(tmpit)){
SetPlayerPos(playerid,x,y,z-5);
return 1;
}
if(objectp[playerid][air] == true){
TogglePlayerControllable(playerid,true);
SetPlayerPos(playerid,x,y,z-strval(tmpit));
TogglePlayerControllable(playerid,false);
return 1;
}
SetPlayerPos(playerid,x,y,z-strval(tmpit));
return true;
}
dcmd_rot(playerid,params[]){
new idx;
tmpit = strtok(params,idx);
if(!strlen(tmpit)){
SendClientMessage(playerid,COLOR_WHITE,"USAGE: /rot [angle]");
return 1;
}
new ang = strval(tmpit);
if(ang < 0 || ang > 360){
SendClientMessage(playerid,COLOR_RED,"Invalid Angle (needs to be between 0 and 360)");
return 1;
}
SetPlayerFacingAngle(playerid,float(ang));
return true;
}
dcmd_roll(playerid,params[]){
if(objectp[playerid][created] == false){
SendClientMessage(playerid,COLOR_RED,"You don't have an active object");
return 1;
}
new idx;
tmpit = strtok(params,idx);
if(!strlen(tmpit)){
SendClientMessage(playerid,COLOR_WHITE,"USAGE: /roll [0-360]");
return 1;
}
new roll = strval(tmpit);
if(roll < 0 || roll > 360){
SendClientMessage(playerid,COLOR_RED,"Invalid Angle (needs to be between 0 and 360)");
return 1;
}
objectp[playerid][objrx] = float(roll);
SetObjectRotation(objectp[playerid][objid],objectp[playerid][objrx],objectp[playerid][objry],objectp[playerid][objrz]);
format(stringit,sizeof(stringit),"You set your objects Roll to %d",roll);
SendClientMessage(playerid,COLOR_GREEN,stringit);
return true;
}
dcmd_pitch(playerid,params[]){
if(objectp[playerid][created] == false){
SendClientMessage(playerid,COLOR_RED,"You don't have an active object");
return 1;
}
new idx;
tmpit = strtok(params,idx);
if(!strlen(tmpit)){
SendClientMessage(playerid,COLOR_WHITE,"USAGE: /pitch [0-360]");
return 1;
}
new pitch = strval(tmpit);
if(pitch < 0 || pitch > 360){
SendClientMessage(playerid,COLOR_RED,"Invalid Angle (needs to be between 0 and 360)");
return 1;
}
objectp[playerid][objry] = float(pitch);
SetObjectRotation(objectp[playerid][objid],objectp[playerid][objrx],objectp[playerid][objry],objectp[playerid][objrz]);
format(stringit,sizeof(stringit),"You set your objects Pitch to %d",pitch);
SendClientMessage(playerid,COLOR_GREEN,stringit);
return true;
}
dcmd_yaw(playerid,params[]){
if(objectp[playerid][created] == false){
SendClientMessage(playerid,COLOR_RED,"You don't have an active object");
return 1;
}
new idx;
tmpit = strtok(params,idx);
if(!strlen(tmpit)){
SendClientMessage(playerid,COLOR_WHITE,"USAGE: /roll [0-360]");
return 1;
}
new yaw = strval(tmpit);
if(yaw < 0 || yaw > 360){
SendClientMessage(playerid,COLOR_RED,"Invalid Angle (needs to be between 0 and 360)");
return 1;
}
objectp[playerid][objrz] = float(yaw);
SetObjectRotation(objectp[playerid][objid],objectp[playerid][objrx],objectp[playerid][objry],objectp[playerid][objrz]);
format(stringit,sizeof(stringit),"You set your objects Yaw to %d",yaw);
SendClientMessage(playerid,COLOR_GREEN,stringit);
return true;
}
dcmd_current(playerid,params[]){
if(objectp[playerid][created] == false){
SendClientMessage(playerid,COLOR_RED,"You don't have an active object");
return 1;
}
SendClientMessage(playerid,COLOR_GREEN,"Your Current Object:");
format(stringit,sizeof(stringit),"ID: %d, Model: %d, X: %f, Y: %f, Z: %f",objectp[playerid][objid],objectp[playerid][objmodelid],objectp[playerid][objx],objectp[playerid][objy],objectp[playerid][objz]);
SendClientMessage(playerid,COLOR_WHITE,stringit);
format(stringit,sizeof(stringit),"Roll (rX): %f, Pitch (rY): %f, Yaw (rZ): %f",objectp[playerid][objrx],objectp[playerid][objry],objectp[playerid][objrz]);
SendClientMessage(playerid,COLOR_WHITE,stringit);
#pragma unused params
return true;
}
dcmd_query(playerid,params[]){
new idx;
tmpit = strtok(params,idx);
if(!strlen(tmpit)){
SendClientMessage(playerid,COLOR_WHITE,"USAGE: /query [objectid]");
return 1;
}
new cid = strval(tmpit);
if(!IsValidObject(cid)){
SendClientMessage(playerid,COLOR_RED,"That is not a valid object");
return 1;
}
format(stringit,sizeof(stringit),"ID: %d, Model: %d, X: %f, Y: %f, Z: %f",cid,objectc[cid][cobjmodelid],objectc[cid][cobjx],objectc[cid][cobjy],objectc[cid][cobjz]);
SendClientMessage(playerid,COLOR_WHITE,stringit);
format(stringit,sizeof(stringit),"Roll (rX): %f, Pitch (rY): %f, Yaw (rZ): %f",objectc[cid][cobjrx],objectc[cid][cobjry],objectc[cid][cobjrz]);
SendClientMessage(playerid,COLOR_WHITE,stringit);
return true;
}
dcmd_gotoobj(playerid,params[]){
new idx;
tmpit = strtok(params,idx);
if(!strlen(tmpit)){
SendClientMessage(playerid,COLOR_WHITE,"USAGE: /gotoobj [objectid]");
return 1;
}
new cid = strval(tmpit);
if(!IsValidObject(cid)){
SendClientMessage(playerid,COLOR_RED,"That is not a valid object");
return 1;
}
new Float:x,Float:y,Float:z;
GetObjectPos(cid,x,y,z);
SetPlayerPos(playerid,x,y,z);
return true;
}
dcmd_ohelp(playerid,params[]){
SendClientMessage(playerid,COLOR_RED,"Sackys Map Editor Help:");
SendClientMessage(playerid,COLOR_WHITE,"/object - gives you a new object to manipulate on the fly, /query - shows stats of an object id");
SendClientMessage(playerid,COLOR_WHITE,"/cut - destroys your manipulation object, /gotoobj - sets your position on an object");
SendClientMessage(playerid,COLOR_WHITE,"/dis - sets the distance between you and your manipulation object");
SendClientMessage(playerid,COLOR_WHITE,"/set - sets your manipulation object onto the map as it appears, also writes it to the log");
SendClientMessage(playerid,COLOR_WHITE,"/reset - allows you to reset a set a object into a manipulation object");
SendClientMessage(playerid,COLOR_WHITE,"/unset - destroys a set object");
SendClientMessage(playerid,COLOR_WHITE,"/air - can be used to switch airmode on and off, for holding your position (useful with /up and /dn)");
SendClientMessage(playerid,COLOR_WHITE,"/up - sets you up, /dn - sets you down, /rot - sets your rotation, /roll - sets the objects roll");
SendClientMessage(playerid,COLOR_WHITE,"/pitch - sets the objects pitch, /yaw - sets the objects yaw, /current - displays your current objects stats");
#pragma unused params
return true;
}
GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance){
new Float:a;
GetPlayerPos(playerid, x, y, a);
GetPlayerFacingAngle(playerid, a);
x += (distance * floatsin(-a, degrees));
y += (distance * floatcos(-a, degrees));
}
CreatePlayerObject(playerid,modelid,Float:X,Float:Y,Float:Z,Float:rX,Float:rY,Float:rZ,distance){
CreateObject(modelid,X,Y,Z,0.0,0.0,rZ);
objectp[playerid][objmodelid] = modelid;
objectp[playerid][objx] = X;
objectp[playerid][objy] = Y;
objectp[playerid][objz] = Z;
objectp[playerid][objrx] = rX;
objectp[playerid][objry] = rY;
objectp[playerid][objrz] = rZ;
objectp[playerid][objid] = totalobjs;
objectp[playerid][created] = true;
objectp[playerid][objdistance] = distance;
totalobjs++;
return objectp[playerid][objid];
}
DestroyPlayerObject(playerid){
DestroyObject(objectp[playerid][objid]);
objectp[playerid][created] = false;
totalobjs--;
}
strrest(const string[], index){
new length = strlen(string);
new offset = index;
new result[256];
while ((index < length) && ((index - offset) < (sizeof(result) - 1)) && (string[index] > '\r')){
result[index - offset] = string[index];
index++;
}
result[index - offset] = EOS;
return result;
}
AddObjectLog(playerid,string[]){
new tmpstr[256];
format(tmpstr,sizeof(tmpstr),"CreateObject(%d,%f,%f,%f,%f,%f,%f); //%s\r\n",objectp[playerid][objmodelid],objectp[playerid][objx],objectp[playerid][objy],objectp[playerid][objz],objectp[playerid][objrx],objectp[playerid][objry],objectp[playerid][objrz],string);
new File:fhandle = fopen(FILE_OBJECT,io_append);
fwrite(fhandle,tmpstr);
fclose(fhandle);
}
fcreate(filename[]){
if(fexist(filename))return false;
new File:fhandle = fopen(filename,io_write);
fclose(fhandle);
return true;
}
public SMETime(){
for(new i=0;i<MAX_PLAYERS;i++){
if(IsPlayerConnected(i)){
if(objectp[i][created] == true){
new Float:x,Float:y,Float:z;
GetPlayerPos(i,x,y,z);
GetXYInFrontOfPlayer(i,x,y,objectp[i][objdistance]);
SetObjectPos(objectp[i][objid],x,y,z);
}
}
}
}