[Pedido] Chat normal con uno de entorno.
#1

ЎSaludos! vengo a pedirles un gran favor.

Acabу de entrar a un servidor llamado UnPlayer y he visto que al colocar en el chat general ( DP - Dentro del personaje ) y cuando colocas un signo de * llama tambiйn al chat de rol de entorno, por ejemplo:

Hola, como estбs *rнe*. Al poner *rнe* este sale del color purpura, osea del color que viene el comando /me pero si no pones dicho asterisco con unas letras pegadas no salga el color del chat de entorno.

Aquн les dejу una pequeсa imagen de la muestra.

Reply
#2

Esta facil hacerlo, ocupas usar strfind (este retorna la posicion inicial) y strmid.
Reply
#3

yo te puedo ayudar en tu pedido, pero es recomendable que no pidas y que pienses, lуgicamente te voy a dar todo listo pero bueh, espero que aprendas un poco mбs de este cуdigo simple. Yo lo usaba para decoraciуn cuando un usuario ubicada "" y eso, pues usaba esta funciуn que hice ya hace tiempo.

Код:
stock SyntaxString(const text[], const characterSpecial, const colorDefault[], const colorSpecial[])
{
	new
		sz_newText[800],
		n_count,
		bool: b_initialized,
		n_countNewText
	;
	
	while(n_count < strlen(text))
	{
		if(	text[n_count] == characterSpecial && n_count == 0 && !b_initialized ||
			text[n_count] == characterSpecial && text[n_count-1] == ' ' &&  !b_initialized ||
			text[n_count] == characterSpecial && n_count == (strlen(text)-1) && b_initialized  ||
			text[n_count] == characterSpecial && text[n_count+1] == ' ' && b_initialized
		)
		{
			if(!b_initialized) { 
				b_initialized=true, n_count++,
				format(sz_newText, sizeof(sz_newText), "%s{%s}", sz_newText, colorSpecial),
				n_countNewText = strlen(sz_newText);
			}
			else {
				b_initialized = false, n_count++,
				format(sz_newText, sizeof(sz_newText), "%s{%s}", sz_newText, colorDefault),
				n_countNewText = strlen(sz_newText);
			}
		}
		sz_newText[n_countNewText] = text[n_count];
		n_countNewText++;
		n_count++;
	}
	
	return sz_newText;
}
El uso es simple.
text[] = serнa el texto a cambiar, es decir "aaaaaaaaaaaa *rнe*"
characterSpecial = serнa el nъmero ASCII que quieres que sea el que compare, por ejemplo puedes poner '*' para que capture el ASCII del * y poder comprarlo.
colorDefault[] = serнa el color por defecto, es decir el color que ya estaba por ejemplo "FFFFFF".
colorSpecial[] = serнa el color que quieres que se ponga al hacer la sintaxis, ejemplo: "FF0000".

Aquн de paso tienes un ejemplo:

Код:
public OnPlayerText(playerid, text[])
{
	SendClientMessageToAll(-1, SyntaxString(text, '*', "FFFFFF", "FF0000"));
	return 0;
}
Espero que te sirva.
Reply
#4

Quote:
Originally Posted by Jastak
Посмотреть сообщение
...
Esta exagerada tu funcion.

pawn Код:
// ** INCLUDES

#include <a_samp>

// ** DEFINES

// *** FUNCTIONS

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

// ** MAIN

main()
{
    print("Loaded \"color_opening_and_closing_tags.amx\".");
}

// ** CALLBACKS

public OnGameModeInit()
{
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerConnect(playerid)
{
    SetPlayerColor(playerid, 0xFF0000FF);
    return 1;
}

public OnPlayerText(playerid, text[])
{
    new opening_tag_pos = strfind(text, "*", true);
    if(opening_tag_pos != -1)
    {
        new new_text[128], closing_tag_pos = strfind(text, "*", true, (opening_tag_pos + 1));
        strcpy(new_text, text, 128);

        if(closing_tag_pos != -1)
        {
            new string[256];
            strdel(new_text, opening_tag_pos, (opening_tag_pos + 1));
            strdel(new_text, (closing_tag_pos - 1), closing_tag_pos);

            strins(new_text, "{FFFFFF}", (closing_tag_pos - 1), 128);
            strins(new_text, "{FFF000}", opening_tag_pos, 128);

            format(string, sizeof(string), "%s: {FFFFFF}%s", ReturnPlayerName(playerid), new_text);
            SendClientMessageToAll(GetPlayerColor(playerid), string);
            return 0;
        }
    }
    return 1;
}

// ** FUNCTIONS

stock ReturnPlayerName(playerid)
{
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, MAX_PLAYER_NAME);
    return name;
}


Esto nomas te permitira usar una vez los dos "*", si mandas, por ejemplo "hola *hola* hola *hola*". Solo la primera "*hola*" cambiara de color. Y el otro sera omitido. Si quieres tu puedes aсadir eso.
Reply
#5

Quote:
Originally Posted by SickAttack
Посмотреть сообщение
...
Esa es otra manera de hacerlo pero como dije yo lo usaba para otras cosas y el mio permite ** cuantos sea.. pues y eso, lуgicamente se puede usar con strfind para hacerlo ilimitados de igual manera.
Reply
#6

Hay mil y un forma de hacerlo. Pero si hablan de "cуdigo limpio", ninguno publicado es de agrado visual. Quizб esto:

