Saltar al contenido

-EnzoMetlc-

Usuario
  • Contenido

    29
  • Ingreso

  • Última visita

  • Días ganados

    1

Todo lo publicado por -EnzoMetlc-

  1. Te hago todo el código y también quieres que te busque las cosas cuando tú podrías hacerlo en 1 segundo?? Yo no soy tan paciente, pero bueno. http://wiki.sa-mp.com/wiki/OnPlayerKeyStateChange http://wiki.sa-mp.com/wiki/IsPlayerInAnyVehicle http://wiki.sa-mp.com/wiki/AddVehicleComponent PD: te recomiendo ir a un foro en donde se enfoquen en PAWN, el mejor que te recomiendo es Forum SA-MP: http://forum.sa-mp.com/forumdisplay.php?f=29.
  2. Entonces añádela: public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) // Es llamada cuando un jugador pulsa una tecla. { if(newkeys & KEY_FIRE) // Si la tecla es 'Click'. { if(IsPlayerInAnyVehicle(playerid)) // Si el jugador está dentro de cualquier vehículo. { AddVehicleComponent(GetPlayerVehicleID(playerid), 1010); // Añadimos el componente número 1010 (Nitro). } } return 1; } Te recomiendo buscar las funciones en la Wiki para aprender más de ellas.
  3. No le veo nada raro. Seguro que está en 'OnPlayerKeyStateChange'?
  4. Se supone que también deberías pasarme el código de dicha línea, o sino me es imposible saber el error que tiene...
  5. Cuál es la línea en donde te da el error?
  6. Sí, ya sé. Con sscanf me refiero a esto: http://forum.sa-mp.com/showthread.php?t=120356.
  7. Fácil. En 'OnPlayerKeyStateChange' pon esto: if(newkeys & KEY_FIRE) // Si la tecla es 'Click'. { if(IsPlayerInAnyVehicle(playerid)) // Si el jugador está dentro de cualquier vehículo. { AddVehicleComponent(GetPlayerVehicleID(playerid), 1010); // Añadimos el componente número 1010 (Nitro). } } Un saludo.
  8. Utilizas sscanf?
  9. Sacas las coordenadas que deseas, luego creas el comando, y dentro de los comandos utiliza http://wiki.sa-mp.com/wiki/SetPlayerPos.
  10. Claro. Como he dicho actúa como 'if'. Supón que lo que está entre el '?' y ':' es una if: if(Valor == 5) Valor = 3; Y la otra parte es 'else': else if(Valor == 3) Valor = 5; Con dicho operador sería lo mismo, pero más optimizado: /*if(*/Valor ?/*==*/ (5)/*El valor que deseamos que tenga*/ :/*else*/ (3)/*Ahora el valor de 'Valor' es 3*/; // Pruébalo en el Pawno para distinguirlo mejor. Si lo hacemos con 'if' y 'else': if(Valor == 5) Valor = 4; // Un ejemplo. else Valor = 3; Otro ejemplo: new a = random(5); a = (a == 3) ? (5) : (4); // A 'a' le queremos asignar un valor. // Si el valor de 'a' es '3'. // Ahora el valor de 'a' será '5'. // Si el valor de 'a' no fue '3', su valor ahora será '4'. No es tan complicado, pero si sigues teniendo dudas no dudes en decírmelo.
  11. Las estructuras de control en PAWN son primordiales a la hora de usarlos en un script. Existen varias estructuras, entre ellas: if, else, else if, switch y ? (operador terciario). if Verifica si una variable tiene 'X' valor. Ejemplo: new Valor = random(3); // Creamos la variable 'Valor' y le asignamos un valor random entre el '0-2'. if(Valor == 2) print("* El valor de 'Valor' es: 2."); Dicha condicional acepta los siguientes operadores: [Operador] [significado] [uso] == Verifica si el valor de una variable es igual a... if(Valor1 == Valor2) <= Verifica si el valor de una variable es igual o menor a... if(Valor1 <= Valor2) >= Verifica si el valor de una variable es igual o mayor a... if(Valor1 >= Valor2) < Verifica si el valor de una variable es menor a... if(Valor1 < Valor2) > Verifica si el valor de una variable es mayor a... if(Valor1 > Valor2) != Verifica si el valor de una variable no es igual a... if(Valor1 != Valor2) else Verifica si la condición anterior a él no se cumplió. Ejemplo: if(Valor == 2) print("* El valor de 'Valor' es: 2."); else print("* El valor de 'Valor' no es: 2."); else if Hace otra verificación si la condicional anterior a él no se cumplió. Ejemplo: if(Valor == 2) print("* El valor de 'Valor' es: 2."); else if(Valor == 1) print("* El valor de 'Valor' es: 1."); switch Trabaja más rápido que 'if', ya que digamos que 'If lee uno por uno hasta llegar a su valor, pero switch va directo al valor (Es mejor buscar en el índice que página por página). Ojo, dicha estructura sólo trabaja con constantes. Ejemplo: new Valor = random(3); // Creamos la variable 'Valor' y le asignamos un valor random entre el '0-2'. switch(Valor) { case 0: print("* El valor de 'Valor' es: 0."); case 1: print("* El valor de 'Valor' es: 1."); case 2: print("* El valor de 'Valor' es: 2."); } También trabaja con binarios. Otros ejemplos son: new Valor = (random(3) ? ('A') : ('B'); // Creamos la variable 'Valor' y le asignamos un valor random entre 'A-B'. switch(Valor) { case 'A': print("* El valor de 'Valor' es: A."); case 'B': print("* El valor de 'Valor' es: B."); } //==== new bool:Valor = (random(2) ? (true) : (false); // Creamos la variable 'Valor' y le asignamos un valor random entre el 'true-false'. switch(Valor) { case true: print("* El valor de 'Valor' es: true."); case false: print("* El valor de 'Valor' es: false."); } Esta estructura también tiene otra expresión llamada 'default' que verifica si ninguna de las anteriores verificaciones eran ciertas. Ejemplo: new Valor = random(50) // Creamos la variable 'Valor' y le asignamos un valor random entre '0-49'. switch(Valor) { case 34: print("* El valor de 'Valor' es: 34."); case 22: print("* El valor de 'Valor' es: 22."); default: print("* El valor de 'Valor' no es ni '34' y ni '22'."); } ? Actúa como la condicional 'if'. Con este operador podemos acortar códigos y hacerlo más fácil. Ejemplo: new bool:Valor = (random(2) ? (true) : (false)); if(Valor == true) print("* El valor de 'Valor' es verdadero."); else if(Valor == false) print("* El valor de 'Valor' es falso."); Eso es poco eficaz, con dicho operador podríamos acortar el código y hacerlo de esta manera: new bool:Valor = (random(2) ? (true) : (false)); printf("* El valor de 'Valor' es %b.", Valor ? (true) : (false)); Lo que está entre el '?' y el ':' es lo que devolvería si la condición es verdadera, la otra parte es lo que devolvería si es falsa. _____________________ Eso fue todo, cualquier duda o error relacionado con el tópico házmelo saber! Saludos.
  12. Sólo mencioné que su código está mal, no le veo lo malo de corregir a los demás. Es lo mismo hacer estas 2 cosas: for(new i = 0; i != GetMaxPlayers(); i++) for(new i = 0; i < GetMaxPlayers(); i++) Crees que eso está bien? Prueba esto y dime hasta dónde llegó el valor: for(new i = 0; i < GetMaxPlayers(); i++) { printf("Valor de 'i': %i.", i); } PD: No es para dármelas de pro, lo contrario, yo siempre intento enseñar, y de que los demás aprendan. No aclaro que yo sé todo, pero yo trato de enseñar todo lo que sé.
  13. Si dices eso, ¿para qué le das el código completo en vez de al menos explicarle algo? En verdad, algunas veces, es mejor dar un código completo para que el autor se guíe de dicho código para así aprender en próximas ocasiones. Además, tu código está mal. Sería así: for(new i = 0; i <= GetMaxPlayers(); i++) // Un bucle que recorrerá a todos los jugadores. { if(IsPlayerConnected(i)) // Si 'i' es la ID de un jugador conectado. { if(EnEvento[i] != 0) // Si el valor de 'i' no es igual a 0. { SpawPlayer(i); // Respawneamos al jugador que haya cumplido con las anteriores condiciones. EnEvento[i] = 0; // Le damos el valor a '0'. } } } Es un poco menos de iteracciones y la diferencia es mínima, pero siempre hay que buscar la manera más optimizada de hacer las cosas. PD: Si quieres algo más rápido que un bucle, te recomiendo y_iterate de Y_Less: http://forum.sa-mp.com/showthread.php?t=92679&highlight=foreach.
  14. Es algo sencillo: // El cuerpo de tu comando. if(EnEvento[playerid] != 0) return SendClientMessage(playerid, -1, "* No estás en un evento!"); // Si no está en un evento o minijuego (úsalo para que no abusen). else // De lo contrario. { SpawPlayer(playerid); EnEvento[playerid] = 0; SendClientMessage(playerid, -1, "* Saliste de un evento."); } // Otras cosas si deseas... Recuerda cambiar 'EnEvento' a la variable que usas para los eventos.
  15. Mmmm. Vi que usaste '#pragma unused params', con eso declaras que 'params' no servirá o no tendrá valor al ejecutar el código, y sí usas 'params' para el código. Quita esa directiva e inténtalo otra vez.
  16. Bueno, si no te da errores está genial! Ahora funciona tu comando?
  17. Esa función.
  18. Me faltó mencionarte de que debes poner la función al comienzo de tu GM/FS, o antes de donde lo uses. Así no te lanzaría errores.
  19. No estoy seguro de qué dices, pero sí de que tu función no funcionaría. Sería algo así: stock bool:IsAdmin(playerid,nivel) { if(pInfo[playerid][NivelAdmin] >= nivel) return bool:true; else return bool:false; } Creo que así funcionaría.
  20. http://forum.sa-mp.com/showthread.php?t=418751 - Tutorial http://forum.sa-mp.com/showthread.php?t=166160 - Include de Anti-Cheat de vida. Fíjate si te sirve.
  21. Picar? A qué te refieres?. One ya me lo aclaró todo por Skype jaja, fue un pequeño mal entendido mío y ya me disculpé con él. Saludos.
  22. Tus besos crearon celdas, difíciles de escapar, imposibles de derribarlas!

    1. Doublenutshoot

      Doublenutshoot

      Pero mis celdas son de madera, que no te dije en el sotano?

    2. -EnzoMetlc-
  23. Esta es una guía compleja de improvisaciones que conozco para mejorar nuestro servidor. (Y para entrar un poco más en la comunidad). Comencemos: Timers Algo que siempre sube el Ping en nuestro Servidor, ya que SA-MP corre en un hilo, y un timer ejecutándose hace correr a ese hilo un poco mas lento. Les daré formas de como evitar usar muchos. Timer's por restricciones Si usamos Timer's por restricciones, me refiero a que un usuario no pueda realizar 'X' acción/comando por un determinado momento, un Timer no es la mejor opción. Una manera de solucionarlo es usando el include de DesingMyCry: http://forum.sa-mp.com/showthread.php?t=439112. Es %100 recomendable usarlo, ya que no hay necesidad de usar Timer's para verificar si el tiempo de una acción pasó o no. (Ya que usa las nativas de SA-MP. ('gettime')). Rejas en movimiento Es raro que en un Servidor no se usen Rejas en movimiento; normalmente usan un timer para volver a cerrar la reja, pero hay una callback que podría solucionar ese problema: http://wiki.sa-mp.com/wiki/OnObjectMoved - Es llamada cuando un objeto termina de moverse. Celdas Formatear muchas celdas innecesarias usan muchos recursos y hace una compilación más lenta. Recomiendo que cuenten la cantidad de celdas para no usar tantas, un ejemplo sería: No recomendado: new string[144]; format(string, sizeof(string), "* Tus datos principales: %s[%d].", GetName(playerid), playerid); SendClientMessage(playerid, -1, string); Recomendado: new string[55]; format(string, sizeof(string), "* Tus datos principales: %s[%d].", GetName(playerid), playerid); SendClientMessage(playerid, -1, string); Qué hice ahí? Fue bajar la cantidad de celdas y ocupar sólo las necesarias. Nota: Tengan en cuenta que si formatean el Nick del Jugador, deben aregarle '+24' celdas a la matriz/array. Nota 2: Los Hexadecimales almacenan '+8' caracteres. (Escribiendo el Hexadecimal entero). Nota 3: Deben agregar '+1' celda por el caracter nulo. Macros y funciones Las funciones (stock) bajan la velocidad de compilación si no se optimizan bien. Un ejemplo en Dini que se puede apreciar es: stock dini_Exists(filename[]) { return fexist(filename); } stock dini_Remove(filename[]) { return fremove(filename); } Cuando podría ser: #define dini_Exists fexist #define dini_Remove fremove Ya que los macros son compilados por el pre-compilador. Este es sólo una partecita del tutorial, en breve lo iré actualizando. Si vieron algo mal, o tienen dudas posteenlo aquí. Saludos.
  24. 'EnzoMetlc'. Hice esta cuenta ya que a la anterior he perdido la contraseña... ...lo reporté a Shadow pero aún así no logro recuperarla. Saludos.
×
×
  • Crear nuevo...