Where may I set coordinates?
#1

Hey, may you tell me where I can set coordinates to spawn surfing tables?
Код:
/*  surfboard.inc
 *
 *  © Copyright 2010, Emilijo "Correlli" Lovrich
 *
 *  Credits: - ****** for foreach & GetXYInFrontOfPlayer functions & ZeeX for zcmd command processor.
*/
#include <a_samp>
#include <foreach> //#include "YSI\y_iterate"
#include <zcmd>
#include <surfboard>
#if defined _surfboard_included
#endif
	#endinput

#define _surfboard_included

#if !defined _samp_included
	#error "You'll need to include the a_samp.inc include file before the surfboard.inc file!"

/* ----- */

#if !defined MAX_SURFBOARDS
	#define MAX_SURFBOARDS (5)
#endif

#if !defined MAX_SURFBOARD_SPEED
	#define MAX_SURFBOARD_SPEED (5.0)
#endif

#if !defined INVALID_SURFBOARD_ID
	#define INVALID_SURFBOARD_ID (-1)
#endif

/* ----- */

static
		bool:gOPF[3] = false;

/* ----- */
new u;
enum dataSurfboard
{
	modelID,
	objectID,
	Float:speed,
	Float:position[7]
}

new
		surfboardID = INVALID_SURFBOARD_ID, surfboardData[MAX_SURFBOARDS][dataSurfboard],
		Float:surfboardGoTo[MAX_SURFBOARDS][3], bool:firstSurfboard = false, sbTimer;

/* ----- */

stock CreateSurfboard(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz = 0.0)
{
	surfboardID++;
	if(surfboardID == MAX_SURFBOARDS)
	{
		printf("Limit of surfboards exceeded. Open the surfboard.inc and change the \"MAX_SURFBOARDS\" define to bigger value if you want to have more surfboards.\
				\nDon't forget that object limit in the current SA:MP version (0.3b) is 400, so it's a good thing to use an object-streamer if you're having many surfboards on server.");
		surfboardID--;
		return INVALID_SURFBOARD_ID;
	}
	new
			toSurfboardID = GetFreeSurfboardID();
	if(toSurfboardID == INVALID_SURFBOARD_ID)
	{
		print("Error: There are no surfboard IDs free.");
		surfboardID--;
		return INVALID_SURFBOARD_ID;
	}
	if(modelid < 1 || modelid > 3)
	{
		printf("Invalid model-ID at function \"CreateSurfboard\". Valid model-IDs are 1, 2 and 3.");
		surfboardID--;
		return INVALID_SURFBOARD_ID;
	}
	surfboardData[toSurfboardID][modelID] = modelid;
	surfboardData[toSurfboardID][position][0] = x;
	surfboardData[toSurfboardID][position][1] = y;
	surfboardData[toSurfboardID][position][2] = z;
	surfboardData[toSurfboardID][position][3] = rx;
	surfboardData[toSurfboardID][position][4] = ry;
	surfboardData[toSurfboardID][position][5] = rz;
	surfboardData[toSurfboardID][position][6] = rz;
	surfboardData[toSurfboardID][speed] = 0.0;
	surfboardData[toSurfboardID][objectID] = CreateObject(2403 + modelid, x, y, z, rx, ry, rz);
	if(!firstSurfboard)
	{
		firstSurfboard = true;
		sbTimer = SetTimer("surfboard_Timer", 1000, true);
	}
	return toSurfboardID;
}

