La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/11/2024 21:36:28


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 03/11/2005 15:27:13 Sujet du message : [Résolu] Création d'une mine (boucle)

Bonjour à tous,

Je vous recontacte encore car j'ai un problème pour la création d'une mine.

L'effet voulu :
le PJ a un item (dynamite) qu'il peut lancer dans une zone.
Une fois l'objet lancé, l'objet dit "1, 2, 3" et puis "Boom" effet de zone : explosion.


J'ai donc créé un item avec pour tag Dynamite.
J'ai mis un script dans le activate item qui créer un plaçable "mine" (jusque là, pas de problème).

Dans cet objet "mine" je dois mettre un script dans le onHeartBeat et c'est là que les choses se compliquent.
Je pense qu'il va me falloir faire un boucle (et là c'est vraiment pas mon fort)

Voilà ce que donne mon script pour l'instant : il y a toute la boucle à rajouter il me semble.

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.



En gros le script devrait dire :

- Tant que l'objet est valide ( oui car si on détruit l'objet le script est sensé s'arrêter)
- Une variable s'incrémente de 1 et dit "1" (ou 2 ou 3) (par ActionSpeakString)
- Puis l'objet fait une boule de feu sur lui-même. (avec le ActionCastSpellAtObject)


Donc dois-je mettre un "for" un "if" ou un "while" ça j'en sais rien...
Si certains pouvaient m'aider, ce serait super.
Merci !


EDIT :
Pour éviter de lire tout le post, voici le script final :

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
void CompteRebour(int iCompteur)
{
    if ( !GetIsObjectValid(OBJECT_SELF) ) return;
    if ( iCompteur > 4 )
    {
    object oPC = GetFirstObjectInShape(SHAPE_SPHERE, 6.0, GetLocation(GetObjectByTag("Mine")));
        while(GetIsObjectValid(oPC))
            {
            ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamage(100, DAMAGE_TYPE_FIRE), oPC);
            oPC = GetNextObjectInShape(SHAPE_SPHERE, 6.0, GetLocation(GetObjectByTag("Mine")));
            }
        ActionCastSpellAtObject(SPELL_FIREBALL, OBJECT_SELF, METAMAGIC_ANY, TRUE, 5, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
        ActionDoCommand(DestroyObject( OBJECT_SELF));
    }

    else
    {
        ActionSpeakString(IntToString(iCompteur - 1));
        DelayCommand(3.0, CompteRebour(iCompteur + 1));
    }
}

void main()
{
    location lDyna = GetItemActivatedTargetLocation();
    object oMine =CreateObject(OBJECT_TYPE_PLACEABLE, "mine", lDyna, FALSE);

    AssignCommand(oMine,CompteRebour(1));
}
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.
Dernière édition par Djezebel le 06/11/2005 20:56:29; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Dangon
Acolyte
Inscrit le: 18 Oct 2005
Messages: 21
Répondre en citant
Posté le : 03/11/2005 16:34:46 Sujet du message :

Si tu veux passer par le HeartBeat de la mine, tu n'as pas besoin de boucle, vu que le HeartBeat en est une en fait.
Je te propose donc le script suivant :

NWScript :

