Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Passer une porte si tel objet équipé

Par Cassin le 17/7/2002 à 19:57:23 (#1818820)

Bon, j'ai encore un petit problème... ;)

Dans mon module le joueur est dans un monastère, et il commence le jour de son intronisation. Et comme je le vois mal se pointer à la cérémonie avec sa robe violette et jaune :D, je voudrais qu'il ne puisse sortir de ses quartiers que s'il porte la tenue du monastère.

Pour celà j'ai voulu insérer dans le OnAreaTransition des portes des quartiers une petite condition qui vérifie si le joueur possède bien ledit objet dans son inventaire (je n'ai pas trouvé de fonction qui permette de vérifier si l'item est équipé, ça me parait bizarre... :doute:)

Pour l'instant j'ai ça :

object oClicker = GetClickingObject();
object oTarget = GetTransitionTarget(OBJECT_SELF);
location lLoc = GetLocation(oTarget);
object oObject1 = RobeMage;
object oObject2 = VetementGuerrier;

void main()
{
if (int GetHasInventory (object oObject1||oObject2))
{
AssignCommand(oClicker,JumpToLocation(lLoc));
}
}


Et j'ai une erreur à la compil : UNKNOWN STATE IN COMPILER sur la ligne du if.
J'ai essayé sans le OU mais ça me fait la même chose, depuis 2 jours je tourne la fonction dans tous les sens, je change des paramètres, ajoute ou supprime des point-virgule ou des parenthèses, mais rien n'y fait, c'est toujours la même chose...

Où est mon erreur ??? :hardos:

Re: Passer une porte si tel objet équipé

Par Amaranthe le 17/7/2002 à 20:16:31 (#1818956)

Provient du message de Cassin

Et j'ai une erreur à la compil : UNKNOWN STATE IN COMPILER sur la ligne du if.
Où est mon erreur ??? :hardos:


Tu confonds la definition de la fonction, avec son utilisation...

int GetHasInventory (object oObject1)
est la definition de la fonction GetHasInventory

Pour l'utiliser tu fait simplement GetHasInventory (oObject1).

Cf le premier cours pour les quiches ;)

Eleve Cassin ! Recalé !
Tu retourne a la case depart.
Tu ne touche pas 20.000 Gp.

:mdr:

Amaranthe.

Par Cassin le 18/7/2002 à 9:25:40 (#1821309)

Eleve Cassin ! Recalé !
Tu retourne a la case depart.
Tu ne touche pas 20.000 Gp.


:sanglote: :sanglote: :sanglote:
C'est pas juuuuussste !
:mdr: :mdr: :mdr:


Hum... :p

Le hic c'est que j'ai testé aussi sans le int (j'ai VRAIMENT tourné la fonction dans tous les sens ! ;) ), et ça marche pas non plus !
Ca me donne un ERROR: UNKNOWN STATE IN COMPILER !

Bouhouhouuuuu, je vais craquer ! :mdr:

Par Kray le 18/7/2002 à 9:35:17 (#1821334)

Jamais vu l'objet RobeMage ou ArmureGuerrier :p

GetObjectByTag ? ^_^

Par Cassin le 18/7/2002 à 9:43:38 (#1821362)

C'est normal c'est des vêtements custom ;)

GetObjectByTag, ça permet bien de récupérer un objet par son tag, me trompe-je ? Mais ça ne permet de savoir si le joueur l'a sur lui, si ?


Argh, Ste Loraine, Mère de toutes les Quiches, priez pour moi, pauvre Quicheur...
:mdr:

Par leZilou le 18/7/2002 à 11:08:26 (#1821769)

Je me risque à suggérer...

if (int GetHasInventory (object oObject1||oObject2))

As-tu essayé en enlevant le int et le object ?

On peut vraiment faire un OU logique entre 2 objets ?
Ca ne serait pas plutot GetHasInventory (oObject1) || GetHasInventory (oObject2) ?

Par Cassin le 18/7/2002 à 11:17:03 (#1821837)

En enlevant le int, j'ai ERROR: UNKNOWN STATE IN COMPILER sur la ligne du if ; et en enlevant le object, là il me sort un ERROR: VARIABLE DEFINED WITHOUT TYPE sur la ligne où je déclare oObject1... :hardos:

Quant au OU conditionnel, de toutes façons avec ou sans ça marche pas quand même ! ;)

Par Amaranthe le 18/7/2002 à 11:38:50 (#1821958)

Bon... de tête parceque je n'ai pas neverwinternight au boulot ;(

Même si ca ne fonctionne pas... il FAUT virer ton int et ton object.

Comme le fait remarque Kray, tu dois utiliser le GetObjectByTag !

object objet1 = GetObjectByTag("RobeMago") ;

Et apres, LeZilou a tout a fait raison...

Voila avec tout cela tu devrais t'en sortir...

Je te conseille de regarder les cours de script... le garde qui salue le pc qui a un anneau... ca te rappele quelque chose ?

Amaranthe.

Par Fredegar le 18/7/2002 à 11:42:42 (#1821991)

A mon avis, c'est pas GetHasInventory qu'il faut utiliser mais plutôt GetItemPossessedBy. Essaye un truc du genre :


object oClicker = GetClickingObject();
object oTarget = GetTransitionTarget(OBJECT_SELF);
location lLoc = GetLocation(oTarget);

void main()
{
if (GetItemPossessedBy(oClicker,"RobeMage") != OBJECT_INVALID) ||
(GetItemPossessedBy(oClicker,"VetementGuerrier") != OBJECT_INVALID)
{
AssignCommand(oClicker,JumpToLocation(lLoc));
}
}


J'ai pas testé, mais j'aimerais bien savoir si ça marche.

Par Cassin le 18/7/2002 à 14:46:24 (#1823126)

OK, ça marche, merci ! :merci: :merci: :merci:

En fait le script ne se compile pas avec le OU, j'ai donc dut ruser et j'ai fais ça :

object oClicker = GetClickingObject();
object oTarget = GetTransitionTarget(OBJECT_SELF);
location lLoc = GetLocation(oTarget);

void main()
{
if (GetItemPossessedBy(oClicker,"RobeMage") != OBJECT_INVALID)
{
AssignCommand(oClicker,JumpToLocation(lLoc));
}
else
if (GetItemPossessedBy(oClicker,"VetementGuerrier") != OBJECT_INVALID)
{
AssignCommand(oClicker,JumpToLocation(lLoc));
}
else
ActionSpeakString("Je ne peux tout de meme pas sortir sans
mon uniforme le jour de mon intronisation !");
}


Par contre ça marche aussi quand l'object est dans l'inventaire et pas équipé, mais bon, c'est pas grave ;)

EDIT pour le rajout de la ligne qui inscrit la phrase en cas de FALSE (le truc con c'est que ça écrit "[Door] : Je ne peux pas ..." ;) )

Par Amaranthe le 18/7/2002 à 15:35:42 (#1823501)


object oClicker = GetClickingObject();
object oTarget = GetTransitionTarget(OBJECT_SELF);
location lLoc = GetLocation(oTarget);

void main()
{
If ( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("RobeMage", 0) ) ||
( GetItemInSlot(INVENTORY_SLOT_CHEST, oClicker) ==
object GetObjectByTag("VetementGuerrier", 0) )
AssignCommand(oClicker,JumpToLocation(lLoc));
else
ActionSpeakString("Je ne peux tout de meme pas sortir sans
mon uniforme le jour de mon intronisation !");
}


Amaranthe.
Sans certitude puisque toujours au bureau ;)

Par Cassin le 18/7/2002 à 15:42:33 (#1823545)

Mmmmmm, nan, ça marche toujours si l'objet est dans l'inventaire, mais c'est pas grave, je ne voudrais pas d'embêter avec ça !

Merci !

Par Kemay le 19/7/2002 à 1:00:09 (#1825964)

Il manque la fonction ClearAllActions pour éviter que le changement de zone se fasse. Je viens d'essayer le script suivant placé dans onAreaTransitionClick et ça marche :)

void main()
{
object oClicker = GetClickingObject();
object oTarget = GetTransitionTarget(OBJECT_SELF);
location lLoc = GetLocation(oTarget);

//Si ni "RobeMage" ni "VetementGuerrier" ne sont portes par oClicker
if (GetItemInSlot(INVENTORY_SLOT_CHEST,oClicker)!= GetObjectByTag("RobeMage")
&& GetItemInSlot(INVENTORY_SLOT_CHEST,oClicker)!= GetObjectByTag("VetementGuerrier")){
//Annuler le changement de zone
ClearAllActions();
//Phrase informative
AssignCommand(oClicker,ActionSpeakString("Je ne peux tout de meme pas sortir sans mon
uniforme le jour de mon intronisation !"));}
else
//Sinon effectuer le changement de zone
AssignCommand(oClicker,JumpToLocation(lLoc));
}

JOL Archives 1.0.1
@ JOL / JeuxOnLine