stock DestroySurfboard(sbid)
{
	if(IsSurfboardCreated(sbid))
	{
		surfboardID--;
		surfboardData[sbid][modelID] = 0;
		surfboardData[sbid][position][0] = 0.0;
		surfboardData[sbid][position][1] = 0.0;
		surfboardData[sbid][position][2] = 0.0;
		surfboardData[sbid][position][3] = 0.0;
		surfboardData[sbid][position][4] = 0.0;
		surfboardData[sbid][position][5] = 0.0;
		surfboardData[sbid][position][6] = 0.0;
		surfboardData[sbid][speed] = 0.0;
		DestroyObject(surfboardData[sbid][objectID]);
		if(surfboardID == INVALID_SURFBOARD_ID)
		{
			firstSurfboard = false;
			KillTimer(sbTimer);
		}
		foreach(Player, u)
		{
			if((GetPVarInt(u, "surfboardID") - 1) == sbid)
			{
				SetPVarInt(u, "surfboardID", 0);
				ClearAnimations(u);
				SendClientMessage(u, 0xFFFFFFFF, "Surfing stopped - surfboard was deleted by the script.");
				break;
			}
		}
		return true;
	}
	return false;
}

stock IsSurfboardCreated(sbid)
{
	if(surfboardData[sbid][modelID]) return true;
	return false;
}

stock GetNumberOfSurfboards() return surfboardID;

stock GetFreeSurfboardID()
{
	new
			sbid = INVALID_SURFBOARD_ID;
	for(new a = 0; a < MAX_SURFBOARDS; a++)
	{
		if(!IsSurfboardCreated(a))
		{
			sbid = a;
			break;
		}
	}
	return sbid;
}

stock StopSurfboard(sbid)
{
	if(!IsSurfboardCreated(sbid)) return false;
	surfboardData[sbid][speed] = 0.0;
	StopObject(surfboardData[sbid][objectID]);
	return true;
}

stock RespawnSurfboard(sbid)
{
	if(!IsSurfboardCreated(sbid)) return false;
	DestroyObject(surfboardData[sbid][objectID]);
	surfboardData[sbid][position][5] = surfboardData[sbid][position][6];
	surfboardData[sbid][objectID] = CreateObject(2403 + surfboardData[sbid][modelID], surfboardData[sbid][position][0], surfboardData[sbid][position][1], surfboardData[sbid][position][2], surfboardData[sbid][position][3], surfboardData[sbid][position][4], surfboardData[sbid][position][5]);
	return true;
}

stock SetSurfboardSpeed(sbid, Float:surfspeed = MAX_SURFBOARD_SPEED)
{
	if(!IsSurfboardCreated(sbid)) return false;
	if(surfspeed > MAX_SURFBOARD_SPEED) surfboardData[sbid][speed] = MAX_SURFBOARD_SPEED;
	else surfboardData[sbid][speed] = surfspeed;
	return true;
}

stock IsPlayerAtSurfboard(playerid, sbid)
{
	new
			Float:pos[3];
	GetObjectPos(surfboardData[sbid][objectID], pos[0], pos[1], pos[2]);
	if(IsPlayerInRangeOfPoint(playerid, 1.5, pos[0], pos[1], pos[2])) return true;
	return false;
}

stock IsPlayerAtAnySurfboard(playerid)
{
	new
			a = 0;
	for(a = 0; a < MAX_SURFBOARDS; a++)
	{
		if(IsPlayerAtSurfboard(playerid, a)) return a;
	}
	return INVALID_SURFBOARD_ID;
}

stock IsSurfboardOccupied(sbid)
{
	if(!IsSurfboardCreated(sbid)) return INVALID_PLAYER_ID;
	foreach(Player, u)
	{
		if((GetPVarInt(u, "surfboardID") - 1) == sbid) return u;
	}
	return INVALID_PLAYER_ID;
}

/* ----- */

stock GetXYInFrontOfPlayerOnSB(playerid, &Float:x, &Float:y, Float:distance)
{
	new
			Float:angle;
	GetPlayerPos(playerid, x, y, angle);
	GetPlayerFacingAngle(playerid, angle);
	x += (distance * floatsin(-angle + 270.0, degrees));
	y += (distance * floatcos(-angle + 270.0, degrees));
}

/* ----- */

forward surfboard_Timer();
public surfboard_Timer()
{
	foreach(Player, u)
	{
		new
				sbid = GetPVarInt(u, "surfboardID") - 1;
		if(sbid != INVALID_SURFBOARD_ID)
		{
			if(!IsPlayerAtSurfboard(u, sbid))
			{
				StopSurfboard(sbid);
				RespawnSurfboard(sbid);
				SetPVarInt(u, "surfboardID", 0);
				ClearAnimations(u);
				SendClientMessage(u, 0xFFFFFFFF, "Surfing stopped - surfboard is re-spawned.");
			}
		}
	}
	return true;
}

