La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 02/05/2024 07:56:39


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
P.Patoche
Chevalier
Inscrit le: 14 Avr 2006
Messages: 70
Localisation: France 77
Répondre en citant
Posté le : 20/04/2007 16:26:07 Sujet du message : (résolu) Problème de destruction d’objet

Bonjour.
Voici mon petit souci.
Le script suivant fonctionne sur trois pattes, si on peut dire.

NWScript :
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));

if (iIsTrue == 4)
    oTeleportWaypoint = GetObjectByTag("WP_TELEPORT_IF_TRUE");
    AssignCommand(GetObjectByTag("PL_COFFRE_1"),DestroyObject(GetObjectByTag("IT_CLEF1"),90.0f));
    AssignCommand(GetObjectByTag("PL_COFFRE_2"),DestroyObject(GetObjectByTag("IT_CLEF2"),90.0f));
    AssignCommand(GetObjectByTag("PL_COFFRE_3"),DestroyObject(GetObjectByTag("IT_CLEF3"),90.0f));
    AssignCommand(GetObjectByTag("PL_COFFRE_4"),DestroyObject(GetObjectByTag("IT_CLEF4"),90.0f));

    object oPortal = GetNearestObjectByTag("PL_PORTAL");
    SetLocalObject(oPortal, "Destination", oTeleportWaypoint);

}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


J'explique:
J'ai 4 coffres et 4 clefs, chaque clef vas dans un coffre bien spécifique, une fois les clefs dans les bons coffres je suis télé porter, sinon rien ne ce passe (jusqu a la tout vas bien) .
Les problèmes commencent à la destruction des clefs dans les coffres, la première fois les clefs sont bien détruites dans les coffres après un temps bien défini (ici 90 secondes pour les essais), mais si je recommence les clefs soit disparaisse tout de suite et pire disparaisse de l'inventaire du joueur ci il en possède, ma question est, y'a t'il une solution a tout sa ?

D'avance merci pour la ou les réponses.

Patoche.
Dernière édition par P.Patoche le 26/04/2007 16:58:06; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 20/04/2007 16:52:51 Sujet du message :

NWScript :
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, oItem, oTeleportWaypoint;
int i = 1;
int iMax = 4;
int iIsTrue = 0;
while(i <= iMax)
{
oCoffre = GetObjectByTag("PL_COFFRE_"+IntToString(i));
oItem = GetObjectByTag("IT_CLEF"+IntToString(i));
if(GetHasItemInInventory(oCoffre, oItem))
{
iIsTrue++;
}
i++;
}

if (iIsTrue == 4)
oTeleportWaypoint = GetObjectByTag("WP_TELEPORT_IF_TRUE");
int a = 1;
int aMax = 4;
while(a < aMax)
{
DelayCommand(90.0, DestroyObject(GetItemPossessedBy(GetObjectByTag("PL_COFFRE_"+IntToString(a)), "IT_CLEF"+IntToString(a))));
a++;
}
object oPortal = GetNearestObjectByTag("PL_PORTAL");
SetLocalObject(oPortal, "Destination", oTeleportWaypoint);

}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Bon tu m'escuseras, mais j'ai raccourci ton script à ma manière, pasque je m'y perdais super vite ... Bon, enfaite la quand tu détruis l'objet, tu ne dis pas précisément, ou il est ! Il faut que tu dises qu'il soit DANS L'INVENTAIRE DU COFFRE.

Petite info:
iMax = Nombre de coffre et clef maximum dans ton jeu
aMax = " " " " " "

Je suis pas sûr que tout fonctionne. Si mon script marche pas, t'as juste à copier coller la fonction qui t'interesse (à savoir, DelayCommand(90.0, etc...)Wink
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
P.Patoche
Chevalier
Inscrit le: 14 Avr 2006
Messages: 70
Localisation: France 77
Répondre en citant
Posté le : 20/04/2007 17:51:27 Sujet du message :

Voila Black Knight.

le script que tu ma fourni ne marche pas du tout, sur aucun point.... ( Confuseddésoler Confused) alors j'ai modifier le mien comme ceci.

NWScript :
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));

if (iIsTrue == 4)
    oTeleportWaypoint = GetObjectByTag("WP_TELEPORT_IF_TRUE");

