miércoles, 17 de septiembre de 2008

Algunas macros utiles en Sindarin

Macro para separar ores y quemarlos sobre la marcha:

Location vetas_minerales = [775, 440];
Location veta_mineral = [709, 476];
Location veta_mineral_para_quemar = veta_mineral - [0, 5] + [4,0];
number cant_minerales = 196;

repeat (cant_minerales - 3)
{
drag 1 vetas_minerales veta_mineral
}

repeat (cant_minerales - 3)
{
dclick left veta_mineral_para_quemar
wait 1
wait 400 msec
}

Y ahora con muchos comentarios que explican el funcionamiento:

# En esta localizacion tenemos los ores agrupados
Location vetas_minerales = [775, 440];

# En esta localizacion tenemos el sitio donde se pondran los minerales de 1 en 1
Location veta_mineral = [709, 476];

# Esta localizacion apunta a los minerales sueltos para ir quemando
# se calcula en las proximidades a la veta de mineral
Location veta_mineral_para_quemar = veta_mineral - [0, 5] + [4,0];

# El numero de minerales que vamos a separar quemar
number cant_minerales = 196;

# Aqui comprobamos que las localizaciones estan bien puestas
# descomentando el exit que esta mas abajo, tambien podemos mover un mineral para asegurarnos
mousemove vetas_minerales
wait 1
mousemove veta_mineral
wait 1
mousemove veta_mineral_para_quemar
#drag 1 vetas_minerales veta_mineral
#exit

# Separar la cantidad de ores menos 3, ya q cuando hay - de 3 vetas el objeto
# cambia de forma y se puede perder la localizacion
repeat (cant_minerales - 3)
{
drag 1 vetas_minerales veta_mineral
}

# Se queman tantos minerales como se han separado
repeat (cant_minerales - 3)
{
dclick left veta_mineral_para_quemar
wait 1 # espera un segundo
wait 400 msec # y 400 milisegundos
}

Todos los comentarios son explicativos y las pruebas no son necesarias, pero si utiles.


La típica macro de repetir constantemente la tecla F1:

wait 1 # Esperamos 1 segundo por si acaso
while true # Repetimos para esto para siempre
{
pkey 'f1' # Pulsa f1
wait 8 # esperamos 8 segundos hasta volver a pulsar
}



Tipica macro de construccion de dagas (o cualquier otro objeto):

Location armas = [250, 100];
Location flecha = [267, 92];
Location lejos = [500, 500];
Location arma = [90, 87]
Location tipo = [80, 87];

wait 1

repeat (40/3)
{
pkey 'F1'
wait 1

repeat 2
{
click left flecha
wait 1
mousemove lejos
}

dclick left armas
wait 1
dclick left tipo
wait 1
dclick left arma
wait 4
}


La misma con comentarios que explican el funcionamiento:

Location armas = [250, 100];
Location flecha = [267, 92];
Location lejos = [500, 500];
Location arma = [90, 87] # dagas
Location tipo = [80, 87]; # dagas

wait 1

# Intenta construir tantas dagas como pueda con 40 lingotes, suponiendo que
# se necesitan 3 lingotes por daga
repeat (40/3)
{
pkey 'F1' # Macro en ultima de lastobject, lasttarget
wait 1

# En el menu de herreria, hay que pulsar 2 veces(esto varia segun el server) sobre
# la flecha de la derecha para llegar a las armas de swordmanship
repeat 2
{
click left flecha
wait 1
mousemove lejos # x si sale el cuadrado negro explicativo
}

dclick left armas # Doble click sobre el menu de construccion de armas
wait 1
dclick left tipo # Doble click sobre armas de sword
wait 1
dclick left arma # Doble click sobre menu de las dagas
wait 4 # Esperamos 4 segundos, que acumulados a los que esperamos
# que al sumarse con los segundos que se espera para navegar
# de menu en menu son 9 segundos entre daga y daga
}



