All pastes #283641 Raw Edit

Sackys Map Editor

public text v1 · immutable
#283641 ·published 2006-12-18 14:07 UTC
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");
	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<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);
			}
		}
	}
}