3D Text Label
#1

Hi,

So, let's say that I have a CMD to create a 3D text label. Something along the lines of:
Код:
YCMD:3d(playerid, params[], help)
{
	new Float:X, Float:Y, Float:Z;
	GetPlayerPos(playerid, X, Y, Z);
	Create3DTextLabel("3D Text Label", 0xFFFFFFFF, X, Y, Z, 30.0, 0, 0);
	return true;
}
How could I give each 3D text label it's own unique ID so that after some time the text labels would begin to disappear one at a time? Anyone got an ideas?

EDIT: Also, how could I create another CMD to delete a 3D text label I'm standing near/on?

Thanks in advance.
Reply
#2

Here's something I just did:

pawn Код:
#include "a_samp"
#include "sscanf"
#include "zcmd"

#define strcpy(%0,%1,%2) strcat((%0[0] = '\0', %0), %1, %2)

#define MAX_LABELS 10

enum _labels
{
    Text3D: label_ID,
    label_time,
    label_text[128],
    Float: label_pos[3]
}
new
    gLabels[MAX_LABELS][_labels];

public OnGameModeInit()
{
    for(new i = 0; i < MAX_LABELS; i++)
    {
        gLabels[i][label_ID] = Text3D: INVALID_3DTEXT_ID;
    }

    SetTimer("DeleteTimers", 1000, true);

    AddPlayerClass(4, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

CMD:3d(playerid, params[])
{
    new ltext[128], time;

    if(sscanf(params, "ds[128]", time, ltext))
        return SendClientMessage(playerid, -1, "Usage: /3d < time to auto-delete(in seconds.. put -1 in seconds to never delete) > < label text >");

    new Float: pos[3];
    new world = GetPlayerVirtualWorld(playerid);

    GetPlayerPos(playerid, pos[0], pos[1], pos[2]);

    new id = GetEmptyLabelID();

    gLabels[id][label_ID] = Create3DTextLabel(ltext, -1, pos[0], pos[1], pos[2], 20.0, world, 1);

    strcpy(gLabels[id][label_text], ltext, 128);

    gLabels[id][label_pos][0] = pos[0];
    gLabels[id][label_pos][1] = pos[1];
    gLabels[id][label_pos][2] = pos[2];

    gLabels[id][label_time] = gettime() + time;

    new str[128];

    format(str, sizeof(str), "Successfully created label id: %d with text: %s. It auto-deletes in: %d sec", id, ltext, time);
    SendClientMessage(playerid, -1, str);
    return 1;
}

CMD:delete3d(playerid, params[])
{
    for(new i = 0; i < MAX_LABELS; i++)
    {
        if(IsPlayerInRangeOfPoint(playerid, 5, gLabels[i][label_pos][0], gLabels[i][label_pos][1], gLabels[i][label_pos][2]))
        {
            new str[128];

            format(str, sizeof(str), "You've successfully deleted label id: %d. Text: %s", i, gLabels[i][label_text]);
            SendClientMessage(playerid, -1, str);

            ClearLabel(i);
            return 1;
        }
    }

    SendClientMessage(playerid, -1, "No labels are in range to delete!");
    return 1;
}

stock GetEmptyLabelID()
{
    new id;

    for(new i = 0; i < MAX_LABELS; i++)
    {
        if(gLabels[i][label_ID] == Text3D: INVALID_3DTEXT_ID)
        {
            id = i;
            break;
        }
    }

    if(id == INVALID_3DTEXT_ID)
        id = 0;

    return id;
}

forward DeleteTimers();
public DeleteTimers()
{
    print("Tick");
    for(new i = 0; i < MAX_LABELS; i++)
    {
        if(gLabels[i][label_ID] != Text3D: INVALID_3DTEXT_ID && gLabels[i][label_time] != -1)
        {
            if((gLabels[i][label_time] - gettime()) == 0)
            {
                new str[128];
               
                format(str, sizeof(str), "Label id: %d has been auto-deleted! (Text: %s)", i, gLabels[i][label_text]);
                SendClientMessageToAll(-1, str);

                ClearLabel(i);
            }
        }
    }
    return 1;
}

stock ClearLabel(labelid)
{
    if(labelid == INVALID_3DTEXT_ID)
        return 0;

    Delete3DTextLabel(gLabels[labelid][label_ID]);

    gLabels[labelid][label_ID] = Text3D: INVALID_3DTEXT_ID;

    gLabels[labelid][label_pos][0] = 0.0;
    gLabels[labelid][label_pos][1] = 0.0;
    gLabels[labelid][label_pos][2] = 0.0;

    gLabels[labelid][label_text][0] = EOS;

    gLabels[labelid][label_time] = 0;
    return 1;
}
You will need zcmd(You can change that) and you will also need sscanf plugin
Reply
#3

Quote:
Originally Posted by AssBlaster
Посмотреть сообщение
Here's something I just did:

pawn Код:
#include "a_samp"
#include "sscanf"
#include "zcmd"

#define strcpy(%0,%1,%2) strcat((%0[0] = '\0', %0), %1, %2)

#define MAX_LABELS 10

enum _labels
{
    Text3D: label_ID,
    label_time,
    label_text[128],
    Float: label_pos[3]
}
new
    gLabels[MAX_LABELS][_labels];

public OnGameModeInit()
{
    for(new i = 0; i < MAX_LABELS; i++)
    {
        gLabels[i][label_ID] = Text3D: INVALID_3DTEXT_ID;
    }

    SetTimer("DeleteTimers", 1000, true);

    AddPlayerClass(4, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0);
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

CMD:3d(playerid, params[])
{
    new ltext[128], time;

    if(sscanf(params, "ds[128]", time, ltext))
        return SendClientMessage(playerid, -1, "Usage: /3d < time to auto-delete(in seconds.. put -1 in seconds to never delete) > < label text >");

    new Float: pos[3];
    new world = GetPlayerVirtualWorld(playerid);

    GetPlayerPos(playerid, pos[0], pos[1], pos[2]);

    new id = GetEmptyLabelID();

    gLabels[id][label_ID] = Create3DTextLabel(ltext, -1, pos[0], pos[1], pos[2], 20.0, world, 1);

    strcpy(gLabels[id][label_text], ltext, 128);

    gLabels[id][label_pos][0] = pos[0];
    gLabels[id][label_pos][1] = pos[1];
    gLabels[id][label_pos][2] = pos[2];

    gLabels[id][label_time] = gettime() + time;

    new str[128];

    format(str, sizeof(str), "Successfully created label id: %d with text: %s. It auto-deletes in: %d sec", id, ltext, time);
    SendClientMessage(playerid, -1, str);
    return 1;
}

CMD:delete3d(playerid, params[])
{
    for(new i = 0; i < MAX_LABELS; i++)
    {
        if(IsPlayerInRangeOfPoint(playerid, 5, gLabels[i][label_pos][0], gLabels[i][label_pos][1], gLabels[i][label_pos][2]))
        {
            new str[128];

            format(str, sizeof(str), "You've successfully deleted label id: %d. Text: %s", i, gLabels[i][label_text]);
            SendClientMessage(playerid, -1, str);

            ClearLabel(i);
            return 1;
        }
    }

    SendClientMessage(playerid, -1, "No labels are in range to delete!");
    return 1;
}

stock GetEmptyLabelID()
{
    new id;

    for(new i = 0; i < MAX_LABELS; i++)
    {
        if(gLabels[i][label_ID] == Text3D: INVALID_3DTEXT_ID)
        {
            id = i;
            break;
        }
    }

    if(id == INVALID_3DTEXT_ID)
        id = 0;

    return id;
}

forward DeleteTimers();
public DeleteTimers()
{
    print("Tick");
    for(new i = 0; i < MAX_LABELS; i++)
    {
        if(gLabels[i][label_ID] != Text3D: INVALID_3DTEXT_ID && gLabels[i][label_time] != -1)
        {
            if((gLabels[i][label_time] - gettime()) == 0)
            {
                new str[128];
               
                format(str, sizeof(str), "Label id: %d has been auto-deleted! (Text: %s)", i, gLabels[i][label_text]);
                SendClientMessageToAll(-1, str);

                ClearLabel(i);
            }
        }
    }
    return 1;
}

stock ClearLabel(labelid)
{
    if(labelid == INVALID_3DTEXT_ID)
        return 0;

    Delete3DTextLabel(gLabels[labelid][label_ID]);

    gLabels[labelid][label_ID] = Text3D: INVALID_3DTEXT_ID;

    gLabels[labelid][label_pos][0] = 0.0;
    gLabels[labelid][label_pos][1] = 0.0;
    gLabels[labelid][label_pos][2] = 0.0;

    gLabels[labelid][label_text][0] = EOS;

    gLabels[labelid][label_time] = 0;
    return 1;
}
You will need zcmd(You can change that) and you will also need sscanf plugin
Thank you so much, rep+
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)