Macro para aplicar vendas de vez en cuando, que ademas comprueba que hora es y si son mas de las 11:30 de la mañana apaga el Uo y detiene el script:

number hora,minutos,segundos;
wait 1 sec
while true
{
time (hora,minutos,segundos);
if ((a >= 11) && (b >= 30))
{
wait 4
pkey 'alt'+'f4'
wait 1
exit
}
pkey 'f5'
wait 20
}


Y ahora con extras y explicaciones añadidas:


number hora,minutos,segundos; # Para guardar la hora
wait 1 sec
while true # Repetimos para siempre(o hasta q paremos el script)
{
time (hora,minutos,segundos); # Almacenamos la hora en las variables

# Mostramos la hora en la consola de mensajes
print "Son las " + hora+":"+minutos+":"+segundos

# Si son las 11:30 o mas tarde
if ((a >= 11) && (b >= 30))
{
beep # Hacemos sonar un beep
wait 4
pkey 'alt'+'f4' # Pulsamos Alt+F4 lo que cerrara el UO a lo bestia
wait 1
exit # Terminamos de ejecutar el script
}
pkey 'f5' # F5 es una macro lastobject-targetself
# que nos abremos acordado de aplicar vendas
# antes de empezar
wait 20 # Esperamos 20 segundos antes de volver a aplicar
}