pawn Код:
stock colorear(cadena[], colorear[] = "{000000}", defecto[] = "{FFFFFF}", caracter = '*')
{
    // Cadena final
    new retorno[256];

    for(new i, z, estado, longitud = strlen(cadena); i < longitud; i++)
        if(cadena[i] == caracter) strcat(retorno, estado ? colorear : defecto), z += estado ? strlen(defecto) : strlen(colorear), estado = !estado;
        else retorno[z++] = cadena[i];

    return retorno;
}
Reply
#7

se ve bien, mucho mejor optimizado de cara cуdigo (lнneas).
Reply
#8

Podrнas hacer asн:

pawn Код:
stock reemplazarColores(src[], firstColor[], secondaryColor[], character)
 {
    new bool:usingSecondaryColor = false;
    for(new i; i<strlen(src);i++)
    {
        if (src[i]==character)
        {
            // invertir color
            usingSecondaryColor = !usingSecondaryColor;
           
            strins(src, usingSecondaryColor ? secondaryColor : primaryColor, i);
            i += 8; // 8 caracteres que es el largo de un color
        }
    }
}
Reply
#9

Quote:
Originally Posted by Jastak
Посмотреть сообщение
Esa es otra manera de hacerlo pero como dije yo lo usaba para otras cosas y el mio permite ** cuantos sea.. pues y eso, lуgicamente se puede usar con strfind para hacerlo ilimitados de igual manera.
Muchos colores hace el limite no visual muy corto, seria mejor limitarlo a un uso. Pero eso depende del OP.

Quote:
Originally Posted by DesingMyCry
Посмотреть сообщение
Hay mil y un forma de hacerlo. Pero si hablan de "cуdigo limpio", ninguno publicado es de agrado visual. Quizб esto:

pawn Код:
stock colorear(cadena[], colorear[] = "{000000}", defecto[] = "{FFFFFF}", caracter = '*')
{
    // Cadena final
    new retorno[256];

    for(new i, z, estado, longitud = strlen(cadena); i < longitud; i++)
        if(cadena[i] == caracter) strcat(retorno, estado ? colorear : defecto), z += estado ? strlen(defecto) : strlen(colorear), estado = !estado;
        else retorno[z++] = cadena[i];

    return retorno;
}
No funciona.
Reply
#10

Quote:
Originally Posted by SickAttack
Посмотреть сообщение
Esta exagerada tu funcion.

pawn Код:
// ** INCLUDES

#include <a_samp>

// ** DEFINES

// *** FUNCTIONS

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

// ** MAIN

main()
{
    print("Loaded \"color_opening_and_closing_tags.amx\".");
}

// ** CALLBACKS

public OnGameModeInit()
{
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerConnect(playerid)
{
    SetPlayerColor(playerid, 0xFF0000FF);
    return 1;
}

public OnPlayerText(playerid, text[])
{
    new opening_tag_pos = strfind(text, "*", true);
    if(opening_tag_pos != -1)
    {
        new new_text[128], closing_tag_pos = strfind(text, "*", true, (opening_tag_pos + 1));
        strcpy(new_text, text, 128);

        if(closing_tag_pos != -1)
        {
            new string[256];
            strdel(new_text, opening_tag_pos, (opening_tag_pos + 1));
            strdel(new_text, (closing_tag_pos - 1), closing_tag_pos);

            strins(new_text, "{FFFFFF}", (closing_tag_pos - 1), 128);
            strins(new_text, "{FFF000}", opening_tag_pos, 128);

            format(string, sizeof(string), "%s: {FFFFFF}%s", ReturnPlayerName(playerid), new_text);
            SendClientMessageToAll(GetPlayerColor(playerid), string);
            return 0;
        }
    }
    return 1;
}

// ** FUNCTIONS

stock ReturnPlayerName(playerid)
{
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, MAX_PLAYER_NAME);
    return name;
}


Esto nomas te permitira usar una vez los dos "*", si mandas, por ejemplo "hola *hola* hola *hola*". Solo la primera "*hola*" cambiara de color. Y el otro sera omitido. Si quieres tu puedes aсadir eso.
ЎSaludos!

Me gustу bastante estб, ya que me llamу a la atenciуn que puedas poner el Mensaje principal, luego el rol de entorno y la continuaciуn... Yo lo habнa hecho de otra manera.

PHP код:
[HTML]new Asterisco strfind(text"*");
    new 
string[172], Mensaje[172];
    
strmid(Mensajetext0strlen(text));
    if(
Asterisco != -1)
    {
        
strdel(MensajeAsteriscoAsterisco+1);
        
strins(Mensaje"{00E673}"Asterisco172);
        
format(stringsizeof(string), "%s dice: %s"NombreJugador(playerid), Mensaje);
        
ProxDetector(15.0playeridstringHablarHablar2Hablar3Hablar4Hablar5);
        
SetPlayerChatBubble(playeridMensaje0xFFFFFFFF15.05000);
    }
    else
    {
        
format(stringsizeof(string), "%s dice: %s"NombreJugador(playerid), text);
        
ProxDetector(15.0playeridstringHablarHablar2Hablar3Hablar4Hablar5);
        
SetPlayerChatBubble(playeridtext0xFFFFFFFF15.05000);
    }[/
HTML
Pero como lo hiciste tu me gustу mбs, solo cambie unas cosas en el tuyo y le aсadн unas variables que tenнa gracias.


PD: Gracias a todos los que pusieron una soluciуn u ayuda... Se les agradece de corazуn, y sobre el ъltimo que comento que no habнa seсal de mi, tuve algunos problemas personales por eso estaba ausente.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)