/* ----- */

command(surf, playerid, params[])
{
	new
			Float:objPos[3];
	if(!GetPVarInt(playerid, "surfboardID"))
	{
		new
				sbid = IsPlayerAtAnySurfboard(playerid);
		if(sbid != INVALID_SURFBOARD_ID)
		{
			new
					isOccupied = IsSurfboardOccupied(sbid);
			if(isOccupied != INVALID_PLAYER_ID) return SendClientMessage(playerid, 0xFFFFFFFF, "(surfing) Someone is already surfing on this surfboard!");
			SetPVarInt(playerid, "surfboardID", sbid + 1);
			GetObjectPos(surfboardData[sbid][objectID], objPos[0], objPos[1], objPos[2]);
			SetPlayerPos(playerid, objPos[0], objPos[1], objPos[2] + 1.0);
			SetPlayerFacingAngle(playerid, surfboardData[sbid][position][5] + 270.0);
			ApplyAnimation(playerid, "BSKTBALL", "BBALL_def_loop", 4.0, 1, 0, 0, 0, 0);
			SendClientMessage(playerid, 0xFFFFFFFF, "Surfing started. Use \"/surf\" command to stop with the surfing.");
		}
		else SendClientMessage(playerid, 0xFFFFFFFF, "You're not near any surfboard or you're not close enough to it.");
	}
	else
	{
		StopSurfboard(GetPVarInt(playerid, "surfboardID") - 1);
		SetPVarInt(playerid, "surfboardID", 0);
		ClearAnimations(playerid);
		SendClientMessage(playerid, 0xFFFFFFFF, "Surfing stopped. Use \"/surf\" command to start with the surfing again.");
	}
	return true;
}

/* ----- */

public OnPlayerConnect(playerid)
{
	ApplyAnimation(playerid, "BSKTBALL", "null", 0.0, 0, 0, 0, 0, 0);

	if(gOPF[0]) CallLocalFunction("surfboard_OnPlayerConnect", "i", playerid);
	return true;
}

#if defined _ALS_OnPlayerConnect
	#undef OnPlayerConnect
#else
	#define _ALS_OnPlayerConnect
#endif
#define OnPlayerConnect surfboard_OnPlayerConnect

forward surfboard_OnPlayerConnect(playerid);



public OnPlayerDisconnect(playerid, reason)
{
	new
			sbid = GetPVarInt(playerid, "surfboardID") - 1;
	if(sbid != INVALID_SURFBOARD_ID)
	{
		StopSurfboard(sbid);
		RespawnSurfboard(sbid);
	}

	if(gOPF[1]) CallLocalFunction("surfboard_OnPlayerDisconnect", "ii", playerid, reason);
	return true;
}

#if defined _ALS_OnPlayerDisconnect
	#undef OnPlayerDisconnect
#else
	#define _ALS_OnPlayerDisconnect
#endif
#define OnPlayerDisconnect surfboard_OnPlayerDisconnect

forward surfboard_OnPlayerDisconnect(playerid, reason);



