[ajuda] Algum bom scripter...
#1

...consegue entender isso?

PHP код:
//formated message
#define scm(%0,%1,%2) SendClientMessage(%0,%1,%2)
scmf(playerid,color,fstring[],{Float_}:...) 
{
   new 
n=(numargs()-3)*4;
   if(
n
    {
        new 
message[255],arg_start,arg_end;
        
#emit CONST.alt                fstring
        #emit LCTRL                    5
        #emit ADD
        #emit STOR.S.pri               arg_start
        #emit LOAD.S.alt               n
        #emit ADD
        #emit STOR.S.pri               arg_end
        
do 
        {
            
#emit LOAD.I
            #emit PUSH.pri
            
arg_end-=4;
            
#emit LOAD.S.pri           arg_end
        
}
        while(
arg_end>arg_start);
        
#emit PUSH.S                   fstring
        #emit PUSH.C                   255
        #emit PUSH.ADR                 message
        
n+=4*3;
        
#emit PUSH.S                   n
        #emit SYSREQ.C                 format
        
n+=4;
        
#emit LCTRL                    4
        #emit LOAD.S.alt               n
        #emit ADD
        #emit SCTRL                    4
        
return scm(playerid,color,message);
    } 
    else 
        return 
scm(playerid,color,fstring);

meu sv crasho por o seguinte log:
Quote:

[31/03/12 23:01:02] [debug] Server crashed while executing bowling.amx
[31/03/12 23:01:02] [debug] Backtrace (most recent call first):
[31/03/12 23:01:02] [debug] #0 ?? in native format () from samp-server.exe
[31/03/12 23:01:02] [debug] #1 000485bc in scmf (playerid=10, color=-1321978710, fstring[]=@0x00072d94 "{FFFFFF}Voc") at C:\BSL\BSL 2.1\filterscripts\bowling.pwn:2517
[31/03/12 23:01:02] [debug] #2 00044cbc in public OnDialogResponse (playerid=10, dialogid=-1321978710, response=470420, listitem=180344, inputtext[]=@0x000772bc "") at C:\BSL\BSL 2.1\filterscripts\bowling.pwn:2187

obs.: a primeira diretiva, obviamente eu sei...
as outras eu nгo faзo idйia =\
Reply
#2

Apague esta funзгo do seu GM e adicione ao topo do mesmo :


pawn Код:
new Msg[128];
#define scmf(%0,%1,%2) \
format(Msg, 128, %2), SendClientMessage(%0, %1, Msg)


Espero ter ajudado .
Reply
#3

fazer uma alternativa a essa funзгo eu sei =x
o que eu quero й entender ela o.o
Reply
#4

Quote:
Originally Posted by dudaefj
Посмотреть сообщение
fazer uma alternativa a essa funзгo eu sei =x
o que eu quero й entender ela o.o
A funзгo que vocк postou й uma modificaзгo desta :


pawn Код:
#define BYTES_PER_CELL 4

stock CPF(playerid, color, fstring[], {Float, _}:...)
{
    // This is the number of parameters which are not variable that are passed
    // to this function (i.e. the number of named parameters).
    static const
        STATIC_ARGS = 3;
    // Get the number of variable arguments.
    new
        n = (numargs() - STATIC_ARGS) * BYTES_PER_CELL;
    if (n)
    {
        new
            message[128],
            arg_start,
            arg_end;
       
        // Load the real address of the last static parameter. Do this by
        // loading the address of the last known static parameter and then
        // adding the value of [FRM].
        #emit CONST.alt        fstring
        #emit LCTRL          5
        #emit ADD
        #emit STOR.S.pri        arg_start
       
        // Load the address of the last variable parameter. Do this by adding
        // the number of variable parameters on the value just loaded.
        #emit LOAD.S.alt        n
        #emit ADD
        #emit STOR.S.pri        arg_end
       
        // Push the variable arguments. This is done by loading the value of
        // each one in reverse order and pushing them. I'd love to be able to
        // rewrite this to use the values of pri and alt for comparison,
        // instead of having to constantly load and reload two variables.
        do
        {
            #emit LOAD.I
            #emit PUSH.pri
            arg_end -= BYTES_PER_CELL;
            #emit LOAD.S.pri      arg_end
        }
        while (arg_end > arg_start);
       
        // Push the static format parameters.
        #emit PUSH.S          fstring
        #emit PUSH.C          128
        #emit PUSH.ADR         message
       
        // Now push the number of arguments passed to format, including both
        // static and variable ones and call the function.
        n += BYTES_PER_CELL * 3;
        #emit PUSH.S          n
        #emit SYSREQ.C         format
       
        // Remove all data, including the return value, from the stack.
        n += BYTES_PER_CELL;
        #emit LCTRL          4
        #emit LOAD.S.alt        n
        #emit ADD
        #emit SCTRL          4
       
        return SendClientMessage(playerid, color, message);
        //return print(message);
    }
    else
    {
        return SendClientMessage(playerid, color, fstring);
        //return print(fstring);
    }
}


Nela, como pode ver, hб explicaзхes a respeito de seu funcionamento .



Se vocк nгo conseguir entender palavras como "stack" e "address", estude o manual Pawn Implementer's Guide e a linguagem de programaзгo Assembly.



Espero ter ajudado .
Reply
#5

Pouca gente sabe(pouca mesmo)
trabalhar com a tag 'emit'

Oque ela faz ?
Ela emite um dado/valor diretamente para o amx (Assembly).
Nisto, quando usamos incorretamente, pode haver crashs e outros erros.
por isto que se for user, que entenda pelo menos umpouco do assunto.

Acho melhor vocк ler este tуpico: http://forum.sa-mp.com/showthread.ph...874#post669874
Reply
#6

Quote:
Originally Posted by RyDeR`
Посмотреть сообщение
Author ******.
Hum... pq eu nгo to surpreso?

vo dar uma olhada melhor no assunto, interessei
esse site aqui tbm й interessante: https://sampwiki.blast.hk/wiki/Query_Mechanism#Opcodes
embora eu ainda nao tenha entendido completamente o que ele diz...

mas й isso ae, vlw galera
bom saber que ainda tem scripters dessa бrea PT do fуrum q nгo se limitam apenas а simples e bбsica "programaзгo" do samp :]



@Edit
Vendo agora com calma
se eu fizesse isso:

Quote:
Originally Posted by rjjj
Посмотреть сообщение
Apague esta funзгo do seu GM e adicione ao topo do mesmo :


pawn Код:
new Msg[128];
#define scmf(%0,%1,%2) \
format(Msg, 128, %2), SendClientMessage(%0, %1, Msg)
nem teria compilado, pq tem parte do cуdigo que a funзгo usa 5~6 argumentos e nгo apenas 3...
mas sу crasho com esse motivo 1x atй hj
nгo sei se й realmente necessбrio uma mudanзa
Reply
#7

Quote:
Originally Posted by dudaefj
Посмотреть сообщение
Vendo agora com calma
se eu fizesse isso:



nem teria compilado, pq tem parte do cуdigo que a funзгo usa 5~6 argumentos e nгo apenas 3...
mas sу crasho com esse motivo 1x atй hj
nгo sei se й realmente necessбrio uma mudanзa
Teste com quantos parвmetros quiser e verб que esse cуdigo nгo й o que parece ser .



Espero ter ajudado .
Reply
#8

Quote:
Originally Posted by dudaefj
Посмотреть сообщение
Hum... pq eu nгo to surpreso?

vo dar uma olhada melhor no assunto, interessei
esse site aqui tbm й interessante: https://sampwiki.blast.hk/wiki/Query_Mechanism#Opcodes
embora eu ainda nao tenha entendido completamente o que ele diz...
Este site й sobre Otimizaзгo e comunicaзгo com o painel de controle.

Veja isto: http://www.scriptbrasil.com.br/apost...mas/assembler/
Reply
#9

Quote:
Originally Posted by rjjj
Посмотреть сообщение
Teste com quantos parвmetros quiser e verб que esse cуdigo nгo й o que parece ser .



Espero ter ajudado .
pois й
acho que й o sono
parei pra pensar bemmm dps
afinal, o terceiro "%" vai pegar todos os outros argumentos juntos, evidentemente...
preciso dormir : )



Quote:
Originally Posted by DarkScripter
Посмотреть сообщение
Este site й sobre Otimizaзгo e comunicaзгo com o painel de controle.

Veja isto: http://www.scriptbrasil.com.br/apost...mas/assembler/
vou ver!! =)
Reply
#10

Quote:
Originally Posted by rjjj
Посмотреть сообщение
Apague esta funзгo do seu GM e adicione ao topo do mesmo :


pawn Код:
new Msg[128];
#define scmf(%0,%1,%2) \
format(Msg, 128, %2), SendClientMessage(%0, %1, Msg)


Espero ter ajudado .
pera
uma coisa agora n entendi
pq virgula simples e nao ponto e virgula??

format(Msg, 128, %2), SendClientMessage(%0, %1, Msg)


ah ta, acho que ja entendi, se fosse ";" nao funcionaria a macro
mas nunca sei qdo a virgula pode substituir ponto e virgula, ja vi e ja ate usei essa substituiзгo em alguns casos de "return a, b;" mas nunca entendi msm =x

isso entao ta crto?
#define scmf(%0,%1,%2) new Msg[128], format(Msg, 128, %2), SendClientMessage(%0, %1, Msg)



@Edit
й, ja vi q nгo ta...
Entгo vem a pergunta
quando virgula pode substituir ponto e virgula??
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)