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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Script de quète

Par Le Hamster le 25/9/2002 à 0:54:38 (#2226681)

Je ne sais absolument pas faire le script suivant, peut-on m'aider pls ?

5 coffres : Coffre1, coffre 2, ..
5 objets : Objet 1, Objet 2, ...

Le but de la quête : déposer l'objet 1 dans le coffre 1, le 2 dans le 2 ...
Pour que le test de réussite (ou non) de la quête se fasse, il faut que les 5 coffres soient remplis.

Si réussi >>>>apparition d'un portail (qui mène à l'endroit 1)
Si raté >>>>> apparition d'un portail (qui mène à l'endroit 2)

J'espère que je suis clair.

Bises

hein ?

Par Le Hamster le 25/9/2002 à 23:35:17 (#2232994)

Si c'est le portail qui vous gène, collez-moi une area transtion et roule Emile !!


;) :) :) ;) ;) :maboule:

Par Azrael07 le 26/9/2002 à 0:12:34 (#2233168)

Voila le script tout fait en entier. Merci qui ??? ;)

Ca c a mettre dans le OnClose de tout les coffres :


int GetHasItemInInventory(object oTarget, object oItem)
{
object oSearchItem = GetFirstItemInInventory(oTarget);
while(GetIsObjectValid(oSearchItem))
{
if (oSearchItem == oItem)
return TRUE;
oSearchItem = GetNextItemInInventory(oTarget);
}
return FALSE;
}

void main()
{
object oPlayer = GetLastUsedBy();
object oCoffre = GetObjectByTag("PL_COFFRE-1");
object oItem = GetObjectByTag("IT_CLEF-1");
object oTeleportWaypoint;

int iIsTrue = 0;

if(GetHasItemInInventory(oItem, oCoffre))
iIsTrue++;

oCoffre = GetObjectByTag("PL_COFFRE-2");
oItem = GetObjectByTag("IT_CLEF-2");
if(GetHasItemInInventory(oItem, oCoffre))
iIsTrue++;

oCoffre = GetObjectByTag("PL_COFFRE-3");
oItem = GetObjectByTag("IT_CLEF-3");
if(GetHasItemInInventory(oItem, oCoffre))
iIsTrue++;

oCoffre = GetObjectByTag("PL_COFFRE-4");
oItem = GetObjectByTag("IT_CLEF-4");
if(GetHasItemInInventory(oItem, oCoffre))
iIsTrue++;

oCoffre = GetObjectByTag("PL_COFFRE-5");
oItem = GetObjectByTag("IT_CLEF-5");
if(GetHasItemInInventory(oItem, oCoffre))
iIsTrue++;

if (iIsTrue == 5)
oTeleportWaypoint = GetObjectByTag("WP_TELEPORT_IF_TRUE");
else
oTeleportWaypoint = GetObjectByTag("WP_TELEPORT_IF_FALSE");

object oPortal = GetNearestObjectByTag("PL_PORTAL");
SetPlaceableIllumination( oPortal);

SetLocalObject(oPortal, "Destination", oTeleportWaypoint);
}


et pis tu met dans le OnUsed du portal :


void main()
{
object oUser = GetLastUsedBy();
object oTarget = GetLocalObject(OBJECT_SELF, "Destination");

if(GetIsObjectValid(oTarget))
AssignCommand(oUser, ActionJumpToObject(oTarget));
}


voila je pense que ca devrais marcher. Sinon dit le je debuggerais ^_^

EDIT : Voila j'ai corrigé le script, pour les commentaires dsl mais g vraiment pas le temp. Peut être un autre jour

ARF

