#include #include #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"); return 1; } 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); return 0; } 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