Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Script de quète
Script de quète
Par Le Hamster le 25/9/2002 Ã 0:54:38 (#2226681)
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)
;) :) :) ;) ;) :maboule:
Par Azrael07 le 26/9/2002 Ã 0:12:34 (#2233168)
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)
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)
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)
Par Tyn' le 26/9/2002 Ã 19:29:50 (#2238430)
// 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)
revla le boulet
Par Le Hamster le 27/9/2002 Ã 0:41:58 (#2240355)
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)
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)
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)
Parce que là , y a confusion :confus:
désolé
Par Le Hamster le 3/10/2002 Ã 23:22:08 (#2278367)
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)
bises
Par Gargantuel le 8/10/2002 Ã 1:00:49 (#2295472)
Par LeProctophantasmiste le 8/10/2002 Ã 1:49:18 (#2295626)
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)
(le procto... t'as vraiment un nom imprononçable ! j'adore !)
Bises
Par LeProctophantasmiste le 8/10/2002 Ã 14:38:00 (#2297689)
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