DelayCommand(90.0, DestroyObject(GetItemPossessedBy(GetObjectByTag("PL_COFFRE_1"), "IT_CLEF1")));
DelayCommand(90.0, DestroyObject(GetItemPossessedBy(GetObjectByTag("PL_COFFRE_2"), "IT_CLEF2")));
DelayCommand(90.0, DestroyObject(GetItemPossessedBy(GetObjectByTag("PL_COFFRE_3"), "IT_CLEF3")));
DelayCommand(90.0, DestroyObject(GetItemPossessedBy(GetObjectByTag("PL_COFFRE_4"), "IT_CLEF4")));

    object oPortal = GetNearestObjectByTag("PL_PORTAL");
    SetLocalObject(oPortal, "Destination", oTeleportWaypoint);
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


La l'item est bien prise dans le coffre, mais si on recommence, les nouvelles clefs mise dans les coffres disparaisse de suite et le compteur iIsTrue++ affiche plus le SendMessageToPC.

Merci pour ta rapiditer de réponce.

Patoche.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 20/04/2007 19:31:33 Sujet du message :

Hmm alors ce qui bug, c'est les delay commands je pense. C'est grave si on les enlève? xD

Hmm j'vois vraiment pas d'ou ça peut venir ...

Je suis désolé, je verrais plus en détail quand j'aurais le temps Smile

Sbizz
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
P.Patoche
Chevalier
Inscrit le: 14 Avr 2006
Messages: 70
Localisation: France 77
Répondre en citant
Posté le : 21/04/2007 09:05:30 Sujet du message :

Oui les delaycommands doive rester ils permettes au portail de rester ouvert le temps que les clefs sont présente dans les coffres, après plusieurs essais, je me suis appercu que le sripte fonctionne SI on ne touche pas au coffre entre temps, il faudrais trouver le moyen de les verouillier avec en condition que les 4 clefs soit dans les bon coffres, le temps que la destrution soit faite (idem en condition, les clefs dans les bon coffres, la destrution commence meme si les y'a que 2 clefs a la bonne place)et une fois les clefs detruites les coffres ce deverouillie.

Voila j'espere avoir etes clair.

Patoche.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 21/04/2007 09:17:57 Sujet du message :

Tu mets une fonction assez simple alors, du style:

NWScript :
void main()
{

DelayCommand(90.0, UNLOCK);
//Ici tu unlock le coffre au bout de 90 secondes. Tape UnLock dans le filtre ^^
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Désolé que ça soit pas bien fait, mais mon éditeur bug, il me dit que j'ai plein d'erreur, et faut toujours que je reboot mon PC et ça marche 1 fois sur 5 ... -.-

Sbizz

EDIT: si ça marche pas, je vais essayé de faire fonctionner mon éditeur ^^
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
P.Patoche
Chevalier
Inscrit le: 14 Avr 2006
Messages: 70
Localisation: France 77
Répondre en citant
Posté le : 21/04/2007 10:05:22 Sujet du message :

Oui mais ci je fais comme sa,

NWScript :Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Les coffres ce verouillie et ce deverouillie meme si c'est pas la bonne clefs et je vois pas comment metre cette condition......

Patoche.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 21/04/2007 10:35:56 Sujet du message :

Dans les propriétés tu dis quel clef... et puis voila, et tu mets un tag de clef innexistant si tu veux qu'il soit impossible à ouvrir quand il est verouiller
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
P.Patoche
Chevalier
Inscrit le: 14 Avr 2006
Messages: 70
Localisation: France 77
Répondre en citant
Posté le : 21/04/2007 11:51:43 Sujet du message :

??? la je crois que tu n'a pas compris !!!!!!
C'est la combinaison des 4 clefs déposer dans les bon coffre qui verouille les coffres.
J'ai voulus faire de cette facon ...... mais bien sur ..... marche pas ...

NWScript :
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 oFerme;
oFerme = GetLastLocked();
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));

if (iIsTrue == 4)
    oTeleportWaypoint = GetObjectByTag("WP_TELEPORT_IF_TRUE");
    oFerme = GetObjectByTag("PL_COFFRE_1");
    oFerme = GetObjectByTag("PL_COFFRE_2");
    oFerme = GetObjectByTag("PL_COFFRE_3");
    oFerme = GetObjectByTag("PL_COFFRE_4");

// DelayCommand(00.1f,ActionLockO bject(GetObjectByTag("PL_ COFFRE_1")));
// DelayCommand(60.1f,ActionUnloc kObject(GetObjectByTag("P L_COFFRE_1")));