Par Le Hamster le 26/9/2002 à 14:27:17 (#2236164)

Je me suis sans doute mal fait comprendre. Il est important que les 5 objets soient déposés dans le bon coffre.

Objet 1 dans coffre 1
Objet 2 dans coffre 2
..
Objet 5 dans coffre 5.

Pour que la quête soit réussi.

Si on a au moment du "remplissage du 5 ème coffre"

Objet 1 dans coffre 1
2 dans 2
3 dans 3
O4 dans C5
et O5 dans C4

Là, c'est raté, (faut bien que les PJ réfléchissent un peu non ?)

Or dans tes scripts (merci merci encore) n'apparait pas, sauf erreur de ma part et ce ne serait pas étonnant, les Tag que je dois donner à mes objets.

Voili voilà

Bises

Je comprends pas ...

Par Delis le 26/9/2002 à 15:19:24 (#2236512)

ce que fait ton script :confus:

Pourrais-tu ajouter quelques commentaires STP :)

Tu verifies dans l'inventaire du PJ la presence d'un objet coffre ?

//EDIT
Oups ... decalage horaire ...

Les 5 coffres sont accessibles les uns apres les autres ? Ou ils peuvent acceder aux coffres dans le desordre ?

Par Azrael07 le 26/9/2002 à 18:08:02 (#2237799)

oulala desole je pense ke j'étais trèèèèèèèèèèèèèèèèèèèès fatigué kan j'ai fais se script il est completement bidon, c bon je l'édite et je le corrige

Par Tyn' le 26/9/2002 à 19:29:50 (#2238430)

Je commentarise :

// Fonction qui verifie si l'objet oItem est ou non dans l'inventaire de oTarget.
int GetHasItemInInventory(object oTarget, object oItem)
{
// Sélection du premier objet de l'inventaire
object oSearchItem = GetFirstItemInInventory(oTarget);
//Initialisation de la boucle
while(GetIsObjectValid(oSearchItem))
{
//Si l'objet de l'inventaire est celui que l'on cherche
if (oSearchItem == oItem)
//On retourne VRAI
return TRUE;
//Sinon, on sélectionne l'objet suivant
oSearchItem = GetNextItemInInventory(oTarget);
}
//Si l'objet à chercher n'est pas dans l'inventaire, on retourne FAUX
return FALSE;
}

void main()
{
//Initialisation du joueur
object oPlayer = GetLastUsedBy();
//Initialisation du premier coffre
object oCoffre = GetObjectByTag("PL_COFFRE-1");
//Initialisation de la première clef
object oItem = GetObjectByTag("IT_CLEF-1");
//Initialisation à vide de la cible de téléportation du portaié
object oTeleportWaypoint;
//Intialisation de la variable de comptage
int iIsTrue = 0;
//Si la première clef est dans le premier coffre
if(GetHasItemInInventory(oItem, oCoffre))
//On ajoute 1 à la variable de comptage
iIsTrue++;

//Initialisation du second coffre
oCoffre = GetObjectByTag("PL_COFFRE-2");
//Initialisation de la seconde clef
oItem = GetObjectByTag("IT_CLEF-2");
//Si la seconde clef est dans le second coffre
if(GetHasItemInInventory(oItem, oCoffre))
//On ajoute 1 à la variable de comptage
iIsTrue++;

//Initialisation du troisième coffre
oCoffre = GetObjectByTag("PL_COFFRE-3");
//Initialisation de la troisième clef
oItem = GetObjectByTag("IT_CLEF-3");
//Si la troisième clef est dans le troisième coffre
if(GetHasItemInInventory(oItem, oCoffre))
//On ajoute 1 à la variable de comptage
iIsTrue++;

//Initialisation du 4ème coffre
oCoffre = GetObjectByTag("PL_COFFRE-4");
//Initialisation de la 4ème clef
oItem = GetObjectByTag("IT_CLEF-4");
//Si la 4ème clef est dans le 4ème coffre
if(GetHasItemInInventory(oItem, oCoffre))
//On ajoute 1 à la variable de comptage
iIsTrue++;

//Initialisation du 5ème coffre
oCoffre = GetObjectByTag("PL_COFFRE-5");
//Initialisation de la 5ème clef
oItem = GetObjectByTag("IT_CLEF-5");
//Si la 5ème clef est dans le 5ème coffre
if(GetHasItemInInventory(oItem, oCoffre))
//On ajoute 1 à la variable de comptage
iIsTrue++;

//Si les 5 clefs étaient dans les 5 coffres, la variable de comptage devrait être à 5. On vérifie si c'est le cas
if (iIsTrue == 5)
//Si c'est le cas, le joueur à fait juste, on pointe le portail vers le waypoint WP_TELEPORT_IF_TRUE
oTeleportWaypoint = GetObjectByTag("WP_TELEPORT_IF_TRUE");
//Si ce n'est pas le cas, le joueur à fait faux
else
//On pointe le portail vers le waypoint WP_TELEPORT_IS_FALSE
oTeleportWaypoint = GetObjectByTag("WP_TELEPORT_IF_FALSE");

//On récupère le portail
object oPortal = GetNearestObjectByTag("PL_PORTAL");
//On le fait briller pour que le joueur le remarque
SetPlaceableIllumination( oPortal);

//On enregistre sa destination dessus
SetLocalObject(oPortal, "Destination", oTeleportWaypoint);
}
void main()
{
//On récupère le joueur
object oUser = GetLastUsedBy();
//On récupère la destination précédemment enregistrée dessus
object oTarget = GetLocalObject(OBJECT_SELF, "Destination");

//Si la destination est correcte, le joueur à réalisé l'énigme
if(GetIsObjectValid(oTarget))
//On le téléporte donc vers le waypoint correspondant à son résultat
AssignCommand(oUser, ActionJumpToObject(oTarget));
}
:)

Par Azrael07 le 26/9/2002 à 21:29:58 (#2239311)

merci a toi ;)

revla le boulet

Par Le Hamster le 27/9/2002 à 0:41:58 (#2240355)

bon, m'en veuillez pas mais, il y a deux ou trois petites questions.

1 - preums, je ne sais pas quoi qu'il faut mettre à la place de "destination" ?

2 - Que dois-je mettre comme plaçable pour simuler le portail ? Je comprends pas la ligne SetIllumination.

3 - Essai : A priori, en mettant un portail (sans scripts autre que le tien sur le on Used ) et en laissant "Destination" tel quel, le script ne fonctionne pas.

Car, même si le résultat (dans les coffres) est bon, on est téléporté au mauvais endroit. D'autre part, si on ne remplit que un ou deux coffres (même avec le bon item), le portail est activé vers le mauvais endroit. J'appelle le mauvais endroit, le WP correspondant à une mauvaise réponse.

4 - Je vois dans la "commentarisation" récupération du PJ. Que se passerait-il si en multi joueurs, chaque joueur met une clef dans un coffre ? (même si la réponse est bonne).

J'espère que mes questions vous plairont ;)

bises

Par Azrael07 le 27/9/2002 à 6:40:49 (#2240939)

1:Destination, tu n'a rien a remplacer, il s'agit de l'objet de destination qui est enregistré dans une variable

2: Pour le portail tu peut mettre un portal dans les placeable de type Visual Effect, par contre je viens de me rendre compte que son effet visuel ne peut pas être désactivé, donc vire la ligne avec SetIllumination(c'étais pour faire apparaitre le portail sans k'il soit visible avant)

3: j'y reflechirais ce soir, la j'ai pas le temp(le script n'est aps testé, c possible ke ca marche pas

4: En fait, initialiser le joueur est un reflexe que je fait a tout mes scripts, et que je vire si ca ne sert a rien(et pis la g oublié de le vire). Tu pourras voir qu'en fait oPlayer n'est aps utilisé dans le script, donc tu peut virer al ligne, et le script fonctionne bien pour tout les joueurs

c'est reparti !!

Par Le Hamster le 3/10/2002 à 14:39:57 (#2275547)

Au final, j'ai mis ça dans le onclose des 5 coffres. J'ai vérifié dix fois tous les tags des coffres et des objets que l'on met dedans. (euh, je me suis permis de modifier le tag des coffres, j'ai toujours une appréhesion avec le tirets dans les dénominations).

Bon, le test donne toujours le même résultat : Direction l'enfer !! Même uand la réponse semble bonne. ça voudrait dire que Int ne s'incrémente pas, mais pourquoi !!!???

int GetHasItemInInventory(object oTarget, object oItem)
{
object oSearchItem = GetFirstItemInInventory(oTarget);
while(GetIsObjectValid(oSearchItem))
{
if (oSearchItem == oItem)
return TRUE;
oSearchItem = GetNextItemInInventory(oTarget);
}
return FALSE;
}

void main()
{

object oCoffre = GetObjectByTag("PL_COFFRE_1");
object oItem = GetObjectByTag("IT_CLEF1");
object oTeleportWaypoint;

int iIsTrue = 0;

if(GetHasItemInInventory(oItem, oCoffre))
iIsTrue++;

oCoffre = GetObjectByTag("PL_COFFRE_2");
oItem = GetObjectByTag("IT_CLEF2");
if(GetHasItemInInventory(oItem, oCoffre))
iIsTrue++;

oCoffre = GetObjectByTag("PL_COFFRE_3");
oItem = GetObjectByTag("IT_CLEF3");
if(GetHasItemInInventory(oItem, oCoffre))
iIsTrue++;

oCoffre = GetObjectByTag("PL_COFFRE_4");
oItem = GetObjectByTag("IT_CLEF4");
if(GetHasItemInInventory(oItem, oCoffre))
iIsTrue++;

oCoffre = GetObjectByTag("PL_COFFRE_5");
oItem = GetObjectByTag("IT_CLEF5");
if(GetHasItemInInventory(oItem, oCoffre))
iIsTrue++;

if (iIsTrue == 5)
oTeleportWaypoint = GetObjectByTag("WP_Retour");
else
oTeleportWaypoint = GetObjectByTag("WP_Perdu");

object oPortal = GetNearestObjectByTag("PL_PORTAL");
SetPlaceableIllumination( oPortal);

SetLocalObject(oPortal, "Destination", oTeleportWaypoint);
}


WP_Retour >>>> réponse bonne
WP_Enfer >>>>> réponse fausse
J'ai bien mis l'autre script sur le portail.

Voilà, kékun peut jeter un oeil averti là dessus ?

Merci et bises.

Par Gargantuel le 3/10/2002 à 17:59:07 (#2276651)

WP_Perdu ou WP_Enfer ?

Parce que là, y a confusion :confus:

désolé

Par Le Hamster le 3/10/2002 à 23:22:08 (#2278367)

toutes mes confuses ! J'avions pas vu ma bévue.

Le tag du Waypoint est "WP_Perdu" (Quand la quête n'est pas réalisée)

voilà je suis tout rouge de honte !!!

hein

Par Le Hamster le 8/10/2002 à 0:11:15 (#2295239)

personne n'a dix minutes pour zieuter mon blème ? j'y parviens pas.


bises

Par Gargantuel le 8/10/2002 à 1:00:49 (#2295472)

crevé mais demain soir ok

Par LeProctophantasmiste le 8/10/2002 à 1:49:18 (#2295626)

Je crois que j'ai trouvé, mais bon il est tard:

les cinq lignes


if(GetHasItemInInventory(oItem, oCoffre))

posent problème,

ce devrait être:

if(GetHasItemInInventory(oCoffre, oItem))


en effet voici début de GetHasItem:

int GetHasItemInInventory(object oTarget, object oItem)
{
object oSearchItem = GetFirstItemInInventory(oTarget);
....


Donc pour l'instant, si je ne me trompe, tu cherches si il ya un coffre dans la clef :rasta:

Raté

Par Le Hamster le 8/10/2002 à 10:22:07 (#2296185)

désolé mais apparemment c'est pas ça.




(le procto... t'as vraiment un nom imprononçable ! j'adore !)


Bises

Par LeProctophantasmiste le 8/10/2002 à 14:38:00 (#2297689)

je viens juste de terster ceci, et pour moi ça marche:


int GetHasItemInInventory(object oTarget, object oItem)
{
object oSearchItem = GetFirstItemInInventory(oTarget);
while(GetIsObjectValid(oSearchItem))
{
if (oSearchItem == oItem)
return TRUE;
oSearchItem = GetNextItemInInventory(oTarget);
}
return FALSE;
}

void main()
{

object oCoffre = GetObjectByTag("PL_COFFRE_1");
object oItem = GetObjectByTag("IT_CLEF1");
object oTeleportWaypoint;

int iIsTrue = 0;

if(GetHasItemInInventory(oCoffre, oItem))
iIsTrue++;
SendMessageToPC(GetFirstPC(),IntToString(iIsTrue));

oCoffre = GetObjectByTag("PL_COFFRE_2");
oItem = GetObjectByTag("IT_CLEF2");
if(GetHasItemInInventory(oCoffre, oItem))
iIsTrue++;
SendMessageToPC(GetFirstPC(),IntToString(iIsTrue));

oCoffre = GetObjectByTag("PL_COFFRE_3");
oItem = GetObjectByTag("IT_CLEF3");
if(GetHasItemInInventory(oCoffre, oItem))
iIsTrue++;
SendMessageToPC(GetFirstPC(),IntToString(iIsTrue));

oCoffre = GetObjectByTag("PL_COFFRE_4");
oItem = GetObjectByTag("IT_CLEF4");
if(GetHasItemInInventory(oCoffre, oItem))
iIsTrue++;
SendMessageToPC(GetFirstPC(),IntToString(iIsTrue));

oCoffre = GetObjectByTag("PL_COFFRE_5");
oItem = GetObjectByTag("IT_CLEF5");
if(GetHasItemInInventory(oCoffre, oItem))
iIsTrue++;
SendMessageToPC(GetFirstPC(),IntToString(iIsTrue));

if (iIsTrue == 5)
SendMessageToPC(GetFirstPC(),"Ahhh!");
else
SendMessageToPC(GetFirstPC(),"Ohhh!");
}


Donc à moins que ce ne soit le portail, le problème ne vient pas du script (une fois les appels de GetHasItem modifiés).

Es tu certain que tes objets sont uniques: tu n'as qu'un seul objet portant chaque tag (que ce soient clefs ou coffres), sinon cela a de bonne chance de creer un problème. Par exemple en testant tu n'aurais pas récupéré l'une des clefs avec ton perso, la duplicant en faisant un reload?

JOL Archives 1.0.1
@ JOL / JeuxOnLine