void main()
{
    int iCompteur = GetLocalInt(OBJECT_SELF,"Compteur");

    if ( iCompteur >= 2 ) // on compte le 0, donc la boucle doit s'arreter a 2
    {
        ActionSpeakString("BOOM");
        ActionCastSpellAtObject(SPELL_FIREBALL, OBJECT_SELF, METAMAGIC_ANY, TRUE, 5, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
        // ActionDoCommand(DestroyObject( OBJECT_SELF));
    }
    else
    {
        ActionSpeakString(IntToString(iCompteur + 1)); // on affiche le decompte ( on commence a 1 )
        SetLocalInt(OBJECT_SELF,"Compteur", iCompteur + 1 ); // on incremente le compteur
    }
}
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.


Qui va stocker et incrémenter un compteur à chaque HeartBeat jusqu'a atteindre le compte nécessaire.
J'ai mis un DestroyObject en annotation, vu que tu ne l'avais pas mis dans ton script, il serait sans doute bon de le placer pour détruire la mine après explosion Very Happy
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 03/11/2005 19:17:55 Sujet du message :

Super !

C'est "presque" ça Smile

Le premier problème que j'ai réussi à résoudre, c'est de mettre :

Code :
if ( iCompteur >= 3 ) // on compte le 0, donc la boucle doit s'arreter a 3 (parce que 1, 2, 3 et Boom ça fait 4)


Ensuite, c'est bon : quand on détruit l'objet, le script s'arrête.

Par contre, il y a 2 problèmes :

Premier problème : les 8 secondes entre (le temps du OnHeartBeat) c'est un peu long.
Il n'y aurait pas un moyen de raccourcir ce temps quite à mettre le script ailleurs que sur le OnHeartBeat ?

Second problème : L'explosion est très rapide et ne fait pas des dégats de zone. (je vais tenter de résoudre ce problème en premier en mettant un effet je suppose).
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Dangon
Acolyte
Inscrit le: 18 Oct 2005
Messages: 21
Répondre en citant
Posté le : 03/11/2005 21:42:40 Sujet du message :

Sans passer par le HeartBeat ( le HB, c'est maaaaaal comme diraient certains Razz ) Tu peux directement lancer une boucle récursive dans le script qui créee la mine ( donc dans le script d'ActiveItem ), comme suit :

NWScript :

void CompteRebour(int iCompteur)
{
    if ( !GetIsObjectValid(OBJECT_SELF) ) return;
    if ( iCompteur > 3 )
    {
        ActionSpeakString("BOOM");
        ActionCastSpellAtObject(SPELL_FIREBALL, OBJECT_SELF, METAMAGIC_ANY, TRUE, 5, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
        ActionDoCommand(DestroyObject( OBJECT_SELF));
    }
    else
    {
        ActionSpeakString(IntToString(iCompteur)); // on affiche le decompte
        DelayCommand(2.0, CompteRebour(iCompteur + 1) ); // on temporise a 2 sec en incrementant le compteur
    }

}


void main()
{
    // ============================
    // Le script original vient ici
    // ============================

    // N'oublie pas de determiner oMine dans le script original ou modifie le nom de variable.
    AssignCommand(oMine,CompteRebour(1)); // On fait lancer le compte a rebour a oMine a partir de 1 ( facilite la comprehension )
}
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.


Tu peux régler le temps entre deux boucles directement dans la fonction CompteRebour, au niveau du DelayCommand.

EDIT : pour les dégâts de zone, vérifie la faction de la mine ( mets bien Hostile ) et/ou les paramètres JcJ ( Joueurs contre Joueurs ).
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 03/11/2005 21:59:01 Sujet du message :

J'ai fais quelques modifs sinon ça me disait juste "2, 3 et BOOM" Smile

NWScript :
void CompteRebour(int iCompteur)
{
    if ( !GetIsObjectValid(OBJECT_SELF) ) return;
    if ( iCompteur > 4 )
    {
        ActionSpeakString("BOOM");
        ActionCastSpellAtObject(SPELL_FIREBALL, OBJECT_SELF, METAMAGIC_ANY, TRUE, 5, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
        ActionDoCommand(DestroyObject( OBJECT_SELF));
    }
    else
    {
        ActionSpeakString(IntToString(iCompteur - 1)); // on affiche le decompte
        DelayCommand(2.0, CompteRebour(iCompteur + 1)); // on temporise a 2 sec en incrementant le compteur
    }

}


void main()
{
    location lDyna = GetItemActivatedTargetLocation();
    object oMine =CreateObject(OBJECT_TYPE_PLACEABLE, "mine", lDyna, FALSE);

    // N'oublie pas de determiner oMine dans le script original ou modifie le nom de variable.
    AssignCommand(oMine,CompteRebour(1)); // On fait lancer le compte a rebour a oMine a partir de 1 ( facilite la comprehension )
}
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.



Voilà, maintenant il ne reste plus qu'à réussir à faire l'effet de zone.
Visiblement le ActionCastSpellAtObject créer un effet visuel très rapide (trop pour une boule de feu, c'est bisarre) et il n'y a aucun domage dans l'air d'effet.

Une idée ?

En tout cas merci beaucoup Dangon !
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Dangon
Acolyte
Inscrit le: 18 Oct 2005
Messages: 21
Répondre en citant
Posté le : 03/11/2005 22:06:49 Sujet du message :


Citation :
EDIT : pour les dégâts de zone, vérifie la faction de la mine ( mets bien Hostile ) et/ou les paramètres JcJ ( Joueurs contre Joueurs ).
Tu as bien vérifier ca ?

Sinon pour la rapidité d'execution, c'est normal, comme le lanceur et la cible sont la meme chose, il n'y a pas d'effet de "tir", il y a juste la détonation finale comme quand la boule de feu atteind sa cible.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 04/11/2005 18:42:57 Sujet du message :

L'objet est bien en hostile... et les paramètres sont ceux par défaut quand on lance une partie "normale" (en local)

Je ne comprends donc pas Sad
 
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 : 05/11/2005 10:57:01 Sujet du message :

Heu attendez la je suis pommé dans vos dialogue.. Pourquoi tu veut mettre un script dans le HB du module ou de la mine ? Normalement quand sa pete sa doit detruire la mine... Tu peut pas redire un peut mieu ? car moi j'ai deja fait mine, grenade et plein d'autre chose mais la je comprend pas du tout
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 05/11/2005 18:04:56 Sujet du message :

J'ai créé un item : "Grenade" (objet d'inventaire)
J'ai créé un placeable : "Mine"

"Grenade" est mis en "pouvoir unique" avec un script dessus qui permet de
- créer une "Mine" à l'endroit que je sélectionne
- fait un compte de 1 à 3
- fait enfin "exploser" la mine.

Voilà le script :

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
void CompteRebour(int iCompteur)
{
    if ( !GetIsObjectValid(OBJECT_SELF) ) return;
    if ( iCompteur > 4 )
    {
        ActionSpeakString("BOOM");
        ActionCastSpellAtObject(SPELL_FIREBALL, OBJECT_SELF, METAMAGIC_ANY, TRUE, 5, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
        ActionDoCommand(DestroyObject( OBJECT_SELF));
    }
    else
    {
        ActionSpeakString(IntToString(iCompteur - 1)); // on affiche le decompte
        DelayCommand(2.0, CompteRebour(iCompteur + 1)); // on temporise a 2 sec en incrementant le compteur
    }

}


void main()
{
    location lDyna = GetItemActivatedTargetLocation();
    object oMine =CreateObject(OBJECT_TYPE_PLACEABLE, "mine", lDyna, FALSE);

    // N'oublie pas de determiner oMine dans le script original ou modifie le nom de variable.
    AssignCommand(oMine,CompteRebour(1)); // On fait lancer le compte a rebour a oMine a partir de 1 ( facilite la comprehension )
}
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 mine se détruit bien, il y a bien une animation, mais il n'y a aucun dégat autour Smile
Est-ce plus clair ?

EDIT : on ne passe plus par le OnHeatBeat depuis que Dangon à dit :

Citation :
Sans passer par le HeartBeat ( le HB, c'est maaaaaal comme diraient certains Razz ) Tu peux directement lancer une boucle récursive dans le script qui créee la mine ( donc dans le script d'ActiveItem ), comme suit : [...]
 
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 : 05/11/2005 20:23:31 Sujet du message :

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.


Voila rajoute sa au moment de l'explosion. Fait gaff j'ai mi oPC ! donc faudra que tu mette oPCFirst ou autre pour pas confondre LE joueur de LES joueurs
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 06/11/2005 20:55:20 Sujet du message :

Impécable Smile
Merci Black Knight et merci Dangon pour votre aide Smile

Voici le script final :

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
void CompteRebour(int iCompteur)
{
    if ( !GetIsObjectValid(OBJECT_SELF) ) return;
    if ( iCompteur > 4 )
    {
    object oPC = GetFirstObjectInShape(SHAPE_SPHERE, 6.0, GetLocation(GetObjectByTag("Mine")));
        while(GetIsObjectValid(oPC))
            {
            ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamage(100, DAMAGE_TYPE_FIRE), oPC);
            oPC = GetNextObjectInShape(SHAPE_SPHERE, 6.0, GetLocation(GetObjectByTag("Mine")));
            }
        ActionCastSpellAtObject(SPELL_FIREBALL, OBJECT_SELF, METAMAGIC_ANY, TRUE, 5, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
        ActionDoCommand(DestroyObject( OBJECT_SELF));
    }

    else
    {
        ActionSpeakString(IntToString(iCompteur - 1));
        DelayCommand(3.0, CompteRebour(iCompteur + 1));
    }
}

void main()
{
    location lDyna = GetItemActivatedTargetLocation();
    object oMine =CreateObject(OBJECT_TYPE_PLACEABLE, "mine", lDyna, FALSE);

    AssignCommand(oMine,CompteRebour(1));
}
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.
 
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 70.307ms