[ESP] YSI Secrets - Printable Version + open.mp forum (https://forum.open.mp) -- Forum: Other languages (https://forum.open.mp/forumdisplay.php?fid=23) --- Forum: Spanish/Espa?ol (https://forum.open.mp/forumdisplay.php?fid=24) ---- Forum: Programaci?n (https://forum.open.mp/forumdisplay.php?fid=51) ---- Thread: [ESP] YSI Secrets (/showthread.php?tid=378) |
[ESP] YSI Secrets - #Fede - 2019-04-19 Esta es una traduccion de esta gu?a?para VisualTexture ?Introduccion Hay una gran cantidad de temas que hablan sobre gran parte de YSI, pero generalmente se ignoran peque?os detalles de YSI. El punto de este tema es mostrar la mayor?a de estos detalles para facilitar el desarrollo a la hora de trabajar con YSI. GLOBAL_TAG_TYPES Esto es usado en el lugar de los argumentos de una funci?n, por ejemplo, "printf" esta definido as?: Code: native printf(const format[], {Float,_}:...); Usando "{Float,_}" significa que la funcion acepta un rango desde variables "Float" hasta "_" (Integers). Pero que hay de otras como "Text:", "Group:" o "Menu:". Podrias escribir as?: Code: native printf(const format[], {Float, Text, Menu, _}:...); Pero YSI incluye GLOBAL_TAG_TYPES, una definicion que permite ahorrarnos esa tarea al agregar la mayoria de tags de variables. Code: native printf(const format[], GLOBAL_TAG_TYPES:...); Que se transformaria en esto en el preprocessor: Code: native printf(const format[], {_, Language, Bit, Text, Menu, Style, XML, Bintree, Group, Timer, File, Float, Text3D}:...); PP_LOOP "PP_LOOP" es un loop preprocessor, lo que significa que genera multiples bloques de codigo, por ejemplo: Code: PP_LOOP<5>(printf("hi");)() Compilara como Code: printf("hi");printf("hi");printf("hi");printf("hi");printf("hi"); La definicion de este macro es esta: Code: PP_LOOP<veces>(texto/codigo a imprimir)(separador) Otro ejemplo de PP_LOOP: Code: PP_LOOP<10>(55)(, ) Compilaria como: Code: 55, 55, 55, 55, 55, 55, 55, 55, 55, 55 Notese la falta de ',' al final ya que no esta separando nada. __COMPILER_PASS El compilador PAWN hace dos etapas de pre-processing. Es raro que esto sea un problema, pero si necesitas saber en que etapa esta corriendo el compilador puedes hacer: Code: #if __COMPILER_PASS == 0 De manera alternativa, puedes usar: Code: #if COMPILER_1ST_PASS y_cell Esta es una libreria para una rapida manipulacion de bits en cells: Code: Cell_ReverseBits(cell); Invierte todos los bits de la cell: Ejemplo: 0b11110000000000000000000000000000 Pasa a: 0b00000000000000000000000000001111 Ejemplo: 0b10110011100011110000111110000010 Pasa a: 0b01000001111100001111000111001101 Ejemplo: 0b01010101010101010101010101010101 Pasa a: 0b10101010101010101010101010101010 Code: Cell_ReverseNibbles(cell); Invierte todos los nibbles de una cell. Ejemplo: 0x12345678 Pasa a: 0x87654321 Ejemplo: 0x010F0703 Pasa a: 0x3070F010 Ejemplo: 0xF0F0F0F0 Pasa a: 0x0F0F0F0F Code: Cell_CountBits(cell); Cuenta todos los '1' de una cell. Ejemplo: 0 Retorna: 0 Ejemplo: 1 Retorna: 1 Ejemplo: 0x01010101 Retorna: 4 Keywords La mayoria de gente sabe que YSI agrega "foreach" al lenguaje PAWN, aqui una lista de otras keywords a?adidas: task - Timer que siempre esta corriendo mientras el servidor esta encendido (y_timers) Code: task Ping[1000]() ptask - Similar a la keyword task, pero tiene el parametro de playerid. (y_timers) Code: ptask PlayerPing[1000](playerid) loadtext - Carga strings localizados en un archivo para mostrar texto (y_text) Code: loadtext core[ysi_properties]; remote - Una funcion publica que puede ser llamada desde otros scripts con verificaci?n de par?metros en la compilaci?n (y_remote) Code: remote MyFunc(a, b[]) broadcastfunc - Llama una funcion remota en todos los otros scripts (y_remote) Code: broadcastfunc MyFunc(42, "Hello world!"); inline - Declara una funci?n dentro de otra funci?n, con acceso a las variables de la funci?n (y_inline) Code: stock Outer(a) using - Pasar una funci?n de inline a otra funci?n como un callback (y_inline) Code: INI_Parse(file, using inline Local_Parse); hook - Usar un callback m?ltiples veces en m?ltiples archivos son conflicto (y_hooks) Code: hook OnPlayerConnect(playerid) global - Corriendo multiples scripts, solo uno debe cargar la funci?n. Esto declara la funci?n como global, as? todos los scripts pueden usarla pero solo uno debe cargarla. (y_master) Code: global AC_GiveWeapon(playerid, weaponid, ammo) Su diferencia con remote es que esta es solo es llamada en un script mientras que remote es llamada en todos los scripts. foreign - Informa que esa funci?n se encuentra en otro script. (y_master) Code: foreign AC_GiveWeapon(playerid, weaponid, ammo); OnScriptInit y OnScriptExit (y_serverinit) Tiene el mismo funcionamiento que OnGameModeInit/Exit o OnFilterScriptInit, una opci?n ?til para inicializar c?digo sin importar si se esta en un Filterscript o en una Gamemode. Code: public OnScriptInit() Asignaci?n din?mica de memoria (y_malloc) Usando YSI puedes alocar y liberar memoria cuando quieras: Code: main() Restringiendo conexiones (y_flooding) Puedes limitar el m?ximo de conexiones que pueden realizarse a tu servidor desde la misma IP: Code: SetMaxConnections(3); Esto permitir? que se conecten hasta 3 personas desde la misma IP. Si otra mas intenta entrar, autom?ticamente no podr?n lograr conectarse. Puedes cambiar el m?ximo y la acci?n al superar el limite. Code: SetMaxConnections(5, e_FLOOD_ACTION_BAN); Esto limitara las conexiones a 5, y si otra persona intenta entrar la IP sera baneada y los jugadores sufriran timeout.
Variables temporales A veces necesitas una variable por una fracci?n de segundo. YSI ya trae 3 variables para evitar crear mas de estas: I@, J@ y Q@[YSI_MAX_STRING]. Code: #define ReturnPlayerHealth(%0) (GetPlayerHealth((%0), Float:I@), Float:I@) Estas variables son globales, y no se puede confiar si mantiene los mismos datos luego de llamar una funci?n, as? que esto podria no funcionar: Code: J@ = 123; No hay manera de saber si FuncionAleatoria modifica el valor de J@. Funciones acortadas YSI tiene unas cuantas funciones acortadas, principalmente para utilizarlas en los macros.
Prints de desbug Si compilas tu Gamemode con alguna libreria de YSI y algun nivel de _DEBUG activo, al iniciar tu servidor YSI imprimir? informacion especifica dependiendo del nivel asignado. Code: #include <a_samp> El numero despu?s del _DEBUG es el nivel de debug. Existen 8 niveles.
Deber?as evitar utilizar el niveles 6-7, solo al iniciar el servidor ya generara unos cuantos MB de datos en el log. Para imprimir tus propios mensajes de debug usa "P:<Nivel>(Mensaje)": Code: P:5("Este mensaje sera imprimido en el nivel 5 para arriba"); Prints especiales Ademas de los 8 niveles mencionados arriba, hay algunos niveles especiales: Code: P:F("Mensaje de error fatal"); Code: P:E("Mensaje de error"); Code: P:W("Mensaje de advertencia"); Code: P:I("Mensaje de informacion"); Estos prints especiales siempre estan activos al compilar debido a que le dan informaci?n importante al usuario sobre errores en el codigo; no es solo informaci?n random de debug. De igual manera, pueden desactivarse poniendo esto en el c?digo: Code: state ysi_debug : off; Prints dinamicos Con y_debug puede usarse _DEBUG con valor -1, esto activa la posibilidad de modificar el nivel de debug en ejecuci?n, entonces, esto: Code: P:3("Message"); Compila como: Code: if (gDebugLevel >= 3) printf("Message"); Para cambiar el nivel en ejecucion, simplemente se usa esto: Code: DebugLevel(3); Colocandolo en 0 desactiva la mayoria de prints de desbug (excepto los especiales mostrados arriba). Ademas, es posible obtener el nivel de debug. Code: new nivel = DebugLevel(); Tags especiales YSI introduce dos tipos especiales de tags para funciones. Estos pueden ser utilizados para optimizar c?digos en ciertas circunstancias:
IS_IN_RANGE YSI incluye una funcion muy util para simplificar la verificaci?n de valores. Como su nombre indica, la funci?n sirve para comprobar si algo esta dentro de un rango. Code: if(IS_IN_RANGE(abc, 1, 100)) Este c?digo comprueba si abc esta entre 1 y 100, devolviendo true si esta o false si no. RUN_TIMING Esta es una manera simplificada de obtener estad?sticas al comparar dos c?digos PAWN. Code: RUN_TIMING("Version 1 ()") Imprimira algo as? en la consola: Code: Timing "Version 1 ()"... Si no sabes de estad?stica, elige la que tenga el menor "Mean", o mejor aprende estad?stica.? Hay un segundo par?metro opcional que es el numero de loops si el experimento fue muy r?pido o muy corto. Code: RUN_TIMING("Version 2 (=)", 100) Cr?ditos:
RE: [ESP] YSI Secrets - MattHudson - 2019-04-19 Hello there ?Y si pones algunas aclaraciones llamadas por #define? Tipo las que filtran algunos bucles de y_iterate, y alg?n que otro #define m?gico que anda dando vueltas por ahi. ?Y mis cr?ditos por apoyo moral al traductor? e.e RE: [ESP] YSI Secrets - Botato - 2019-04-19 Tremendo! Hay cosas que no sab?a RE: [ESP] YSI Secrets - s1cky - 2019-04-19 Interesante compi! RE: [ESP] YSI Secrets - Screw - 2019-04-20 ?Buen?simo! Gracias por tu aporte, ser? de mucha ayuda RE: [ESP] YSI Secrets - Bettz - 2019-04-21 Muy buen aporte, gracias. |