SendEmoteMessage
#1
Niisiis, jagan teiege ühte koodirida, millega ei pea kasutama ProxDetectorit, vaid saab ühe lihtsa reaga hakkama.
Kuidas kasutada?

Code:
SendEmoteMessage(playerid, "karakteritegevus");

SendEmoteMessage kood:

Code:
forward SendEmoteMessage(playerid, action[]);
public SendEmoteMessage(playerid, action[])
{
    new playerName[MAX_PLAYER_NAME], msg[128];

    GetPlayerName(playerid, playerName, sizeof(playerName));

    format(msg, sizeof(msg), "%s %s", playerName, action);

    ProxDetector(30.0, playerid, msg, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
    printf("%s", msg);
    return 1;
}

ProxDetector kood:
Code:
public ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5)
{
    if(IsPlayerConnected(playerid))
    {
        new Float:posx, Float:posy, Float:posz;
        new Float:oldposx, Float:oldposy, Float:oldposz;
        new Float:tempposx, Float:tempposy, Float:tempposz;
        GetPlayerPos(playerid, oldposx, oldposy, oldposz);
        //radi = 2.0; //Trigger Radius
        for(new i = 0; i < MAX_PLAYERS; i++)
        {
            if(IsPlayerConnected(i))
            {
                if(!BigEar[i])
                {
                    GetPlayerPos(i, posx, posy, posz);
                    tempposx = (oldposx -posx);
                    tempposy = (oldposy -posy);
                    tempposz = (oldposz -posz);
                    //printf("DEBUG: X:%f Y:%f Z:%f",posx,posy,posz);
                    new playerworld, player2world;
                    playerworld = GetPlayerVirtualWorld(playerid);
                    player2world = GetPlayerVirtualWorld(i);
                    if(playerworld == player2world)
                    {
                        if (((tempposx < radi/16) && (tempposx > -radi/16)) && ((tempposy < radi/16) && (tempposy > -radi/16)) && ((tempposz < radi/16) && (tempposz > -radi/16)))
                        {
                            SendClientMessage(i, col1, string);
                        }
                        else if (((tempposx < radi/8) && (tempposx > -radi/8)) && ((tempposy < radi/8) && (tempposy > -radi/8)) && ((tempposz < radi/8) && (tempposz > -radi/8)))
                        {
                            SendClientMessage(i, col2, string);
                        }
                        else if (((tempposx < radi/4) && (tempposx > -radi/4)) && ((tempposy < radi/4) && (tempposy > -radi/4)) && ((tempposz < radi/4) && (tempposz > -radi/4)))
                        {
                            SendClientMessage(i, col3, string);
                        }
                        else if (((tempposx < radi/2) && (tempposx > -radi/2)) && ((tempposy < radi/2) && (tempposy > -radi/2)) && ((tempposz < radi/2) && (tempposz > -radi/2)))
                        {
                            SendClientMessage(i, col4, string);
                        }
                        else if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
                        {
                            SendClientMessage(i, col5, string);
                        }
                    }
                }
                else
                {
                    SendClientMessage(i, col1, string);
                }
            }
        }
    }//not connected
    return 1;
}

Värvid:
Code:
#define COLOR_PURPLE 0xCA6DCFAA
jõu kuttit!!!!!!
Reply
#2
Miks "include" prefix'i kasutasid, kui see pole isegi #include <>-ga seotud? Smile

Võinuks postitada selle alafoorumis:
<!-- l --><a class="postlink-local" href="http://samp.rps.ee/viewforum.php?f=11">viewforum.php?f=11</a><!-- l -->

Aga ma võin liigutada teema sinna kohta, kui nõus oled. 8)
Reply
#3
Noo, võid liigutada küll.
jõu kuttit!!!!!!
Reply
#4
Liigutatud. Smile
Reply
#5
Päris hea õpetus, ma ütleks. Midagi, mis teeb elu lihtsamaks. Aga ikkagi ma tooks mõned näpunäited (nagu alati). Smile

vent Wrote:
Code:
forward SendEmoteMessage(playerid, action[]);
public SendEmoteMessage(playerid, action[])
{
    new Float: eX, Float: eY, Float: eZ, playerName[MAX_PLAYER_NAME], msg[128];

    GetPlayerPos(playerid, eX, eY, eZ);

    GetPlayerName(playerid, playerName, sizeof(playerName));

    format(msg, sizeof(msg), "%s %s", playerName, action);

    ProxDetector(30.0, playerid, msg, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
    printf("%s", msg);
    return 1;
}
Miks on vaja selles koodis kasutada GetPlayerPos funktsiooni? Sa ei kasuta saadud positsioone ju. Milleks teha midagi, mida sul vaja ei lähe ja mida sa ei kasuta?
Lisaks võiks ära märkida, et selles koodis on ka nn logimine sees - printf. Ja kui ma juba selle juurde läksin, siis ma ütlen, et asja saab ära lahendada lihtsamalt: print(msg);
printf("%s", msg); on umbes sama hea, kui format(string, sizeof(string), "%s", string). See on samamoodi üsna ebavajalik.

Järgmiseks - ProxDetector. See on igivana funktsioon, mis juhtumisi on ka veidi aeglane. Ma teen sinu ja kõigi teiste elu lihtsamaks ja annan ühe funktsiooni, mis teeb umbes sama, mida ProxDetector, aga kiiremini.
Code:
stock LimitedChatMessage(Float:radius, playerid, color, string[])
{
    new Float:Pos[3];
    GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
    
    foreach(Player, i) if(IsPlayerInRangeOfPoint(i, radius, Pos[0], Pos[1], Pos[2]))
        SendClientMessage(i, color, string);
    
    return 1;
}
Ilma foreachita näeks see kood välja selline:
Code:
stock LimitedChatMessage(Float:radius, playerid, color, string[])
{
    new Float:Pos[3];
    GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
    
    for(new i; i < MAX_PLAYERS; i++) if(IsPlayerInRangeOfPoint(i, radius, Pos[0], Pos[1], Pos[2])) // IsPlayerConnected kontrollil pole mõtet, mängija ei saa olla ju teise mängija lähedal, kui teda sees pole. :)
        SendClientMessage(i, color, string);
    
    return 1;
}
Muidugi selle funktsiooni miinus on see, et on ainult 1 värv. ProxDetectoriga saab teha sellist "hajumisefekti".
Sex, Drums and Rock'n'Roll
Reply
#6
Kust see kood pärit on ?
www.andjos.eu - Veebimäng, CS, SA:MP
Reply
#7
Mr4rtur, proovisin natuke muuta seda logivärki ja
Code:
print(msg);
mul ei tööanud.
jõu kuttit!!!!!!
Reply
#8
Mr4rtur, sinu kood on küll hea, kuid seda lugeda on kohe piin, kui seal pole bracketeid.

Mina teeks midagi sellist sellest ja kasutaks ka VW võrdlust.
PHP Code:
stock LimitedChatMessage(Float:radiusplayeridcolorstring[])
{
    new 
        
Float:Pos[3]
    ;
    
GetPlayerPos(playeridPos[0], Pos[1], Pos[2]);
    foreach(
Playeri
    {
        if(
GetPlayerVirtualWorld(i) == GetPlayerVirtualWorld(playerid))
        {
            if(
IsPlayerInRangeOfPoint(iradiusPos[0], Pos[1], Pos[2]))
            {
                
SendClientMessage(icolorstring);
            }
        }
    }
    return 
1;

Reply
#9
Mina isiklikult eelistan ProxDetector, lihtsalt meeldib Tongue
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)