// DelayCommand(60.0, DestroyObject(GetItemPossessed By(GetObjectByTag("PL_COF FRE_1"), "IT_CLEF1")));
// DelayCommand(60.0, DestroyObject(GetItemPossessed By(GetObjectByTag("PL_COF FRE_2"), "IT_CLEF2")));
// DelayCommand(60.0, DestroyObject(GetItemPossessed By(GetObjectByTag("PL_COF FRE_3"), "IT_CLEF3")));
// DelayCommand(60.0, DestroyObject(GetItemPossessed By(GetObjectByTag("PL_COF FRE_4"), "IT_CLEF4")));
    object oPortal = GetNearestObjectByTag("PL_PORTAL");
    SetLocalObject(oPortal, "Destination", oTeleportWaypoint);
//      return;
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Patoche.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 21/04/2007 12:35:42 Sujet du message :

Question : Dans quel événement est ton script ?
_________________
Module persistant dans l'univers de Star Wars : Dark Time of the Galaxy
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
P.Patoche
Chevalier
Inscrit le: 14 Avr 2006
Messages: 70
Localisation: France 77
Répondre en citant
Posté le : 21/04/2007 12:38:21 Sujet du message :

Bonjour Enki.

Dans le Onclose des coffres.

Patoche.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 21/04/2007 12:50:20 Sujet du message :

Bon, il y a plusieurs erreurs dans ton script, je n'ai pas le temps de te le corriger, mais déjà, essaye d'enregistrer ton iIsTrue dans une variable, sur le module, car là, il est réinitialié à chaque fois que tu fermes ton coffre.
_________________
Module persistant dans l'univers de Star Wars : Dark Time of the Galaxy
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
P.Patoche
Chevalier
Inscrit le: 14 Avr 2006
Messages: 70
Localisation: France 77
Répondre en citant
Posté le : 21/04/2007 13:00:15 Sujet du message :

Merci bien ... les variables ne sont pas mes amies ...mais je vais voir ...ce que je peux faire..


Patoche.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
P.Patoche
Chevalier
Inscrit le: 14 Avr 2006
Messages: 70
Localisation: France 77
Répondre en citant
Posté le : 23/04/2007 19:21:27 Sujet du message :

Bon ...Confused bas ....Mad non je n'y arrive pas .... si une personne a une idée lumineuse ...ConfusedConfused

Patoche.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Ivellios
Légende vivante
Inscrit le: 25 Jan 2005
Messages: 447
Localisation: Poitiers
Répondre en citant
Posté le : 23/04/2007 21:48:40 Sujet du message :

En partant sur l'idée que les coffres ont des clefs avec un numéro similaire en fin de tag (pas pu tester pas facile à reconstituer l'environnement dans lequel ça se passe).

Par contre à la fin je suppose que tu assigne un variable au portail car sur le OnUsed tu as mit un script générique du genre "Je te téléporte à la variable objet "Destination" que je possède".
Si c'est la cas il faudra pas oublier aussi qu'au bout de 90 secondes il faudra la supprimer pour être cohérent avec le reste (un simple DeleteLocalObject pour le faire).

J'espère que ça marche ^^

NWScript :
void main()
{
object oPC = GetLastClosedBy();
int i;
int iIsTrue = 0;
string sCoffre = "PL_COFFRE_";
string sClef = "IT_CLEF";
string sNum;

for(i=1; i<5; i++)
{
  sNum = IntToString(i);
  if(GetItemPossessedBy(GetObjectByTag(sCoffre+sNum), sClef+sNum) != OBJECT_INVALID)
  iIsTrue++;
}

SendMessageToPC(oPC, IntToString(iIsTrue));

if(iIsTrue == 4)
{
  object oCoffre;

  for(i=1; i<5; i++)
  {
  sNum = IntToString(i);
  oCoffre = GetObjectByTag(sCoffre+sNum);

  SetLocked(oCoffre, TRUE);
  DestroyObject(GetItemPossessedBy(oCoffre, sClef+sNum));
  DelayCommand(90.0, SetLocked(oCoffre, FALSE));
  }

  SetLocalObject(GetObjectByTag("PL_PORTAL"), "Destination", GetObjectByTag("WP_TELEPORT_IF_TRUE"));
}
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.

_________________
Scripts, systèmes, fonctions,... c'est par ici...
Pyjama pour castor, une vocation, un avenir sûr
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
P.Patoche
Chevalier
Inscrit le: 14 Avr 2006
Messages: 70
Localisation: France 77
Répondre en citant
Posté le : 24/04/2007 19:01:39 Sujet du message :

Merci bien Ivellios, tous Razz marche Razz pour le mieux ....

Patoche.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 58.731ms