Bots

De VirtUAM-wiki
Saltar a: navegación, buscar
40x40px Esta página está actualizada a la versión OpenSim 0.7.5


Bot cliente usando OpenMetaverse

Bots o NPCs (Non Player Characters), son avatares que no están controlados por un usuario. Hay dos maneras de hacerlo: mediante funciones OS o programando un cliente que se conecte a una cuenta de usuario.

Mediante funciones OS

Opensimulator proporciona un conjunto de funciones de OS para crear y manipular bots. Una de las ventajas es que no es necesario un cliente externo y que las apariencias de bots pueden ser guardados en archivos OAR. La principal desventaja es que tiene una funcionalidad muy limitada, hay que implementar dentro del script que maneja el NPC los aspectos que se quieren controlar. Además, no se puede mover fuera de la región en la que se han creado.

Características

  • Los NPCs son controlados por scripts que deben estar en la misma región que el NPC.
  • Es recomendable que el script esté en un objeto que el NPC lleve vestido.
  • No pueden abandonar la región en la que han sido creados.
  • La apariencia puede ser leída y guardada desde un notecard que esté alojado en el mismo objeto que el script.

Configuración

En el fichero de configuración OpenSim.ini, nos dirigimos a la sección [XEngine] y nos fijamos en las variables:

  • AllowOSFunctions: Determina si se pueden usar las funciones OS (true) o por el contrario, si están desactivadas (false).
  • OSFunctionThreatLevel: Las funciones OS se agrupan por niveles de riesgo, por ello hay que poner el nivel máximo de riesgo de las funciones que usamos en el simulador. En nuestro caso usamos Severe puesto que para realizar teleports (una de las funciones más usada) es necesario dicho nivel.

<source lang="ini"> [XEngine]

   ;# {AllowOSFunctions} {Enabled:true} {Allow OSFunctions? (DANGEROUS!)} {true false} false
   ;; Allow the use of os* functions (some are dangerous)
    AllowOSFunctions = true
   ;# {OSFunctionThreatLevel} {Enabled:true AllowOSFunctions:true} {OSFunction threat level? (DANGEROUS!)} {None VeryLow Low Moderate High VeryHigh Severe} VeryLow
   ;; Threat level to allow, one of None, VeryLow, Low, Moderate, High,
   ;; VeryHigh, Severe
   OSFunctionThreatLevel = Severe

</source> En la sección [NPC] habilitamos el uso de bots. <source lang="ini"> [NPC]

   ;# {Enabled} {} {Enable Non Player Character (NPC) facilities} {true false} false
    Enabled = true

</source>

Creando el bot

Veamos mediante un ejemplo, la creación y control básico de un NPC a través de funciones OS. <source lang="lsl2"> // Tocar el objeto para crear un NPC clon del avatar que lo toca // el NPC se moverá hacia el que lo tocó, luego le saludará. // Tocar de nuevo para eliminar el bot.

key npc; vector toucherPos;

default {

   touch_start(integer number)
   {
       // Posición en la que aparecerá el NPC.
       vector npcPos = llGetPos() + <1,0,0>;
       // Esta función guarda los datos de la apariencia serializada en notecard del inventario del objeto.
       osAgentSaveAppearance(llDetectedKey(0), "apariencia");
       // Se puede usar directamente el UUID del avatar en osNpcCreate, pero la aparciencia no persistirá.
       // Creamos el NPC
       npc = osNpcCreate("SoyTu", "Clon", npcPos, "apariencia");
       toucherPos = llDetectedPos(0);
       state hayNPC;
   }

}

state hayNPC {

   state_entry()
   {
       // Función para mover el NPC hacia el avatar que tocó el objeto.
       osNpcMoveTo(npc, toucherPos + <3,0,0>); 
       // Envía un mensaje por chat desde el NPC.
       osNpcSay(npc, "Hola! Mi nombre es " + llKey2Name(npc));
   }

   touch_start(integer number)
   {
       osNpcSay(npc, "Adios!");
       // Elimina el bot.
       osNpcRemove(npc);
       npc = NULL_KEY;
       state default;
   }

} </source> En la wiki oficial de OpenSim se puede encontrar información más detallada de todas las funciones relacionadas con NPCs que hay implementadas.

Mediante cliente

Este método necesita crear un programa aparte que se conecte a una cuenta de usuario ya creada y controle el avatar-

Introducción

El lenguaje de programación usado es C#, orientado a objetos como Java, para programar en este lenguaje podemos usar Visual Studio o Virtual C# Express. Para comenzar necesitamos unas librerías que se han habilitado para que los futuros bots puedan conectarse al simulador y realizar acciones dentro de él, estas librerías las proporciona OpenMetaverse.

40px  Descarga la última versión de las librerías OpenMetaverse

LibOpenMetaverse es una librería .NET basada en cliente/servidor que se utiliza para el acceso y la creación de mundos virtuales en 3D. La librería mantiene la compatibilidad con el protocolo de Second Life y se puede utilizar para la creación de clientes y autómatas en Second Life, OpenSim o de otros mundos virtuales que utilizan el protocolo de Second Life. OpenMetaverse es compatible con Microsoft. NET Framework 2.0 y versiones posteriores y Mono 1.9 o más reciente.

Preparando el proyecto

Una vez tenemos el entorno de desarrollo y las librerías, comenzamos a preparar nuestro proyecto:

  1. Creamos un nuevo proyecto de tipo consola.
  2. Agregamos las siguientes referencias al proyecto : OpenMetaverse.dll y OpenMetaverseTypes.dll. Estos archivos de las librerías OpenMetaverse.
  3. Dentro del proyecto tenemos que copiar los siguientes archivos de las librerías:
    • En el directorio bin copiamos la carpeta openmetaverse_data.
    • Y también copiamos en ese mismo directorio uno de estos archivos, según nuestro sistema operativo:
- openjpeg-dotnet.dll (Windows/.NET y Windows/Mono)
- openjpeg-dotnet-x86_64.dll (versiones 64-bit de Windows)
- libopenjpeg-dotnet-2.1.3.0-dotnet-1.dylib (Apple OSX/Mono)
- libopenjpeg-dotnet-2.1.3.0-dotnet-1-i686.so (Linux/Mono 32bit)
- libopenjpeg-dotnet-2.1.3.0-dotnet-1-x86_64.so (Linux/Mono x86_64)

Programando el bot

Veamos un ejemplo sencillo y comentemos el código: <source lang="csharp"> using System; using System.IO; using System.Collections.Generic; using System.Text; using OpenMetaverse; // Importamos la librería.

namespace Bot {

   class Program
   {
       // Creamos una variable de tipo GridClient, que contiene todas las funciones, clases
       // y eventos necesarios para la funcionalidad del bot.                                           
       public static GridClient client = new GridClient();
       // Parámetros de conexión.  
       private static string first_name = "Primer";
       private static string last_name = "Bot";
       private static string password = "password";
       private static string servidor = "http://150.244.58.90:8002/";
       public static void Main()
       {
           //Activamos control de eventos de chat publico y mensajes instantaneos
           client.Self.ChatFromSimulator += new EventHandler<ChatEventArgs>(Self_ChatFromSimulator);
           client.Self.IM += new EventHandler<InstantMessageEventArgs>(Self_IM);
           // Posición inicial y servidor para el login.
           string startLocation = NetworkManager.StartLocation("Nombre_region", 128, 128, 28);
           client.Settings.LOGIN_SERVER = servidor;
           // Conectamos el bot.
           client.Network.Login(first_name, last_name, password, "Mi Bot cliente", startLocation, "v1.0");
           Console.WriteLine("El bot está conectado.");
           // Saluda por chat.
           client.Self.Chat("Hola!", 0, ChatType.Normal);
           // Espera seis segundos, dice adiós y se desconecta.
           System.Threading.Thread.Sleep(6000);
           client.Self.Chat("Adiós!", 0, ChatType.Normal);
           client.Network.Logout();
       }
       // En esta parte establecemos lo que se hace cuando se lanzan los eventos.
       static void Network_OnConnected(object sender)
       {
           Console.WriteLine("El bot está conectado.");
       }
       static public void Self_ChatFromSimulator(object sender, OpenMetaverse.ChatEventArgs e)
       {
           //Operaciones para tratar los mensajes por chat público.             
       }
       static void Self_IM(object sender, InstantMessageEventArgs e)
       {
           //Operaciones para tratar los mensajes privados.
       }
   }

} </source>

40px   Consulta el API de OpenMetaverse para más información acerca de clases, funciones ...


De esta manera hemos conseguido programar un bot sencillo, si quieres consultar más ejemplos visita el portal de desarrollo de OpenMetaverse.