public OnPlayerUpdate(playerid)
{
	new
			sbid = GetPVarInt(playerid, "surfboardID") - 1;
	if(sbid != INVALID_SURFBOARD_ID)
	{
		new
				keys[3], Float:floatVal[4];
		GetPlayerPos(playerid, floatVal[0], floatVal[1], floatVal[2]);
		floatVal[3] = surfboardData[sbid][speed];
		GetPlayerKeys(playerid, keys[0], keys[1], keys[2]);
		GetXYInFrontOfPlayerOnSB(playerid, floatVal[0], floatVal[1], 50.0);
		surfboardGoTo[sbid][0] = floatVal[0];
		surfboardGoTo[sbid][1] = floatVal[1];
		surfboardGoTo[sbid][2] = surfboardData[sbid][position][2];
		if(keys[1] == KEY_UP)
		{
			if(floatVal[3] >= 0.0 && floatVal[3] < MAX_SURFBOARD_SPEED) surfboardData[sbid][speed] += 0.05;
			if(floatVal[3] >= MAX_SURFBOARD_SPEED) surfboardData[sbid][speed] = MAX_SURFBOARD_SPEED;
		}
		else if(keys[1] == KEY_DOWN)
		{
			if(floatVal[3] >= 0.0 && floatVal[3] < MAX_SURFBOARD_SPEED) surfboardData[sbid][speed] -= 0.05;
			if(floatVal[3] >= MAX_SURFBOARD_SPEED) surfboardData[sbid][speed] = MAX_SURFBOARD_SPEED;
		}
		if(keys[2] == KEY_LEFT)
		{
			surfboardData[sbid][speed] -= 0.01;
			surfboardData[sbid][position][5] += 1.5;
			SetObjectRot(surfboardData[sbid][objectID], surfboardData[sbid][position][3], surfboardData[sbid][position][4], surfboardData[sbid][position][5]);
			SetPlayerFacingAngle(playerid, surfboardData[sbid][position][5] + 270.0);
			surfboardGoTo[sbid][0] = floatVal[0];
			surfboardGoTo[sbid][1] = floatVal[1];
			surfboardGoTo[sbid][2] = surfboardData[sbid][position][2];
		}
		else if(keys[2] == KEY_RIGHT)
		{
			surfboardData[sbid][speed] -= 0.01;
			surfboardData[sbid][position][5] -= 1.5;
			SetObjectRot(surfboardData[sbid][objectID], surfboardData[sbid][position][3], surfboardData[sbid][position][4], surfboardData[sbid][position][5]);
			SetPlayerFacingAngle(playerid, surfboardData[sbid][position][5] + 270.0);
			surfboardGoTo[sbid][0] = floatVal[0];
			surfboardGoTo[sbid][1] = floatVal[1];
			surfboardGoTo[sbid][2] = surfboardData[sbid][position][2];
		}
		if(surfboardData[sbid][speed] > 0.005)
		{
			surfboardData[sbid][speed] -= 0.005;
			MoveObject(surfboardData[sbid][objectID], surfboardGoTo[sbid][0], surfboardGoTo[sbid][1], surfboardGoTo[sbid][2], surfboardData[sbid][speed]);
		}
		else StopSurfboard(sbid);
		new
				string[72];
		format(string, sizeof(string), "~n~~n~~n~~n~~n~~n~~n~~n~~n~~r~Speed: ~w~%0.1f ~r~/ ~w~%0.1f", surfboardData[sbid][speed], MAX_SURFBOARD_SPEED);
		GameTextForPlayer(playerid, string, 1000, 3);
	}

	if(gOPF[2]) CallLocalFunction("surfboard_OnPlayerUpdate", "i", playerid);
	return true;
}

#if defined _ALS_OnPlayerUpdate
	#undef OnPlayerUpdate
#else
	#define _ALS_OnPlayerUpdate
#endif
#define OnPlayerUpdate surfboard_OnPlayerUpdate

forward surfboard_OnPlayerUpdate(playerid);



public OnGameModeInit()
{
	gOPF[0] = (funcidx("surfboard_OnPlayerConnect") != -1);
	gOPF[1] = (funcidx("surfboard_OnPlayerDisconnect") != -1);
	gOPF[2] = (funcidx("surfboard_OnPlayerUpdate") != -1);
	CallLocalFunction("surfboard_OnGameModeInit", "");
}

#if defined _ALS_OnGameModeInit
	#undef OnGameModeInit
#else
	#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit surfboard_OnGameModeInit

forward surfboard_OnGameModeInit();
Reply
#2

You can spawn them where ever you want too.

pawn Код:
CreateSurfboard(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz = 0.0)
They're just the same as Objects or Vehicles.
Reply
#3

There is no surf i put my coordinates, why?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)