6 comentarios:

  1. En "http://anphoralhrod.blogspot.com.es/2008/08/sobre-la-ventana-de-sindarin.html", comenta "The Mister Ec":

    hay alguna forma de hacer barridos con el puntero hasta que encuentre un color x?
    Alguna sugerencia

    Mi respuesta fue:

    Si, aunque supongo que hay formas mas eficientes la mas evidente es usar dos bucles uno para la X y otro para Y, mientras dentro del bucle capturas el color del pixel actual y lo comparas con el que estas buscando.

    Perdona por tardar tantísimo en responder :P

    De todas formas moví el tema de Sindarin a mí otro blog de cosas que hago que es este:

    http://laantiguafragua.blogspot.com.es/

    Concretamente la sección de Sindarin es esta:

    http://laantiguafragua.blogspot.com.es/search/label/Sindarin
    La macro que buscas seria + o - así:

    -----------------------------------
    Location actualPixel = [0, 0] # Empieza en el punto 0, 0
    repeat 10
    {
    repeat 10
    {
    Color actualColor = color actualPixel
    if (actualColor == [255, 0, 0])
    {
    print "Encontre el rojo"
    exit
    }
    actualPixel = actualPixel + [0, 1] # Bajamos una linea
    }
    actualPixel = actualPixel + [1, 0] # Movemos un pixel hacia la derecha
    }
    -----------------------------------

    Este script recorrería una zona cuadrada de 10x10 pixel de pantalla buscando el color rojo puro, hasta encontrarlo o salir, si lo encuentra enseña el mensaje "Encontre el rojo" y luego termina. Y la búsqueda seria desde el pixel [0, 0] hasta el [9, 9], rastreando desde arriba hacia abajo y luego pasando a la siguiente línea vertical. -->Esto funciona pero sera bastante lento<--.

    De todas formas preferiría que me preguntaras sobre Sindarin aquí:

    http://laantiguafragua.blogspot.com.es/search/label/Sindarin

    Y que tengas en cuenta que ahora mismo estoy dedicado a otras cosas, lamentablemente el sindarin no trajo como yo pensaba gente que quisiera desarrollarlo por su cuenta ni nada, así que finalmente hice en solitario con su desarrollo hasta que lo he tenido que dejar de lado para poder hacer otras cosas. Aun así gracias por preguntar, siempre es agradable ver que aun alguien lo usa.

    ResponderEliminar
  2. Esto lo tienes ya abandonado por completo no? Me surgen algunas dudas a la hora de echarlo a funcionar que me gustaría intentara ayudarme

    ResponderEliminar
    Respuestas
    1. Hola, La verdad es que hace mucho que no tengo tiempo para Sindarin, en su tiempo libere el código por si alguien quería seguirlo o mejorarlo. Pero finalmente nadie se atrevió :P. Bueno cuéntame cual es tu problema quizás pueda ayudarte o quizás no.

      Eliminar
    2. Buenas de nuevo y perdon que tardara en contestar, ando de examenes...jajaja

      Ante todo gracias por dedicarme un poco de tiempo a pesar de ser algo que tienes olvidado, se agradece. Pues bien, estoy probando funciones basicas para a partir de ahi posteriormente crear macros mas complejas, pero con lo de detectar color me da un problema. La intencion de esta macro no es mas que detectar donde esta el banco dentro de un cuadrado definido de 65*40 y que cuando lo detecte le haga doble click a ese color, pero no se si me equivoco en algo, a continuacion le adjunto como seria la prueba que me da error:
      Location actualPixel = [373, 256] # Empieza en el punto 0, 0
      repeat 40
      {
      repeat 65
      {
      Color actualColor = color actualPixel
      if (actualColor == [16, 16, 16])
      {
      dclick left color actualPixel
      exit
      }
      actualPixel = actualPixel + [0, 1] # Bajamos una linea
      }
      actualPixel = actualPixel + [1, 0] # Movemos un pixel hacia la derecha
      }

      Y el error que me dice es el siguiente:
      ERROR de sintaxis script:

      Sindarin.ScriptParser.ParseException: Encountered " "color" "Color "" at line 6, column 1.

      La verdad que lo coji de una que tu dejaste aqui a otro player que te dijo algo similar y adapte a lo que yo quiero que recoja y que haga posteriormente. Si tiene tiempo mirelo y digame algo, pero entiendo que no es algo a lo que ya le dediques tiempo jeje

      Un saludo y gracias nuevamente

      Eliminar
  3. Bueno, la verdad es que he tenido que mirarlo porque ya no me acordaba :P... Bueno por lo visto cuando diseñe el Sindarin establecí que todas las declaraciones de variables fuesen al principio de la macro, supongo que por sencillez en el diseño, así que donde tienes la linea:

    ----------------------------------------------------------------------------------
    Color actualColor = color actualPixel
    ----------------------------------------------------------------------------------

    La tendrías que dividir en 2 lineas separadas, la primera que iría al principio de la macro por ejemplo debajo del Location, tal que así:

    ----------------------------------------------------------------------------------
    Location actualPixel = [373, 256] # Empieza en el punto 0, 0
    Color actualColor
    ----------------------------------------------------------------------------------

    Y dentro de los bucles pondría algo así:

    ----------------------------------------------------------------------------------
    actualColor = color actualPixel
    ----------------------------------------------------------------------------------


    Y ese es todo el problema que tienes con el Color.

    En la linea:

    ----------------------------------------------------------------------------------
    dclick left color actualPixel
    ----------------------------------------------------------------------------------

    Te sobra el color. Por lo que corregido todo el tema la macro quedaría mas o menos así:

    ----------------------------------------------------------------------------------
    Location actualPixel = [373, 256] # Empieza en el punto 0, 0
    Color actualColor
    repeat 40
    {
    repeat 65
    {
    actualColor = color actualPixel
    if (actualColor == [16, 16, 16])
    {
    dclick left actualPixel
    exit
    }
    actualPixel = actualPixel + [0, 1] # Bajamos una linea
    }
    actualPixel = actualPixel + [1, 0] # Movemos un pixel hacia la derecha
    }
    ----------------------------------------------------------------------------------

    Espero que te sirva de ayuda ;)

    ResponderEliminar
    Respuestas
    1. P.D.- Es verdad que en la macro a la que respondí + arriba yo mismo puse lo de

      Color actualColor = color actualPixel

      en medio del código, fallo mio...

      Eliminar