#emit IDXADDR -
ipsBruno - 27.09.2013
Vou comeзar a fazer uma listinha de tutoriais, com alguns truques que ando aprendendo em #emit. Pra quem nгo sabe o que й isto, favor, veja os seguintes links:
https://sampforum.blast.hk/showthread.php?tid=360155
https://sampforum.blast.hk/showthread.php?tid=315531
Como podem ver, ambos tutoriais estгo incompletos. Porque й simplesmente dнficil demais, ensinar #emit, tem muitos opcodes (que nem eu mesmo consegui aprender) e por este motivo й necessбrio que se faзam muitos tutoriais. Pois bem, antes de tudo. Vocкs devem saber o bбsico de #emit para pelo menos entender esse tutorial.
Nesse pequeno tutorial, vou explicar como й o uso do opcode IDXADDR. Que nгo foi bem explicado em alguns tutoriais. Vamos lб!
Basicamente, quando vocк carrega uma array para memуria em #emit
Vocк nгo poderб manipular os valores internos dela, por isto existe o IDXADDR, que basicamente й a abreviatura de INDEX ADDRESS, pois vocк estб pegando o valor address INDEX de uma array atravйs do endereзo dela. Entenderam? Nгo?
Vou explicar melhor:
Quando vocк tem
PHP Code:
new array [] = {1,2,3,4,5};
Em #emit, й muito complicado pegar um ъnico valor desta array (seja 1,2,3,4 ou 5) por este motivo, usando IDXADDR vocк pode combinar o armazenamento ALT (alternativo) com o PRI (primбrio) e pegar algum desses valores de dentro da array, nesse caso, pegarб o endereзo deles, simplesmente fazendo
pawn Code:
new array[] = {1,2,3,4,5};
new idx = 2; // irei pegar o endereзo do elemento 2 da array, no caso da parte 3
new arrayvalue; // cйlula para armazenamento do valor
// carregar array para o registro alternativo
#emit LOAD.S.alt array
// carregar o valor de idx para o registro primбrio
#emit LOAD.S.pri idx
// IDXADDR, neste caso iria armazenar no registro prнmario: array[iter]
#emit IDXADDR
// para demonstraзгo, salvarei o valor de array[idx] em arrayvalue
#emit STOR.S.pri arrayvalue
// mбgica! arrayvalue agora tem o valor address da array, que era array[idx] addr
printf("%d", arrayvalue);
EXEMPLO:
Serve para pegar valores na array (уbvio), veja o exemplo:
pawn Code:
new array[] = {48481,184};
printf("%d", getidx(array, 1)); // 184
stock getidx(arr[], idx) {
// carrega no registro primбrio o idx
#emit LOAD.S.pri idx
// carrega a array no registro secundario
#emit LOAD.S.alt arr
// pega o endereзo de arr[idx]
#emit IDXADDR
// armazena o valor do endereзo em idx
#emit STOR.S.pri idx
// carrega a array
#emit LOAD.I
// armazena o valor de arr[idx] em idx agora
#emit STOR.S.pri idx
// retorna o valor encontrado
#emit RETN
// faзa o compilador feliz
return 0;
}
Viram? Й simples, mas pode-se usar para muitas coisas. Logo que eu puder, estarei fazendo outros tutoriais referente a outros opcodes nгo mostrados no tutorial do rjj.
Qualquer erro no tutorial avisem.
Abraзos
Re: #emit IDXADDR -
Schocc - 27.09.2013
Muito bom nota 10
Seria нndice de endereзo?
Re: #emit IDXADDR -
Caio_Freeze - 27.09.2013
Muito bom apesar de ser mto avanзado pra min '-'
Re: #emit IDXADDR -
ipsBruno - 27.09.2013
Quote:
Originally Posted by Schocc
Muito bom nota 10
Seria нndice de endereзo?
|
Sim, com isto dб para pegar o valor do нndice da array, ou atй fazer trocas de valores, ou manipular toda a array por si. Й bem fбcil.
Re: #emit IDXADDR -
zSuYaNw - 27.09.2013
Nгo conhecia este opcode. bom trabalho DraKoN.
Re: #emit IDXADDR -
ipsBruno - 27.09.2013
Й ipsBruno
Adicionei um exemplo ao cуdigo. Abraзos
Re: #emit IDXADDR -
zSuYaNw - 27.09.2013
й possнvel com strings?
Re: #emit IDXADDR -
ipsBruno - 27.09.2013
Perfeitamente, sу que os valores manipulados serгo em decimais. Mas normal, sу imprimir com %c
pawn Code:
new string[] = "Suyanw boiola";
printf("%c", getidx(string, 5)); // retorna w
Re: #emit IDXADDR -
Schocc - 27.09.2013
legal mesmo, o que me diz sobre anti-cheats feitos em #emit? maquina abstrata?, funcionaria?
Re: #emit IDXADDR -
zSuYaNw - 27.09.2013
Quote:
Originally Posted by Schocc
legal mesmo, o que me diz sobre anti-cheats feitos em #emit? maquina abstrata?, funcionaria?
|
Creio que a diferenзa seria minima.
Re: #emit IDXADDR -
ipsBruno - 27.09.2013
Quote:
Originally Posted by Schocc
legal mesmo, o que me diz sobre anti-cheats feitos em #emit? maquina abstrata?, funcionaria?
|
Nгo tem muito o que fazer com #emit. Na verdade nгo tem quase nada haver.
#emit apenas serve para manipular a memуria de forma bruta, nгo tem muita utilidade quando utilizado em jogo.
Re: #emit IDXADDR -
RuanRider - 27.09.2013
tem sу
%c e
%d?
creio que nгo, me mostra outros ae?
Re: #emit IDXADDR -
ipsBruno - 27.09.2013
que eu lembro, sгo estes. mas hб como fazer mais.
%s %b %x %i %c %% %f %d
mas pode manipula-los com
%20s ou %0.3f %02d etc.
se estiver em sscanf, hб outra gama tambйm
p<delim>, u, s,i,d,z,b,p,a,h,x,o,r,g,s[N],a<especificadores>[size],{opcional},(Ns),e<especificadores>
tambйm tem os carriers
\n \a \r \\ \xN \bN (n = numero no formato)
Re: #emit IDXADDR -
RuanRider - 27.09.2013
qual o resultado dessas manipulaзхes? %20s, %0.3f ..
e qual o nome dado isso %letra?
Re: #emit IDXADDR -
ipsBruno - 27.09.2013
%20s vai completar com espaзos o que falta
PHP Code:
printf("'%08s'", "Bruno");
Bruno tem 5 caracteres, mas sгo 8. Entгo completa 3 com espaзos
%0.3f vai literalmente pegar sу atй X nъmeros apуs casas decimais
PHP Code:
printf("%0.3f", 1.16819841);
vai imprimir sу 1.16
%04d preenche com zeros um inteiro
algo como:
PHP Code:
printf("%04d", 10);
Sгo duas casas, mas eu pedi 4. Entao ele completa 2 com zeros a esquerda
0010
O nome %letra na programaзгo pode ser
placeholder ou
especificadores (
specifiers). Depende qual objetivo da funзгo. Em sscanf, quando nгo se usa % se chama especificador, pois especifica o tipo de dado imposto. Em format %letra se chama placeholder, pois % й substituнdo pela variбvel indicada
EDITADO
Esqueci do carrier de tab tambйm
\t
Re: #emit IDXADDR -
zPain - 28.09.2013
Eu escrevi uma funзгo similar а sua
getidx, mas fiquei com uma pequena dъvida:
Seu cуdigo:
pawn Code:
stock getidx(arr[], idx) {
// carrega no registro primбrio o idx
#emit LOAD.S.pri idx
// carrega a array no registro secundario
#emit LOAD.S.alt arr
// pega o endereзo de arr[idx]
#emit IDXADDR
// armazena o valor do endereзo em idx
#emit STOR.S.pri idx
// carrega a array
#emit LOAD.I
// armazena o valor de arr[idx] em idx agora
#emit STOR.S.pri idx
// retorna o valor encontrado
#emit RETN
// faзa o compilador feliz
return 0;
}
Meu cуdigo:
pawn Code:
stock GetArrayIndex(array[], index)
{
#emit LOAD.S.PRI index
#emit LOAD.S.ALT array
#emit IDXADDR
#emit STOR.S.PRI index
#emit LOAD.I
#emit RETN
return 0;
}
Repare que eu nгo executo um novo
STOR apуs o
LOAD. Existe alguma razгo especнfica para que vocк faзa isso?
Re: #emit IDXADDR -
ipsBruno - 29.09.2013
Erro meu. Nгo hб necessidade de STOR apуs o LOAD.I, й que quando fiz a funзгo ela retornava em IDX, entгo eu modifiquei o cуdigo para RETN e acabei deixando o STOR ali.
Abraзos