[Barde inside] Quelques questions simples

Répondre
Partager Rechercher
Je sais, c'est vague comme titre, mais ce sujet va me servir de fourre-tout pour poser plein de questions différentes (et pas trop compliqué, enfin pour moi c'est compliqué) sur NWN.
Hop, c'est parti.

1) On doit pouvoir faire de jolies cinématiques maintenant, mais bon, comment faut faire ? Quelqu'un a un tutorial ou une bonne explication ? Ceux qui ont SoU comprendront de quoi je veux parler (l'attaque de Drogan par les kobolds par exemple).
Petite question supplémentaire. Le PJ doit sortir de la zone A, la cinématique s'enclenche alors dans la zone A, puis lorsqu'elle est finit la zone B (destination du PJ) se charge. Comment faire ça ?

2) Quelqu'un peut m'expliquer comment faire un henchman ? Ce que je demande c'est comment ça marche pour qu'il rejoigne le PJ, qu'il parte si le PJ lui demande (ou si une action particulière est effectuée), pour la montée en niveau, etc.

Ma version est 1.30 NWN+SoU.
On verra plus tard pour les autres questions, mais j'aurais sans doute des problèmes avec les scripts (ou peut-être pas si le script generator peut faire tout ce dont j'aurais besoin).
ça tombe bien... je me suis posé les mêmes questions il y a moins d'une semaine

pour les henchmans.. un bon kit "clef en main" qui vient juste d'etre updaté.. : Module Builders Henchman Kit v1.9a

le Kit en version 1.9 pour ceux qui ont pas SOU : http://members.prtcnet.org/cward/henchkit.html

pour les cinematiques... un bon thread et surtout un kit avec des nouvelles commandes sous formes d'include pour gerer "plus facilement" les commandes de camera et de cinematique (Bioware voulait rendre publique et essayer de faire comprendre le system de SoU, mais a laissé tomber devant la qualité de cet "addon" qui est plus simple et performant que leur propre system.. si ça c'est pas une reference... )

Gestalt Cutscene Scripting System

Accessoirement, Gestalt est l'auteur de l'excellente serie de modules "Lord of blight"
Humph, un problème avec mon marchand...

J'ai mon marchand qui s'appelle Merchant_01. Lorsque je lui parle, ça lance une conversation, et en choisissant la bonne phrase, il devrait ouvrir sa boutique.

Voila le script.
Code PHP:

void main()
{
    
object oStore GetNearestObjectByTag("merch_01");
    if(
GetObjectType(oStore) == OBJECT_TYPE_STORE)
        
OpenStore(oStoreGetPCSpeaker());
    else
        
ActionSpeakStringByStrRef(53090TALKVOLUME_TALK);

Le marchand (là je parle de la boutique) a le tag Merch_01 et est placé juste à côté de Merchant_01. Mais quand je lui demande d'ouvrir sa boutique, il me dit qu'il n'y en a pas Oo.
Elle est où l'erreur ?

(Version 1.30, NWN+SoU)
Hum... je sais plus si la casse compte...

t'as qu'a copier coller le tag de ta boutique et la coller dans ton script comme ca tu sera sur que c'est excactement le même ( maj, mini, caractères parasites.. , etc)
C'est bon pour le marchand. On passe à la suite.

Mes monstres ne donnent pas de cadeaux aléatoires...
Quel est le script à mettre pour avoir des objets aléatoires à la BioWare en tuant des monstres et où le mettre ?

[Raistlin] : oui mais bon, j'ai décidé de faire une version simplifié avant de commencer à me prendre la tête avec les henchmen et les cinématiques .
Citation :
Provient du message de simkim
C'est bon pour le marchand. On passe à la suite.

Mes monstres ne donnent pas de cadeaux aléatoires...
Quel est le script à mettre pour avoir des objets aléatoires à la BioWare en tuant des monstres et où le mettre ?

[Raistlin] : oui mais bon, j'ai décidé de faire une version simplifié avant de commencer à me prendre la tête avec les henchmen et les cinématiques .
Tu as deux solutions :
-soit : tu peux regarder dans les propriétés de tes NPC, et dans l'option Trésor, si je me trompe pas.
soit :
Je ne pourrai plus te dire ce qui faut mettre, car je suis à mon boulot, et je ne l'ai plus en tête. Sinon faut regarder dans les script standard à nwn.
Mais en tout cas je peux te dire que cela devrait se mettre dans le ondeath de la créature.
Voici le OnDeath de base (et donc celui qu'il y a actuellement sur mes créatures).

Code PHP:

//:://////////////////////////////////////////////////
#include "x0_i0_spawncond"

void main()
{
    
int nClass GetLevelByClass(CLASS_TYPE_COMMONER);
    
int nAlign GetAlignmentGoodEvil(OBJECT_SELF);

    
// If we're a good/neutral commoner,
    // adjust the killer's alignment evil
    
if(nClass && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL))
    {
        
object oKiller GetLastKiller();
        
AdjustAlignment(oKillerALIGNMENT_EVIL5);
    }

    
// Call to allies to let them know we're dead
    
SpeakString("NW_I_AM_DEAD"TALKVOLUME_SILENT_TALK);

    
//Shout Attack my target, only works with the On Spawn In setup
    
SpeakString("NW_ATTACK_MY_TARGET"TALKVOLUME_SILENT_TALK);

    
// NOTE: the OnDeath user-defined event does not
    // trigger reliably and should probably be removed
    
if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
    {
         
SignalEvent(OBJECT_SELFEventUserDefined(1007));
    }

Il manque la ligne pour le trésor non ?

Pour ce qui est de l'option trésor, j'en ais essayé plusieurs, mais ça n'a rien donné (ou alors j'ai mal fait).

Question subsidiaire toute simple :
Le PJ doit mettre un objet (Item_01) dans un coffre (Chest_01). Si c'est le bon objet, à la fermeture du coffre je voudrais que ça face un petit effet visuel (on va dire celui de dissipation) sur le coffre, et que ça y ajoute un ou plusieurs objets dedans. Est-ce qu'il serait possible que ça rajoute un trésor aléatoire (pourquoi pas avec le système de trésor de SoU) ?
Et il faudrait aussi que ça donne un peu d'expérience.

Je crois qu'il me reste encore un script à demander (juste pour cette zone ) mais je demanderais plus tard.
Oui si je me souviens bien , il te manque bien une ligne.
Je me souviens plus comment elle s'appellet et si elle fait appel à une biblio.
Et je ne peux pas vérifier.
donc Avis aux scripteurs de bien vouloir l'aider cela serait sympa de votre part .

Je crois que c'est du style GenerateTreasure();


Mais je ne suis pas sur du tout.


Pour le reste, je ne peux pas te le scripter sur place, je suis désolé :/, je n'ai pas assez de temps:/
J'ai trouvé un script de génération de trésor dans SoU, me reste plus qu'à intégrer ça je sais pas comment...

Code PHP:

//::///////////////////////////////////////////////////
//:: X0_O2_ANYMED.NSS
//:: OnOpened/OnDeath script for a treasure container.
//:: Treasure type: Any, random selection from whatever is in base container
//:: Treasure level: TREASURE_TYPE_MED
//::
//:: Copyright (c) 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 11/21/2002
//::///////////////////////////////////////////////////

#include "x0_i0_treasure"

void main()
{

    
CTG_CreateTreasure(TREASURE_TYPE_MEDGetLastOpener(), OBJECT_SELF);


l'appel de fonction GenerateNPCTreasure(); se trouve dans le onspawn du monstre et non dans le ondeath...

c'est au moment de sa creation que le tresor est mis dans son sac...

pour les objets, c'est des trucs du genre : nw_o2_generallow,nw_o2_generalmed, nw_o2_generalmid

dans le ondeath et onopen

ca c'est pour nwn normal.. je sais que dans SoU ils ont rajouté un nouveau system de tresor.. je te conseille de regarder le forum de bioware dans la partie scripting et faire un search sur "sou" et "treasure"... ( dont tu as dailleur trouvé le script pour les objets..)

il est fatigué ou quoi notre simkin ?
Vi tu as totalement vrai Tonton. J'ai fais la même erreur que tout à l'heure sur un autre post, je voulais mettre onSpawn mais j'ai mis à la place Ondeath car j'y étais en train d'y penser.
Désolé pour mon erreur
J'ai jeté un oeil au script dans le OnSpawn et (en dehors du fait que j'ai pas compris grand chose) j'ai remarqué qu'il y avait X0_I0_TREASURE en include.
Ce script est celui de la génération de trésor façon SoU.

Si j'ai bien compris ce que ça raconte (ce qui n'est peut-être pas le cas), ça doit chercher dans le module la présence des coffres de base (ceux qui ont SoU comprendront) puis prendre aléatoirement un des élément du coffre appelé et le mettre dans le coffre que le PJ ouvre (ou sur le monstre qu'il tue). S'il n'y a pas de coffre de base dans le module, le script revient à l'ancien mode de trésor (aléatoire et suivant le niveau).

Je crois avoir compris ce qui ne va pas en fait.

Code PHP:

// * this is the percent chance that no treasure will be spawned by a creature dying
const int BK_CHANCE_OF_N0_MONSTERTREASURE 80
Me reste qu'à tester avec un 0 au lieu du 80.

[Edit] Et ben non, c'est pas ça...
Après avoir repris un script du Vault et l'avoir modifié, j'ai ça dans le OnSapwn des créatures.

Code PHP:

#include "NW_O2_CONINCLUDE"
#include "NW_I0_GENERIC"

void main()
{

        {
            
int value d10();
            if (
value <= 6)
            {
                
GenerateTreasure(TREASURE_MEDIUMOBJECT_SELFOBJECT_SELF);
                
GenerateTreasure(TREASURE_MEDIUMOBJECT_SELFOBJECT_SELF);
                
GenerateTreasure(TREASURE_MEDIUMOBJECT_SELFOBJECT_SELF);
            }
            else
            {
                
GenerateTreasure(TREASURE_MEDIUMOBJECT_SELFOBJECT_SELF);
                
GenerateTreasure(TREASURE_MEDIUMOBJECT_SELFOBJECT_SELF);
                
GenerateTreasure(TREASURE_HIGHOBJECT_SELFOBJECT_SELF);
            }

        }

Bon, le bon côté, c'est que les créatures donnent des objets. Le mauvais c'est que ce qu'elles donnent est vraiment nul...
M'enfin, on peut pas tout avoir...

Et pour la question subsidiaire ?
J'ai un peu besoin de la question subsidiaire moi .

Je recommence :
Dans le OnClose de Chest_01 (un coffre)
Si Item_01 est dedans alors :
- détruit Item_01
- applique un effet visuel sur Chest_01 (dissipation de la magie, mais juste le visuel)
- crée Item_02, Item_03 et Item_04 dans Chest_01
Sinon ne fait rien.
Je sais que c'est un script simple, mais pour moi c'est compliqué.
Code PHP:

void main()
{
int nXP_amount             5;
string sMESS_GRATZ      "Felicitation, tu as trouvé la solution de l'enigme du barde fou";
string sRESREF_OBJET_FILS1 "Item_02";
string sRESREF_OBJET_FILS2 "Item_03";
effect eFX                        EffectVisualEffect(VFX_IMP_DISPEL);
object oItem                   GetFirstItemInInventory(OBJECT_SELF);
object oPC                      GetLastClosedBy();

while (
GetIsObjectValid(oItem))
    {
    if (
GetTag(oItem)=="TAG_RAN_MER"//ou GetName ou GetResref
        
{
        
DestroyObject(oItem);
        
GiveXPToCreature(oPCnXP_amount); 
        
SendMessageToPC(oPC,sMESS_GRATZ);
        
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eFX,oPC,1.0);
        
CreateItemOnObject(sRESREF_OBJET_FILS1,OBJECT_SELF,1); //A DUPLIQUER si tu veux plus qu'un objet apres l'operation.
        
}
    }

Hop, la suite .

PNJ_01 a la faction PNJ_01 (à 50 avec toutes les autres). Cependant, dans son dialogue il y a la possibilité que ça tourne mal. Si le PJ dit la mauvaise phrase, ça doit se finir en combat. Comment je fais pour rendre PNJ_01 hostile envers le PJ ? (comment je met sa faction à 0 envers le PJ).

A la mort de PNJ_01, un sort doit disparaître. Il s'agit simplement de supprimer Statue_01 et de le remplacer par Hechman_01 (le perso était transformé en statue et redevient normal). Je met quoi dans le OnDeath de PNJ_01 ?

Une autre question pour la route. Lorsque PNJ_01 aperçoit le PJ (même si celui-ci essais d'être discret) je veut qu'il lance le dialogue. Je met quoi dans le OnPerceived ?
Et le même script mais avec la condition Si le PNJ se dissimule, est invisible, etc., en bref s'il essais de passer, volontairement ou non, sans être vu ?

Rien de bien compliqué pour le scripteur moyen, mais au-delà de mes compétences de barde.

[Edit] Euh ??? Je crois que j'ai un problème avec ton script eM... Il s'est bien lancé quand j'ai fermé le coffre, mais en boucle... Je l'ai à peine modifié pourtant.

Code PHP:

void main()
{
int nXP_amount  250;
string sItem01 "mcloth012";
string sItem02 "wmgwn008";
string sItem03 "it_mpotion012";
effect eFX EffectVisualEffect(VFX_IMP_DISPEL);
object oItem GetFirstItemInInventory(OBJECT_SELF);
object oPC GetLastClosedBy();

while (
GetIsObjectValid(oItem))
    {
    if (
GetTag(oItem)=="Crypt_Tomb_03")
         {
        
DestroyObject(oItem);
        
GiveXPToCreature(oPCnXP_amount);
        
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eFX,oPC,1.0);
        
CreateItemOnObject(sItem01,OBJECT_SELF,1);
        
CreateItemOnObject(sItem02,OBJECT_SELF,1);
        
CreateItemOnObject(sItem03,OBJECT_SELF,5);
        }
    }

dans une action conséquente de conversation :
Code PHP:

void main()
{

object oPC GetPCSpeaker();

object oTarget;
oTarget OBJECT_SELF;

AdjustReputation(oPCoTarget, -50);


Dans le OnDeath de PNJ_01

Code PHP:

void main()
{

object oPC GetLastKiller();

if (!
GetIsPC(oPC)) return;

object oTarget;
oTarget GetObjectByTag("Statue_01");

DestroyObject(oTarget0.0);

object oSpawn;
location lTarget;
oTarget GetWaypointByTag("WP_STATUE_01");

lTarget GetLocation(oTarget);

oSpawn CreateObject(OBJECT_TYPE_CREATURE"resrefdelacreature"lTarget);//attention, RESREF de la créature, pas le tag


J'ai fait spawner la créature sur WP_STATUE_01, donc oublie pas de créer ce point de passage

Dans le OnPerceived de PNJ_01

Code PHP:

void main()
{

object oPC GetLastPerceived();

if (!
GetIsPC(oPC)) return;

if (!
GetLastPerceptionSeen()) return;
object oTarget;
oTarget GetObjectByTag("PNJ_01");

AssignCommand(oTargetActionStartConversation(oPC"à définir"));



Citation :
Et le même script mais avec la condition Si le PNJ se dissimule, est invisible, etc., en bref s'il essais de passer, volontairement ou non, sans être vu ?
Là je vois pas bien ce que tu veux... Tu veux que si le pj est dissimuler le dialogue ne se fasse pas?

bon pour les autres script j'ai rien tester donc pas sûr que ça marche.
Code PHP:

void main()
{
int nXP_amount  250;
string sItem01 "mcloth012";
string sItem02 "wmgwn008";
string sItem03 "it_mpotion012";
effect eFX EffectVisualEffect(VFX_IMP_DISPEL);
object oItem GetFirstItemInInventory(OBJECT_SELF);
object oPC GetLastClosedBy();

while (
GetIsObjectValid(oItem))
    {
    if (
GetTag(oItem)=="Crypt_Tomb_03")
         {
        
DestroyObject(oItem);
        
GiveXPToCreature(oPCnXP_amount);
        
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eFX,oPC,1.0);
        
CreateItemOnObject(sItem01,OBJECT_SELF,1);
        
CreateItemOnObject(sItem02,OBJECT_SELF,1);
        
CreateItemOnObject(sItem03,OBJECT_SELF,5);
        }
    
oItem GetNextItemInInventory(OBJECT_SELF);
    }


c'est ma faute : rassure toi, meme non modifié, ca aurait pas fonctionné ^^
Bon, maintenant le script de la tombe marche... partiellement.
Je met l'objet, je referme la tombe, je gagne 250 xp, il y a un joli effet visuel, j'ouvre la tombe, l'objet n'est plus là (normal), mais aucun des objets n'est créé dedans.

Pourquoi ça marche pas ? Normallement j'ai prit les bon resref. Fallait prendre le tag ?
Est-il possible de mettre une variable à l'ouverture d'un livre ?
Ce que je voudrais, c'est que si le PJ ouvre le livre, il est au courant de ce qui est écrit dessus, et donc il a accès aux options de dialogue relatives au contenu du livre. Par contre, s'il ne le lis pas...

Et pour la question précédente ?
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés