Utiliser un robot pour envoyer un avatar vers un autre âge que celui où il se trouve
2 participants
Page 1 sur 1
Utiliser un robot pour envoyer un avatar vers un autre âge que celui où il se trouve
Certaines personnes m'avaient demandé s'il était possible que MagicBot puisse les envoyer dans les 3 âges publiques et ce, sans devoir passer par le Nexus.
Il s'agissait, en soi, d'un nouveau défi que je me devais de relever
L'idée était donc de pouvoir utiliser le robot pour qu'il envoie dans un autre âge celui qui lui demande et cela quelle que soit sa position.
Pour que cela fonctionne, il faut trois conditions:
1. Que l'avavatar demande au robot de l'envoyer dans cet âge.
1. Que le robot soit connecté
2. Qu'il ait déjà visité l'âge en question, et plus précisément, dans ma méthode, qu'il soit le propriétaire (owner).
Mais comment est-il possible d'être le "propriétaire" d'un âge publique me direz-vous ?
Il s'agit d'une traduction toute relative de l'anglais, car propriétaire doit être compris dans le sens utilisateur et non comme m'appartenant en propre.
La méthode que j'utilise fait appel à la fonction Plasma.ptVault().getAgesIOwnFolder()
Elle retourne le répertoire des âges de l'avatar qui utilise cette méthode. (Donc du robot)
Je réalise donc une première fonction que j'appelle ChercheAge (nomage) dont voici le code :
Cette fonction va imprimer à l'écran la liste des noms des âges (nom du fichier et nom de l'instance) trouvés dans le répertoire "owner" de l'avatar qui lance cette commande (donc de mon robot ). En outre, si l'âge passé en argument a été trouvé dans ce répertoire, elle retourne le AgelinkStruct de cet âge qui me sera nécessaire dans la seconde fonction.
Si vous venez de créer un nouvel avatar qui vous servira de robot pour cette commande, et que vous lancez ChercheAge(), vous ne serez pas surpris de constater que très peu d'ages seront listés : city qui est la ville publique, Nexus et Neighborhood (votre quartier).
Moi, je veux que le robot puisse envoyer quelqu'un en ville publique (city), à Kirel (Neighborhood02) et Watcher's pub (GreatTreePub).
Pour la ville publique c'est ok, mais, mon avatar robot ne possède pas encore Kirel ni Watcher's Pub.
C'est ici que j'utilise une commande de la console Plasma de Plclient : Net.Vault.RegisterOwnedAge, qui me permet d'enregistrer dans le répertoire owner de mon avatar les âges qui me manquent et ce, sans devoir le faire dans le jeu.
Je tape donc dans la console Plasma de Plclient de mon avatar Robot :
Net.Vault.RegisterOwnedAge Neighborhood02
Net.Vault.RegisterOwnedAge GreatTreePub
Me voila donc "propriétaire-utilisateur" de ces deux âges.
Si je retape dans ma console Python de Plclient de mon robot la commande ChercheAge(), je vais avoir ces deux âges en plus dans ma liste des âges de mon répertoire owner.
Maintenant, il n'y a plus qu'à écrire la seconde fonction qui va envoyer un autre avatar vers l'un de ces âges. Celle-ci, je l'ai baptisée : EnvoyerIDVers(NomAge, IDavatar), dont voici son code :
La fonction fait appel à ma première fonction ChercheAge et à la fonction linkPlayerToAge de la classe ptNetLinkingMgr du module Plasma de Python. NomAge est le nom de fichier de l'âge où le robot doit envoyer l'avatar dont le numéro de KI est ID.
Donc, lorsque un avatar dont le numero de KI est, par exemple 5467898, enverra, la commande Vers ville, le robot va interpréter cela comme l'odre de l'envoyer à la ville publique et va donc lancer la commande : EnvoyerIDVers('city',5467898).
Voilà.
Il s'agit d'une solution. Peut-être en connaissez-vous une autre pour obtenir le même résultat...
Ici, l'envoi est sans limite, il suffit que le robot possède dans le répertoire owner l'âge désiré et il sera capable d'envoyer n'importe qui là où il le veut.
Première parenthèse:
Je vous ai dit que l'avatar pouvait être n'importe où pour être téléporté par le robot vers l'âge désiré , pour autant que le robot soit connecté. C'est exact mais il faut, tout comme pour se relier à l'âge où se trouve le robot, que la commande placée dans le xKI du robot soit du style : if "Vers ville" in message : et non pas if message == "Vers ville", car souvenez-vous de ce que je vous ai déjà expliqué, lorsqu'on envoie un message en chat privé à un avatar, alors qu'on ne se trouve pas dans le même âge que lui, le message est toujours précédé de l'âge où l'on se trouve et donc if message == "Vers ville" ne fonctionne que si les deux avatars sont dans le même âge, alors que avec if "Vers ville" in message, Python regarde simplement si "Vers ville" est contenu dans la variable message.
Ceci m'amène à une autre parenthèse importante.
L'utilisation de if ... in demande de bien placer cette instruction dans le xKI.py du robot. pourquoi ?
Imaginons que j'utilise mot cléf "link" pour relier un avatar à l'age du robot et que j'utilise l'expression "link city" pour que le robot envoie un avatar vers la ville publique.
Les deux mots-cléf utilisent la même instruction : if...in...
Quelle instruction dois-je mettre en premier dans la liste d'interprétation de mots-cléf du robot ?
Réponse : celle qui a le mot clé le plus long, donc ici celle qui possède if "link city" in message : et seulement après : elif "link" in message:
Pourquoi ? Tout simplement parceque en faisant l'inverse, le mot link étant inclu dans la variable message, c'est cette instruction qui sera exécutée et pas la suivante !
Donc retenez que si vous utilisez if..in plusieurs fois dans un bloc d'instructions avec des arguments similaires, il faut toujours se demander si les termes utilisés ne pourront pas être interprétés par le programme avant l'endroit où l'on veut qu'ils le soient;). C'est pourquoi, je préfère utiliser des mots-cléf différents.
Il s'agissait, en soi, d'un nouveau défi que je me devais de relever
L'idée était donc de pouvoir utiliser le robot pour qu'il envoie dans un autre âge celui qui lui demande et cela quelle que soit sa position.
Pour que cela fonctionne, il faut trois conditions:
1. Que l'avavatar demande au robot de l'envoyer dans cet âge.
1. Que le robot soit connecté
2. Qu'il ait déjà visité l'âge en question, et plus précisément, dans ma méthode, qu'il soit le propriétaire (owner).
Mais comment est-il possible d'être le "propriétaire" d'un âge publique me direz-vous ?
Il s'agit d'une traduction toute relative de l'anglais, car propriétaire doit être compris dans le sens utilisateur et non comme m'appartenant en propre.
La méthode que j'utilise fait appel à la fonction Plasma.ptVault().getAgesIOwnFolder()
Elle retourne le répertoire des âges de l'avatar qui utilise cette méthode. (Donc du robot)
Je réalise donc une première fonction que j'appelle ChercheAge (nomage) dont voici le code :
- Code:
def ChercheAge(nomage=''):
"""Recherche les ages du joueur actif et retourne, éventuellement, le AgelinkStruct de l'age passe en argument"""
trouve = None
vault=ptVault()
ages=vault.getAgesIOwnFolder()
#ages=vault.getAgesICanVisitFolder()
agefolderRefs=ages.getChildNodeRefList()
for agefolderRef in agefolderRefs:
agefolder=agefolderRef.getChild()
agefolder=agefolder.upcastToAgeLinkNode()
if type(agefolder) != type(None):
info = agefolder.getAgeInfo()
nom=info.getAgeFilename()
instance = info.getAgeInstanceName()
print nom+' '+instance
if nom == nomage:
trouve = agefolder.asAgeLinkStruct()
if type(trouve) != type(None):
return trouve
else:
return None
Cette fonction va imprimer à l'écran la liste des noms des âges (nom du fichier et nom de l'instance) trouvés dans le répertoire "owner" de l'avatar qui lance cette commande (donc de mon robot ). En outre, si l'âge passé en argument a été trouvé dans ce répertoire, elle retourne le AgelinkStruct de cet âge qui me sera nécessaire dans la seconde fonction.
Si vous venez de créer un nouvel avatar qui vous servira de robot pour cette commande, et que vous lancez ChercheAge(), vous ne serez pas surpris de constater que très peu d'ages seront listés : city qui est la ville publique, Nexus et Neighborhood (votre quartier).
Moi, je veux que le robot puisse envoyer quelqu'un en ville publique (city), à Kirel (Neighborhood02) et Watcher's pub (GreatTreePub).
Pour la ville publique c'est ok, mais, mon avatar robot ne possède pas encore Kirel ni Watcher's Pub.
C'est ici que j'utilise une commande de la console Plasma de Plclient : Net.Vault.RegisterOwnedAge, qui me permet d'enregistrer dans le répertoire owner de mon avatar les âges qui me manquent et ce, sans devoir le faire dans le jeu.
Je tape donc dans la console Plasma de Plclient de mon avatar Robot :
Net.Vault.RegisterOwnedAge Neighborhood02
Net.Vault.RegisterOwnedAge GreatTreePub
Me voila donc "propriétaire-utilisateur" de ces deux âges.
Si je retape dans ma console Python de Plclient de mon robot la commande ChercheAge(), je vais avoir ces deux âges en plus dans ma liste des âges de mon répertoire owner.
Maintenant, il n'y a plus qu'à écrire la seconde fonction qui va envoyer un autre avatar vers l'un de ces âges. Celle-ci, je l'ai baptisée : EnvoyerIDVers(NomAge, IDavatar), dont voici son code :
- Code:
def EnvoyerIDVers(NomAge='city' ,ID=111111111):
linkmgr=ptNetLinkingMgr()
Structage=ChercheAge(NomAge)
linkmgr.linkPlayerToAge(Structage,ID)
La fonction fait appel à ma première fonction ChercheAge et à la fonction linkPlayerToAge de la classe ptNetLinkingMgr du module Plasma de Python. NomAge est le nom de fichier de l'âge où le robot doit envoyer l'avatar dont le numéro de KI est ID.
Donc, lorsque un avatar dont le numero de KI est, par exemple 5467898, enverra, la commande Vers ville, le robot va interpréter cela comme l'odre de l'envoyer à la ville publique et va donc lancer la commande : EnvoyerIDVers('city',5467898).
Voilà.
Il s'agit d'une solution. Peut-être en connaissez-vous une autre pour obtenir le même résultat...
Ici, l'envoi est sans limite, il suffit que le robot possède dans le répertoire owner l'âge désiré et il sera capable d'envoyer n'importe qui là où il le veut.
Première parenthèse:
Je vous ai dit que l'avatar pouvait être n'importe où pour être téléporté par le robot vers l'âge désiré , pour autant que le robot soit connecté. C'est exact mais il faut, tout comme pour se relier à l'âge où se trouve le robot, que la commande placée dans le xKI du robot soit du style : if "Vers ville" in message : et non pas if message == "Vers ville", car souvenez-vous de ce que je vous ai déjà expliqué, lorsqu'on envoie un message en chat privé à un avatar, alors qu'on ne se trouve pas dans le même âge que lui, le message est toujours précédé de l'âge où l'on se trouve et donc if message == "Vers ville" ne fonctionne que si les deux avatars sont dans le même âge, alors que avec if "Vers ville" in message, Python regarde simplement si "Vers ville" est contenu dans la variable message.
Ceci m'amène à une autre parenthèse importante.
L'utilisation de if ... in demande de bien placer cette instruction dans le xKI.py du robot. pourquoi ?
Imaginons que j'utilise mot cléf "link" pour relier un avatar à l'age du robot et que j'utilise l'expression "link city" pour que le robot envoie un avatar vers la ville publique.
Les deux mots-cléf utilisent la même instruction : if...in...
Quelle instruction dois-je mettre en premier dans la liste d'interprétation de mots-cléf du robot ?
Réponse : celle qui a le mot clé le plus long, donc ici celle qui possède if "link city" in message : et seulement après : elif "link" in message:
Pourquoi ? Tout simplement parceque en faisant l'inverse, le mot link étant inclu dans la variable message, c'est cette instruction qui sera exécutée et pas la suivante !
Donc retenez que si vous utilisez if..in plusieurs fois dans un bloc d'instructions avec des arguments similaires, il faut toujours se demander si les termes utilisés ne pourront pas être interprétés par le programme avant l'endroit où l'on veut qu'ils le soient;). C'est pourquoi, je préfère utiliser des mots-cléf différents.
V@-Michel- Admin
- Messages : 1172
Date d'inscription : 13/05/2010
Age : 69
Localisation : Belgique
Re: Utiliser un robot pour envoyer un avatar vers un autre âge que celui où il se trouve
Houla, mais il y'a plus simple! D'ailleurs, je ne suis pas certain si tu es en train de les envoyer vers le Kirel et le Watcher's Pub publiques. Es tu certain que cette commande enregistre la version "publique" de ces Âges ?
Personellement, j'avais simplement utilisé le GUID de chaque lieu, et j'utilisais cela pour les envoyer.
Personellement, j'avais simplement utilisé le GUID de chaque lieu, et j'utilisais cela pour les envoyer.
Re: Utiliser un robot pour envoyer un avatar vers un autre âge que celui où il se trouve
Lyrositeur a écrit:Houla, mais il y'a plus simple! D'ailleurs, je ne suis pas certain si tu es en train de les envoyer vers le Kirel et le Watcher's Pub publiques. Es tu certain que cette commande enregistre la version "publique" de ces Âges ?
Personellement, j'avais simplement utilisé le GUID de chaque lieu, et j'utilisais cela pour les envoyer.
Alors là c'est une bonne question !
Je vais de ce pas tester.
Tu utilise le GUID ? Je pensais que cela n'était possible que si c'est soi-même qui souhaite se téléporter. Quelle est la commande à employer pour envoyer un autre avatar que soi dans une instance avec le GUID ?
Ce serait évidemment plus simple !
J'avais testé avec la méthode que j'ai décrite plus haut d'autres âges et je m'étais aperçu que les avatars étaient bien envoyés dans leurs âges respectifs et non dans celui du robot.
Avec la ville publique cela fonctionne. Je dois donc vérifier si cela est pareil avec le pub et kirel.
V@-Michel- Admin
- Messages : 1172
Date d'inscription : 13/05/2010
Age : 69
Localisation : Belgique
Re: Utiliser un robot pour envoyer un avatar vers un autre âge que celui où il se trouve
Le GUID est utile juste pour les lieux publiques, à ce que je sache ; par exemple :
- Code:
def linkPlayerTo(player, age):
ageLink = ptAgeLinkStruct()
ageInfo = ptAgeInfoStruct()
ageLink.setLinkingRules(PtLinkingRules.kBasicLink)
if "kirel" in age:
ageInfo.setAgeFilename("Neighborhood02")
ageInfo.setAgeInstanceGuid('4cfbe95a-1bb2-4cbc-a6c4-87eb28a2aac1')
ageLink.setAgeInfo(ageInfo)
ptNetLinkingMgr().linkPlayerToAge(ageLink, player.getPlayerID())
Re: Utiliser un robot pour envoyer un avatar vers un autre âge que celui où il se trouve
Après essais avec mon code : Kirel et pub ne sont pas les âges publiques . Seule city l'est.
Bon, alors je teste avec ton code...et je dis ce qu'il en est.
Bon, alors je teste avec ton code...et je dis ce qu'il en est.
V@-Michel- Admin
- Messages : 1172
Date d'inscription : 13/05/2010
Age : 69
Localisation : Belgique
Re: Utiliser un robot pour envoyer un avatar vers un autre âge que celui où il se trouve
Voilà.
J'ai fait un "mix" des deux codes.
Le tien qui permet de se rendre dans un âge bien parfticulier en utilisant le GUID de cet âge et le mien pour envoyer l'avatar dans ses instances privées car en omettant le GUID comme tu l'avais suggéré, l'avatar se rend dans un âge 'vierge' et non le sien.
Ma fonction ChercheAge conserve ici toute son utilité.
Donc voici la fonction complète et qui fonctionne parfaitement :
La fonction ChercheAge(age) n'a pas été modifiée et donc regardez l'explication dans le post précédent.
Merci pour ton Aide Lyrositeur.
J'ai fait un "mix" des deux codes.
Le tien qui permet de se rendre dans un âge bien parfticulier en utilisant le GUID de cet âge et le mien pour envoyer l'avatar dans ses instances privées car en omettant le GUID comme tu l'avais suggéré, l'avatar se rend dans un âge 'vierge' et non le sien.
Ma fonction ChercheAge conserve ici toute son utilité.
Donc voici la fonction complète et qui fonctionne parfaitement :
- Code:
def EnvoyerIDVers(NomAge='city' ,ID=111111111):
ageLink = ptAgeLinkStruct()
ageInfo = ptAgeInfoStruct()
ageLink.setLinkingRules(PtLinkingRules.kBasicLink)
ageInfo.setAgeFilename(age)
if age == "Neighborhood02":
GUID = '4cfbe95a-1bb2-4cbc-a6c4-87eb28a2aac1'
ageInfo.setAgeInstanceGuid(GUID)
ageLink.setAgeInfo(ageInfo)
elif age == "City":
GUID = '7e0facea-dae1-4aec-a4ca-e76c05fdcfcf'
ageInfo.setAgeInstanceGuid(GUID)
ageLink.setAgeInfo(ageInfo)
elif age == "GreatTreePub":
GUID = '75bdd14e-a525-4283-a5a0-579878f7305a'
ageInfo.setAgeInstanceGuid(GUID)
ageLink.setAgeInfo(ageInfo)
else :
ageLink = ChercheAge(age)
ptNetLinkingMgr().linkPlayerToAge(ageLink, IDavatar)
La fonction ChercheAge(age) n'a pas été modifiée et donc regardez l'explication dans le post précédent.
Merci pour ton Aide Lyrositeur.
V@-Michel- Admin
- Messages : 1172
Date d'inscription : 13/05/2010
Age : 69
Localisation : Belgique
Sujets similaires
» Liste des commandes de la console Plasma
» Comment envoyer une note à un avatar
» Obtenir des informations importantes de l'âge dans lequel on se trouve
» Où peut-on utiliser les effets spéciaux dans la caverne ?
» Comment se relier à une autre instance que son Relto au moment du lancement du jeu
» Comment envoyer une note à un avatar
» Obtenir des informations importantes de l'âge dans lequel on se trouve
» Où peut-on utiliser les effets spéciaux dans la caverne ?
» Comment se relier à une autre instance que son Relto au moment du lancement du jeu
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum