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


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 06/12/2005 22:19:39 Sujet du message : [Résolu] Script pour qu'un PNJ utilise un pouvoir unique.

Bonsoir à tous, je suis nouveau sur ce forum, cela fait un an environ que je tente de faire des modules pour Nwn.
Voilà, je cherche désespérément depuis des heures le moyen de permettre à un PNJ d'utiliser le pouvoir unique d'un item.
Auriez-vous des suggestions ?
Merci par avance.
Dernière édition par Enki le 28/12/2005 11:53:35; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Anthraxcite
Légende vivante
Inscrit le: 12 Juin 2004
Messages: 372
Localisation: Belgique
Répondre en citant
Posté le : 07/12/2005 09:07:15 Sujet du message :

Je n'ai jamais testé mai si je devis faire ça j'essayerais quelque chose comme ceci :
NWScript :
object oModule = GetModule();
SignalEvent(oModule,EventActivateItem(oItem,lCible,oPNJ));
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 ayant bien sur défini le oItem, la location lCible et le PNJ oPNJ.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
Yoyo
Seigneur
Inscrit le: 31 Aoû 2003
Messages: 223
Répondre en citant
Posté le : 07/12/2005 14:19:29 Sujet du message :

Essai peu etre avec ça :

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.


Même si je reste séptique.

Et puis pourquoi faure utiliser un objet par un PNJ?? il faut juste scripter sans passer par un objet...
_________________
BOUH! (je vous ai fait peur ??) désolé

Vive moi
Pas vive Securom
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Elandil2
Chevalier
Inscrit le: 14 Fév 2005
Messages: 97
Localisation: sur mon ordi loir-et-cher
Répondre en citant
Posté le : 07/12/2005 18:36:22 Sujet du message :

Pour utiliser le pouvoir spécial d'un objet, Lorsqu'un PJ utilise l'objet, on passe par le OnActivateItem du module, Je pense donc, que pour un PNJ ca doit être pareil, il fayudrais chercher à lui faire activer l'objet, tout simplement.
(J'ai pas l'éditeur sous les yeux mais si je trouve je te fait signe ^^)
_________________
Rejoignez nous sur notre forum
Aelor, module en construction
Vive Gimli

 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 07/12/2005 19:44:07 Sujet du message : J'ai trouvé !

Bonsoir à tous,
Et merci à Anthraxcite, Elandil2 et Yoyo pour leurs réponses.
J'avais déja tenté sans succès la solution de Yoyo, mais c'est grâce à Anthraxcite que j'ai réussi à faire ce que je voulais. Mais cette solution ne fonctionne pas telle quelle. En fait j'ai fait ceci :
NWScript :

object oPNJ = GetObjectByTag("tag du pnj");
object oCible = GetObjectByTag("tag du pnj cible");
object oItem = GetObjectByTag("tag de l'item");
location lCible = GetLocation(oPNJ);
object oModule = GetModule();
AssignCommand(oPNJ,SignalEvent(oModule,EventActivateItem(oItem,lCible,oCible )));
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.


Le seul problème c'est que je ne sais pas à quoi sert de mettre la location de la cible puisqu'on la désigne en tant qu'object, et que ce champ semble obligatoire.
Voilà, en tout cas, merci encore.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 07/12/2005 20:00:13 Sujet du message :

Je pense que ça sert uniquement à envoyer dans l'évenement du module les informations qui y remplaceront les fonctions génériques de ce type d'évenement (GetItemActivator(), GetItemActivated() et GetItemActivatedTarget() GetItemActivatedTargetLocation()).

Mais une fois le script lancé avec les informations, c'est toi qui décide de t'en servir ou pas, comme dans le cas général en fait, les objets et positions existent, mais tu n'a pas forcément à t'en servir. Donc si pour cet objet ton script ne se sert pas de GetItemActivatedTargetLocation(), tu peux mettre n'importe quoi comme position, ça ne changera pas le résultat.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
ballestolive
Ecuyer
Inscrit le: 15 Nov 2005
Messages: 64
Localisation: A 35 KM Sud de Paris.
Répondre en citant
Posté le : 26/12/2005 20:24:44 Sujet du message :

Il a l'air simpa ce script.. Justement je cherche un truc dans ce genre mais étant un nul je me demande juste, On le met ou ce script pour que cela fonctionne.

PS: j'ai trouve ce post grace à a fonction recherche, car j'ai aussi besoin qu'un PNJ active un objet à pouvoir unique ( dritzz pour qu'il invoque sa panthère Guwen !!!

Merci pour vos futurs réponses.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 27/12/2005 12:46:09 Sujet du message : Où le placer ?

Bonjour,
Ce script se place dans un trigger, je l'ai fait pour comprendre comment faire, mais dans mon module, il est légèrement différent, en fait j'ai modifier l'IA des pnj pour qui'ils utilisent aléatoirement un objet magique bien défini toutes les trois fois qu'ils se font toucher. Si ça t'intéresse, je peux le poster.
A bientôt !
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
ballestolive
Ecuyer
Inscrit le: 15 Nov 2005
Messages: 64
Localisation: A 35 KM Sud de Paris.
Répondre en citant
Posté le : 27/12/2005 13:16:00 Sujet du message :

Salut,

Je pige pas là. Comment tu peux le mettre dans un trigger et que le PNJ l'utilise.
Moi je cherche plutot un truc qui fasse que dritzz active cet objet à ouvoir unique dès qu'ilest attaqué.

Merci pour la réponse.

PS: tu modifie l'IA des PNJ... ou la la trop balaise pour moi cela !!! Surprised
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 27/12/2005 14:18:36 Sujet du message :

Pour le fun voici le script tn_mod_def_act (sur le OnActivateItem) du TN Bouchon
une pièce de musée vu le monde qui est passé dessus Very Happy
Vous y trouverez pleins de références à des items à pouvoir unique sur soi ou autres.
Bonne lecture

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 :
//:Confused///
//:: Update Lylver 2005-09-17
//:: added restarter
//:: + Cache Database
//:Confused///
//:: Update Lylver 2005-09-01
//:: added Items RP from SoW
//:Confused///
// activate_items - Script reecrit par astre - 18/5/03
//  Modified by Bilaes March 2005

// FastFrench 13/1/03
// renvoie TRUE si pas un DM (et detruit l'objet), FALSE c'est un DM qui utilise l'objet
int DestroyIfNotDM(object oItem, object oActivator)
    {
    if  (GetIsDM(oActivator)) return FALSE;

    // Check to make sure that the Activator is a NPC played by a DM
    object oTest = GetFirstPC();
    string sTestName = GetPCPlayerName(oActivator);
    while (GetIsObjectValid(oTest))
        {
        if (GetPCPlayerName(oTest) == sTestName)
            {
            DestroyObject(oItem);
            SendMessageToPC(oActivator, "Cet objet appartient aux Dieux et n'est pas fait pour les mains d'un simple mortel !");
            return TRUE;
            }
        oTest=GetNextPC();
        }
  return FALSE;
  }

#include "x2_inc_switches"
#include "nw_o0_itemmaker"
#include "getobjectlevel"
#include "nw_i0_spells"

int DestroyLeveledObjectAndPay(object oItem, object oActivator, object oTarget
    , int iLvl )
{
    location lLoc;
    if (GetIsDM(oActivator))
    {
    lLoc=GetLocation(oActivator);
    if (!GetIsPC(oTarget))  // dont destroy PC !!
        {
            int iVal= GetGoldPieceValue(oTarget);
            int iLevel=GetObjectLevel(iVal);
            SendMessageToPC(oActivator, "Essai de destuction objet "+IntToString(iVal)
                    +" level "+IntToString(iLevel));
            if (iLevel >= iLvl)
            {
                object oPossessor =GetItemPossessor(oTarget);
                if (GetIsObjectValid(oPossessor))
                { // object in inventory so give 75% gold to ownner
                    GiveGoldToCreature(oPossessor,(iVal*75)/100);
                }
                DestroyObject(oTarget);
                SendMessageToPC(oActivator, "objet detruit valeur "+IntToString(iVal)
                    +" level "+IntToString(iLevel));
            }
        }
    // trial to compensated for abnormal movement
    // still not good...
    AssignCommand(oActivator, JumpToLocation(lLoc));
    return FALSE;
    }

    // Check to make sure that the Activator is a NPC played by a DM
    object oTest = GetFirstPC();
    string sTestName = GetPCPlayerName(oActivator);
    while (GetIsObjectValid(oTest))
        {
        if (GetPCPlayerName(oTest) == sTestName)
            {
            DestroyObject(oItem);
            SendMessageToPC(oActivator, "Les objets des dieux ne sont pas pour vous");
            return TRUE;
            }
        oTest=GetNextPC();
        }
  return FALSE;
}


void main()
{
object  oItem      = GetItemActivated();              // get the item activated
string  sItemTag  = GetTag(oItem);                    // and its tag
string  sItemName  = GetName(oItem);                  // and its name
object  oActivator = GetItemActivator();              // get the wand's activator
object  oTarget    = GetItemActivatedTarget();        // get the target
string sTargetTag = GetTag(GetItemActivatedTarget());  // and its tag
location lTargetLoc = GetItemActivatedTargetLocation(); // Get the Location
location lDM =GetLocation(oActivator);

ExecuteScript("dmfi_activate",OBJECT_SELF);

// pour activer les script de meme nom que le tag de l'objet
// evite de modifier ce script pour chaque nouvel objet
// voir x2_it_example et x2_mod_def_act pour exemple
// bilaes 24/4/05
SetUserDefinedItemEventNumber(X2_ITEM_EVENT_ACTIVATE);
int nRet =  ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF);
if (nRet==X2_EXECUTE_SCRIPT_END) return;

if(sItemTag=="Debugger")
{
  SendMessageToPC(oActivator,"Tag "+ sTargetTag +" Nom "+ GetName(oTarget));
}

// destruct object with lvl > 5
if(sItemTag=="DMLeveledObjectDestructor")
  if (!DestroyLeveledObjectAndPay(oItem, oActivator, oTarget, 5))
      {
      AssignCommand(oActivator,JumpToLocation(lDM));
      return;
      //SetLocalObject(oActivator, "dmwandtarget", oTarget);                            // Put target info into local vars on activator
      //SetLocalLocation(oActivator, "dmwandloc", lTargetLoc);
      //AssignCommand(oActivator, ActionStartConversation(oActivator, "dmwand", TRUE)); // Start the conversation with itself
      }

if(sItemTag=="boispourfeudecamp")
      {
      CreateObject(OBJECT_TYPE_PLACEABLE,"feudecamp",lTargetLoc,TRUE);
      return;
      }

if(sItemTag=="tentedebivouacpliee")
      {
      CreateObject(OBJECT_TYPE_PLACEABLE,"tentedebivouac",lTargetLoc,TRUE);
      return;
      }

if(sItemTag=="Sacmort")
      {
      int iHP=GetCurrentHitPoints(oTarget);
      if ( iHP<=0 && GetIsPC(oTarget)
            && GetLocalObject(oActivator, "DeadPC")==OBJECT_INVALID )
      {
        SendMessageToPC(oActivator,"Prendre mort");
        ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oTarget);
        AssignCommand(oTarget,ClearAllActions());
        AssignCommand(oTarget,JumpToLocation(GetLocation(GetObjectByTag("fonddusac"))));
        SetLocalObject(oActivator,"DeadPC",oTarget);
        SetLocalObject(oTarget,"DeadPC",oActivator);
      }
      else
      {
        object oDeadPC=GetLocalObject(oActivator,"DeadPC");
        if (oDeadPC !=OBJECT_INVALID)
        {
            SendMessageToPC(oActivator,"Poser mort");
            AssignCommand(oDeadPC,ClearAllActions());
            AssignCommand(oDeadPC,JumpToLocation(lDM));
            DeleteLocalObject(oActivator,"DeadPC" );
            DeleteLocalObject(oDeadPC,"DeadPC" );
        }
      }
      return;
      }

//if(sItemTag=="gemmeantimagie") // gemme anti magie pour se nettoyer
/*{
    int i =1;
    while (i<=33)
    {
        int nSpel=GetSpellBreachProtection(i);
        RemoveProtections(nSpel,oActivator,1);
        i=i+1;
    }
    RemoveProtections(SPELL_BARKSKIN,oActivator,1);
    RemoveProtections(SPELL_ETHEREALNESS,oActivator,1);
    RemoveProtections(SPELL_SHADES_STONESKIN,oActivator,1);
    RemoveProtections(SPELL_GREATER_STONESKIN,oActivator,1);
    RemoveProtections(SPELL_CAMOFLAGE,oActivator,1);
    RemoveProtections(SPELL_INVISIBILITY,oActivator,1);
    RemoveProtections(SPELL_IMPROVED_INVISIBILITY,oActivator,1);
    RemoveProtections(SPELL_SHADOW_CONJURATION_INIVSIBILITY,oActivator,1);
    RemoveProtections(SPELL_GREATER_SHADOW_CONJURATION_MIRROR_IMAGE,oActivator,1);
    RemoveSpecificEffect(EFFECT_TYPE_ETHEREAL,oActivator);
    RemoveSpecificEffect(EFFECT_TYPE_SANCTUARY,oActivator);
}

*/
if(sItemTag=="levelwandNODROP") // pour filler le bon automatiquement
  {
  int olevel = GetHitDice (oTarget);
  if (olevel < 5 )
        if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv5NODROP")) )
            CreateItemOnObject("passniv5",oTarget,1);
  if (GetIsDM(oActivator))
    {
    if (olevel < 10  && olevel >= 5 )
        if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
            CreateItemOnObject("passniv10",oTarget,1);

    if (olevel < 15 && olevel >= 10 )
        if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
            CreateItemOnObject("passniv15",oTarget,1);
    if (olevel == 15 )
        if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
            CreateItemOnObject("passniv16",oTarget,1);
    if (olevel == 16 )
        if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
            CreateItemOnObject("passniv17",oTarget,1);
    if (olevel == 17 )
        if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
            CreateItemOnObject("passniv18",oTarget,1);
    if (olevel == 18 )
      if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
          CreateItemOnObject("passniv19",oTarget,1);
    if (olevel == 19 )
        if (!GetIsObjectValid(GetItemPossessedBy(oTarget, "passniv10NODROP")) )
            CreateItemOnObject("passniv20",oTarget,1);
    }
  }

if(sItemTag=="DMsHelper") // DM Helper
  if (!DestroyIfNotDM(oItem, oActivator))
      {
      SetLocalObject(oActivator, "dmwandtarget", oTarget);                            // Put target info into local vars on activator
      SetLocalLocation(oActivator, "dmwandloc", lTargetLoc);
      AssignCommand(oActivator, ActionStartConversation(oActivator, "dmwand", TRUE)); // Start the conversation with itself
      return;
      }



if(sItemTag=="AutoFollow")
      {
      if(GetIsObjectValid(oTarget))
        AssignCommand (oActivator,ActionForceFollowObject(oTarget,3.0));
      return;
      }



if(sItemTag=="WandOfFX")
  if (!DestroyIfNotDM(oItem, oActivator))
      {
      SetLocalObject(oActivator, "FXWandTarget", oTarget);                            // Put target info into local vars on activator
      SetLocalLocation(oActivator, "FXWandLoc", lTargetLoc);
      AssignCommand(oActivator, ActionStartConversation(oActivator, "fxwand", TRUE)); // Start the conversation with itself
      return;
      }

if(sItemTag=="EmoteWand")
      {
      AssignCommand(oActivator, ActionStartConversation(oActivator, "emotewand", TRUE));
      return;
      }

if(sItemTag=="SMGAmuletdepouvoir")
    {
    effect eDeath = EffectDeath(FALSE, FALSE);
    ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oActivator);
    DestroyObject(oItem);
    return;
    }

if(sItemTag=="setdemenottes")
    {
    if (GetIsPC (oTarget))
        {
        if ( GetItemPossessedBy(oTarget , "menoNODROP")  == OBJECT_INVALID)
            {
            CreateItemOnObject("menonodrop", oTarget, 1);
            SendMessageToPC(oActivator, "vous venez de verrouiller des menottes");
            }
        else
            {
            DestroyObject ( GetItemPossessedBy(oTarget, "menoNODROP"));
            SendMessageToPC(oActivator, "vous venez de retirer des menottes");
            }
        }
    return;
    }




if(sItemTag=="DMRodofAffliction")
  if (!DestroyIfNotDM(oItem, oActivator))
    {
    SetLocalObject(oActivator, "RoATarget", oTarget);    // Store the Target Info on the Activator
    SetLocalLocation(oActivator, "RoALoc", lTargetLoc);  // Store location for possible Future Use

    // Check to be sure the target is a PC, if so, Start the Conversation
    if (GetIsPC(oTarget) == TRUE)
      // Start the Conversation
      AssignCommand(oActivator, ActionStartConversation(oActivator, "cv_roa", TRUE));
    else
      // Send a message to the DM that the target is not a PC
      SendMessageToPC(oActivator, "Invalid Target");
      return;
      }


if(sItemTag=="OeufdeDmon")
    {
    location lWhere = GetLocation (oActivator);
    ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_1),lWhere,1.0);
    CreateObject(OBJECT_TYPE_CREATURE,"dmonticule",lWhere, TRUE);
    return;
    }

//botte de vitesse dont le tag doit etre : bottesdevitesX X etant le nombre de round ou la botte fonctionne
if (GetStringLeft(sItemTag,13) == "bottesdevites")
    {
    int iPow = StringToInt(GetSubString(sItemTag, 13, GetStringLength(sItemTag)-13));
    int iPower = iPow * 2;
    object objetpied = GetItemInSlot(INVENTORY_SLOT_BOOTS, oActivator) ;
    if (objetpied == oItem)
        {
        SignalEvent(oActivator, EventSpellCastAt(oActivator, SPELL_HASTE, FALSE));
        ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectHaste(), oActivator, RoundsToSeconds(iPower));
        DelayCommand(12.0, ExecuteScript("test_botte", oActivator));
        SetLocalInt(oActivator,"tempbotte",iPow);
        }
    else
        {
        SignalEvent(oActivator, EventSpellCastAt(oActivator, SPELL_SLOW, FALSE));
        ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oActivator, RoundsToSeconds(iPower/2));
        }
    }

//Items de transformation en machin-garous...
if (sItemTag == "chatNODROP")
{      ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
      ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_WERECAT),oActivator);
      return;
}
if (sItemTag == "ratNODROP")
{      ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
      ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_WERERAT),oActivator);
      return;
}
if (sItemTag == "loupNODROP")
{      ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
      ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_WEREWOLF),oActivator);
      return;
}
if (sItemTag == "sucuNODROP")
{      ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
      ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_SUCCUBUS),oActivator);
      return;
}
if (sItemTag == "pingNODROP")
{      ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
      ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_PENGUIN),oActivator);
      return;
}
if (sItemTag == "baloNODROP")
{      ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POLYMORPH),oActivator);
      ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectPolymorph(POLYMORPH_TYPE_BALOR),oActivator);
      return;
}

// Pierres de rappel
int bHasGoodStone    = GetItemPossessedBy(oActivator, "pierre_sacree2")  != OBJECT_INVALID;
int bHasEvilStone    = GetItemPossessedBy(oActivator, "pierre_mal")  != OBJECT_INVALID;
int bHasNeutralStone = GetItemPossessedBy(oActivator, "pierre_univ")  != OBJECT_INVALID;
int bHasKarakStone = GetItemPossessedBy(oActivator, "pierrerappelkarak")  != OBJECT_INVALID;
int bSource = GetItemPossessedBy(oActivator,"PIERRE_SOURCE") != OBJECT_INVALID;
int bhasMenotte      = GetItemPossessedBy(oActivator, "menoNODROP")  != OBJECT_INVALID;
//
int bUseGoodStone    = sItemTag == "pierre_sacree2";
int bUseEvilStone    = sItemTag == "pierre_mal";
int bUseNeutralStone = sItemTag == "pierre_univ";
int bUseKarakStone = sItemTag == "pierrerappelkarak";
int bUseSource = sItemTag == "PIERRE_SOURCE"; // Temple d'Ares Marseille "La Source"

if( bUseGoodStone || bUseEvilStone || bUseSource ||
    bUseNeutralStone || bUseKarakStone ){        // Une pierre de rappel a ete utilisee
  string tArea = GetTag(GetArea(oActivator));
  int iArea = StringToInt(GetSubString(tArea, 5, GetStringLength(tArea)-5));
  if( bHasGoodStone + bHasEvilStone + bHasNeutralStone +
      bHasKarakStone + bhasMenotte + bSource == 1 ){  // Il n'en possede bien qu'une
      if( (iArea>=140 && iArea<=179) || (iArea>=190 && iArea<=199) ){ // ceci n'est plus valide : a corriger
        SendMessageToPC(oActivator,"Les puissantes protections magiques de cet endroit empechent votre pierre de fonctionner");
        return;
      } else {
        location LastRecallUsed;                                          // Set the location variable
        LastRecallUsed = GetLocation(oActivator);                          // Get the location, fill up the variable
        SetLocalLocation(oActivator,"LastRecallUsed",LastRecallUsed);      // Set where the portal jump the player to
        SetLocalInt(oActivator,"HasRecalled",1);                          // To make the recall poretal tells the player if he want to go back
        ActionCastFakeSpellAtObject ( SPELL_DISMISSAL , oActivator);
        int bFighting = 0;
        int nHD = GetHitDice(oActivator);
        if (GetIsInCombat(oActivator)) bFighting = 1;
        //{SendMessageToPC(oActivator,"Vous n'arrivez pas a vous concentrer suffisamment pendant le combat pour utiliser cette pierre de rappel"); return;}
        int nXP = GetXP(oActivator);
        int nPenalty = 0;
        int nGoldPenalty = nHD * nHD * nHD;
        if (bFighting) nPenalty = nHD*nHD;
        if (bFighting) nGoldPenalty *= 4;
        // * You can not lose a level with this respawning
        int nMin = ((nHD * (nHD - 1)) / 2) * 1000;
        if( GetGold(oActivator)<nGoldPenalty)
            nGoldPenalty = GetGold(oActivator);
        int nNewXP = nXP - nPenalty;
        if (nNewXP < nMin)
            nNewXP = nMin;
        SetXP(oActivator, nNewXP);
        TakeGoldFromCreature(nGoldPenalty, oActivator, TRUE);
        string sDest ;
        if (bUseGoodStone) sDest = "catdrale_tele" ; // Get the player to the temple
        if (bUseEvilStone) sDest = "maison" ;    // Get the player to the temple
        if (bUseNeutralStone) sDest = "temple_venus" ;  // Get the player to the temple
        if (bUseKarakStone) sDest = "karak_rappel" ;  // Get the player to Karak
        if( bUseSource ) sDest = "RAPPEL_ARES" ;  // Envoie Joueur au Temple de la Guerre
        object oDest = GetObjectByTag(sDest) ;
        if( GetIsObjectValid(oDest) ){
            AssignCommand(oActivator,JumpToObject(oDest));
        } else {
            string sMessage = "Destination invalide pour la pierre de Rappel" ;
            SendMessageToAllDMs(sMessage);
            SendMessageToPC(oActivator,sMessage);
            WriteTimestampedLogEntry(sMessage);
        }
        // if (bUseSource) AssignCommand(oActivator,JumpToLocation(GetLocation(GetObjectByTag("RAPPEL_SOURCE"))));  // Envoie Joueur au Sanctuaire de la Source
      }
      return;
  }
}
// LES BOUCHOMONS

if (sItemTag == "Bouchoballe")
    {
    string sBouchomon= GetStringRight(sTargetTag,5);
        if (sBouchomon == "_bmon")
        {
            if (GetMaster(oTarget) == oActivator || GetMaster(oTarget) == OBJECT_INVALID)
            {
            string sNewball = sTargetTag+"_ball";
            ApplyEffectToObject (DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_GLOBE_USE),oTarget);
            DestroyObject (oTarget);
            DestroyObject(oItem);
            CopyObject (oItem,lTargetLoc,oActivator,sNewball);
            FloatingTextStringOnCreature ("vous avez attrape "+GetName(oTarget), oActivator);
            }
        }
    return;
    }


if (GetStringRight(sItemTag,5) == "_ball")
        {
        /*RemoveSummonedAssociate(oActivator,GetAssociate(ASSOCIATE_TYPE_HENCHMAN,oActivator));  //au cas ou...
        ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_1), lTargetLoc);
        object oBouchomon = CreateObject(OBJECT_TYPE_CREATURE, GetStringLeft(sItemTag,10), lTargetLoc, TRUE);
        DestroyObject(oItem);
        CreateItemOnObject("bouchoballe",oActivator,1);
        AddHenchman(oActivator,oBouchomon);
        FloatingTextStringOnCreature ("vous avez relache "+GetName(oBouchomon), oActivator);
        */
        FloatingTextStringOnCreature ("periode de test, vous ne pouvez pas relacher de Bouchomon", oActivator);
        return;
        }



// WriteTimestampedLogEntry("[ACTIVATE] object inconnu utilise par "+GetName(oActivator)+": "+sItemName+" (tag:"+sItemTag+")");

// Begin Lylver 2005-09-01
  if(sItemTag=="SOW_BUCHE")
  {
      ExecuteScript("sow_campfire",oActivator);
      return;
  }
  if(sItemTag=="SOW_CHAUDRON")
  {
      ExecuteScript("sow_campfir2",oActivator);
      return;
  }
  if(sItemTag=="SOW_BROCHE")
  {
      ExecuteScript("sow_campfir3",oActivator);
      return;
  }
  if(sItemTag=="SOW_TENTE")
  {
      ExecuteScript("sow_campfir4",oActivator);
      return;
  }
  if(sItemTag=="SOW_BALAIS")
  {
      ExecuteScript("sow_balais",oActivator);
      return;
  }
  if(sItemTag=="SOW_FLUTEPAN")
  {
      ExecuteScript("_flute",oActivator);
      return;
  }
  if(sItemTag=="SOW_GUITARE")
  {
      ExecuteScript("_luth",oActivator);
      return;
  }
  if(sItemTag=="SOW_LUTH")
  {
      ExecuteScript("_luth",oActivator);
      return;
  }
  if(sItemTag=="SOW_HARP")
  {
      ExecuteScript("_harp",oActivator);
      return;
  }
  if(sItemTag=="SOW_TAMBOURIN")
  {
      ExecuteScript("_tamborine",oActivator);
      return;
  }
  if(sItemTag=="SOW_MUS_ARCHET")
  {
      if( d2() == 1) ExecuteScript("mus_celte2",oActivator);
      else ExecuteScript("mus_celte9",oActivator);
      return;
  }
  if(sItemTag=="SOW_MUS_ARCHET1")
  {
      ExecuteScript("mus_celte2",oActivator);
      return;
  }
  if(sItemTag=="SOW_MUS_ARCHET2")
  {
      ExecuteScript("mus_celte9",oActivator);
      return;
  }
  if(sItemTag=="SOW_MUS_HARP")
  {
      ExecuteScript("mus_celte1",oActivator);
      return;
  }
  if(sItemTag=="SOW_MUS_LUTH")
  {
      ExecuteScript("mus_celte7",oActivator);
      return;
  }
  if(sItemTag=="SOW_POT_NOINVI")
  {
      ExecuteScript("sow_visible",oActivator);
      return;
  }
  if(sItemTag=="SOW_SEAU")
  {
      ExecuteScript("sow_seau",oActivator);
      return;
  }
  if(sItemTag=="SOW_TENTEB")
  {
      ExecuteScript("sow_campfir5",oActivator);
      return;
  }
// End Lylver 2005-09-01
// Begin Lylver 2005-09-17
  if(sItemTag=="SOW_VRAI_GAROU")
  {
      ExecuteScript("sow_poly_garou",oActivator);
      return;
  }
  if(sItemTag=="RESTARTTN")
  {
      location lTarget = GetLocation(oTarget);
      effect eVis = EffectVisualEffect(VFX_FNF_TIME_STOP);
      effect eTime = EffectTimeStop(); // Note : arrete l'horloge PC ca
      SetLocalInt(GetModule(),"REBOOT",TRUE); // indicateur pour les process differes
      SignalEvent(GetModule(), EventUserDefined(200)); // Update PC Database
      DelayCommand(4.0 ,SignalEvent(GetModule(), EventUserDefined(600))) ; // Flush Database
      SignalEvent(oActivator, EventSpellCastAt(oActivator, SPELL_TIME_STOP, FALSE));
      DelayCommand(0.75, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eTime, oActivator, 3.0));
      object oPC=GetFirstPC() ;
      while( GetIsObjectValid(oPC) ){
        ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oPC));
        SendMessageToPC(oPC,"REBOOT A CHAUD DU MODULE");
        oPC = GetNextPC() ;
      }
      SignalEvent(GetModule(), EventUserDefined(604)) ; // reboot apres DB flush
      return;
  }
// End Lylver 2005-09-17
// Begin Lylver 2005-09-18
  if(sItemTag=="CHOCOLATINE")
  {
      ExecuteScript("tn_chocolatine",oActivator);
      return;
  }
  if(sItemTag=="TN_Q_CH_VIF_007")
  {
      ExecuteScript("tn_epeearadrim",oActivator);
      return;
  }
// End Lylver 2005-09-18
// Begin Lylver 2005-10-03 , change => erreur sur l'item
  if(sItemTag=="TN_DIV_ELVEN_HE")
  {
      ExecuteScript("tn_s0_elven_he",oActivator);
      return;
  }
// End Lylver 2005-10-03
// Begin Lylver 2005-10-30 , change => erreur sur l'item
  if(sItemTag=="TN_CTRL_PRIAM")
  {
      ExecuteScript("tn_ctrl_priam",oActivator);
      return;
  }
// End Lylver 2005-10-30
// Begin Lylver 2005-12-23
  if( (sItemTag=="TN_MAT_GUERISON") ){
      ExecuteScript("tn_craft_medkit",oActivator);
      return;
  }
// End Lylver 2005-12-23
WriteTimestampedLogEntry(GetName(oActivator)+" utilise "+sItemTag+" "+GetResRef(oItem)) ;
}
Le code a colorer syntaxiquement est trop long (plus de 10240 caractères) et risque de ne pas s'afficher du tout. Vous pouvez le voir en version colorée ici.
 
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 : 27/12/2005 16:41:10 Sujet du message :

Merci pour ton script Lylver, il a l'air très intéressant;
Ballestolive, en fait, quand le joueur marche sur le trigger, un script se déclenche et demande au PNJ (tu mets le tag "dritzz" à la place de "tag du PNJ") d'utiliser le pouvoir unique de l'objet oItem sur le PNJ "tag du pnj cible". Mais si tu veux que dritzz utilise son objet à pouvoir unique une seule fois, dès qu'il est attaqué, tu vas devoir modifier l'IA de ton PNJ. Rassure-toi, c'est très simple Aurora te le permet grâce aux script OnUserDefined. Je vais faire un test avec les infos que tu as posté et je t'envoie les scripts !
 
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 : 27/12/2005 22:41:44 Sujet du message : Dritzz et sa panthère :

Bonsoir Ballestolive,
Voici comment faire pour que Dritzz utilise un objet pourque sa panthère apparaisse :

En premier tu places ton PNJ avec le tag "dritzz", puis dans la palette tu créés une panthère avec le tag "guwen" et le ResRef "guwen". Dans les propriétés du module > OnActivateItem, tu mets ce script :
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.


Tu mets comme tag pour l'objet qui sert à Dritzz pour appeler sa panthère : "appel_panthere"

Puis tu mets ce script dans ton module, mais dans aucune case en particulier :

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.


Il est impératif que ce script porte le même nom que le tag de l'objet utilisé : ici c'est "appel_panthere".
Enfin, pour modifier l'IA de ton pnj, tu dois faire une copie du script onSpawn du pnj et enlever les commentaires de cette ligne ( ligne 247) :
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.

Et rajouter :

NWScript :
SetLocalInt(OBJECT_SELF,"pouvoir",0);
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 dessous de cette ligne (297) :
NWScript :
// ***** ADD ANY SPECIAL ON-SPAWN CODE HERE ***** //
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.


enfin, dans la case onUserDefined de ton PNJ, tu mets cela :
NWScript :
void main()
{
    int nUser = GetUserDefinedEventNumber();

    if(nUser == 1005) // ATTACKED
    {

        object oAttacker = GetLastAttacker();
        object oItem=GetObjectByTag("appel_panthere");

        int nCount=GetLocalInt(OBJECT_SELF,"pouvoir");
        object oCible= GetAttackTarget();
        location oloc=GetLocation(OBJECT_SELF);
        object oModule=GetModule();


      if (nCount!=1)
          {
        AssignCommand(OBJECT_SELF,SignalEvent(oModule,EventActivateItem(oItem,oloc,oCible)));
        SetLocalInt(OBJECT_SELF,"pouvoir",1);
          }
          else
          {
                ActionAttack(oCible);
          }
}
}
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.


Et voilà, ton pouvoir est fait !
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
ballestolive
Ecuyer
Inscrit le: 15 Nov 2005
Messages: 64
Localisation: A 35 KM Sud de Paris.
Répondre en citant
Posté le : 28/12/2005 14:11:45 Sujet du message :

Je te remercie beaucoup.

Je vais mettre cela en place tout de suite.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
ballestolive
Ecuyer
Inscrit le: 15 Nov 2005
Messages: 64
Localisation: A 35 KM Sud de Paris.
Répondre en citant
Posté le : 28/12/2005 15:00:46 Sujet du message :

Bon Enki,

J'ai tout bien suivi et il me reste un petit PB le script OnSpown de mon PNJ ( Dritzz ) ne comporte apparement pas autant de ligne que le tien ???

Je te le copie ici:

NWScript :
//:Confused///////////////////////// /////////////////////
//:: Name x2_def_spawn
//:: Copyright (c) 2001 Bioware Corp.
//:Confused///////////////////////// ////////////////////
/*
    Default On Spawn script


    2003-07-28: Georg Zoeller:

    If you set a ninteger on the creature named
    "X2_USERDEFINED_ONSPAWN_E VENTS"
    The creature will fire a pre and a post-spawn
    event on itself, depending on the value of that
    variable
    1 - Fire Userdefined Event 1510 (pre spawn)
    2 - Fire Userdefined Event 1511 (post spawn)
    3 - Fire both events

*/

//:Confused///////////////////////// ////////////////////
//:: Created By: Keith Warner, Georg Zoeller
//:: Created On: June 11/03
//:Confused///////////////////////// ////////////////////

const int EVENT_USER_DEFINED_PRESPAWN = 1510;
const int EVENT_USER_DEFINED_POSTSPAWN = 1511;


#include "x2_inc_switches"
void main()
{
    // User defined OnSpawn event requested?
    int nSpecEvent = GetLocalInt(OBJECT_SELF,"X2_USERDEFINED_ONSPAWN_EVENTS");

    // Pre Spawn Event requested
    if (nSpecEvent == 1 || nSpecEvent == 3 )
    {
    SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_PRESPAWN ));
    }

    /*  Fix for the new golems to reduce their number of attacks */

    int nNumber = GetLocalInt(OBJECT_SELF,CREATURE_VAR_NUMBER_OF_ATTACKS);
    if (nNumber >0 )
    {
        SetBaseAttackBonus(nNumber);
    }

    // Execute default OnSpawn script.
    ExecuteScript("nw_c2_default9", OBJECT_SELF);


    //Post Spawn event requeste
    if (nSpecEvent == 2 || nSpecEvent == 3)
    {
    SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_POSTSPAWN));
    }

}
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.


Pourais tu me dire ou ext mon erreur STP.

Merci.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 28/12/2005 15:50:45 Sujet du message : Pas d'erreur !

Bonjour,
tu n'as pas fais d'erreur, ton jeu doit être plus récent, donc les scripts ne sont pas tout à fait les mêmes.
Il y a 2 possibilités :

1) Si tu utilises les pre et post spawn event de cette créature tu dois faire une copie du script OnSpawn de ta créature, et le renomer par exemple : "dritzz_spawn01".

Ensuite, tu vas modifier cette ligne de ton script :
NWScript :
// Execute default OnSpawn script.
ExecuteScript("nw_c2_default9", OBJECT_SELF);
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.

Le script "nw_c2_default9" est le script par défaut, celui auquel je faisais référence dans mon précédent message.
Ne touche pas à ce script.

Change la ligne ci dessus en :

NWScript :
// Execute default OnSpawn script.
ExecuteScript("dritzz_spawn02", OBJECT_SELF);
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.


Voici le script intégral "dritzz_spawn02", qui correspond au script "nw_c2_default9" en intégrant les modifications précitées :

NWScript :

/////name : "dritzz_spawn02"///////////////////
#include "x0_i0_anims"
// #include "x0_i0_walkway" - in x0_i0_anims
#include "x0_i0_treasure"

#include "x2_inc_switches"

void main()
{
    // ***** Spawn-In Conditions ***** //

    // * REMOVE COMMENTS (// ) before the "Set..." functions to activate
    // * them. Do NOT touch lines commented out with // *, those are
    // * real comments for information.

    // * This causes the creature to say a one-line greeting in their
    // * conversation file upon perceiving the player. Put [NW_D2_GenCheck]
    // * in the "Text Seen When" field of the greeting in the conversation
    // * file. Don't attach any player responses.
    // *
    // SetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION);

    // * Same as above, but for hostile creatures to make them say
    // * a line before attacking.
    // *
    // SetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERSATION);

    // * This NPC will attack when its allies call for help
    // *
    // SetSpawnInCondition(NW_FLAG_SHOUT_ATTACK_MY_TARGET);

    // * If the NPC has the Hide skill they will go into stealth mode
    // * while doing WalkWayPoints().
    // *
    // SetSpawnInCondition(NW_FLAG_STEALTH);

    //--------------------------------------------------------------------------
    // Enable stealth mode by setting a variable on the creature
    // Great for ambushes
    // See x2_inc_switches for more information about this
    //--------------------------------------------------------------------------
    if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_STEALTH) == TRUE)
    {
        SetSpawnInCondition(NW_FLAG_STEALTH);
    }
    // * Same, but for Search mode
    // *
    // SetSpawnInCondition(NW_FLAG_SEARCH);

    //--------------------------------------------------------------------------
    // Make creature enter search mode after spawning by setting a variable
    // Great for guards, etc
    // See x2_inc_switches for more information about this
    //--------------------------------------------------------------------------
    if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_SEARCH) == TRUE)
    {
        SetSpawnInCondition(NW_FLAG_SEARCH);
    }
    // * This will set the NPC to give a warning to non-enemies
    // * before attacking.
    // * NN -- no clue what this really does yet
    // *
    // SetSpawnInCondition(NW_FLAG_SET_WARNINGS);

    // * Separate the NPC's waypoints into day & night.
    // * See comment on WalkWayPoints() for use.
    // *
    // SetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING);

    // * If this is set, the NPC will appear using the "EffectAppear"
    // * animation instead of fading in, *IF* SetListeningPatterns()
    // * is called below.
    // *
    //SetSpawnInCondition(NW_FLAG_APPEAR_SPAWN_IN_ANIMATION);

    // * This will cause an NPC to use common animations it possesses,
    // * and use social ones to any other nearby friendly NPCs.
    // *
    // SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS);

    //--------------------------------------------------------------------------
    // Enable immobile ambient animations by setting a variable
    // See x2_inc_switches for more information about this
    //--------------------------------------------------------------------------
    if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_AMBIENT_IMMOBILE) == TRUE)
    {
        SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS);
    }
    // * Same as above, except NPC will wander randomly around the
    // * area.
    // *
    // SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS);


    //--------------------------------------------------------------------------
    // Enable mobile ambient animations by setting a variable
    // See x2_inc_switches for more information about this
    //--------------------------------------------------------------------------
    if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_AMBIENT) == TRUE)
    {
        SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS);
    }
    // **** Animation Conditions **** //
    // * These are extra conditions you can put on creatures with ambient
    // * animations.

    // * Civilized creatures interact with placeables in
    // * their area that have the tag "NW_INTERACTIVE"
    // * and "talk" to each other.
    // *
    // * Humanoid races are civilized by default, so only
    // * set this flag for monster races that you want to
    // * behave the same way.
    // SetAnimationCondition(NW_ANIM_FLAG_IS_CIVILIZED);

    // * If this flag is set, this creature will constantly
    // * be acting. Otherwise, creatures will only start
    // * performing their ambient animations when they
    // * first perceive a player, and they will stop when
    // * the player moves away.
    // SetAnimationCondition(NW_ANIM_FLAG_CONSTANT);

    // * Civilized creatures with this flag set will
    // * randomly use a few voicechats. It's a good
    // * idea to avoid putting this on multiple
    // * creatures using the same voiceset.
    // SetAnimationCondition(NW_ANIM_FLAG_CHATTER);

    // * Creatures with _immobile_ ambient animations
    // * can have this flag set to make them mobile in a
    // * close range. They will never leave their immediate
    // * area, but will move around in it, frequently
    // * returning to their starting point.
    // *
    // * Note that creatures spawned inside interior areas
    // * that contain a waypoint with one of the tags
    // * "NW_HOME", "NW_TAVERN", "NW_SHOP" will automatically
    // * have this condition set.
    // SetAnimationCondition(NW_ANIM_FLAG_IS_MOBILE_CLOSE_RANGE);


    // **** Special Combat Tactics *****//
    // * These are special flags that can be set on creatures to
    // * make them follow certain specialized combat tactics.
    // * NOTE: ONLY ONE OF THESE SHOULD BE SET ON A SINGLE CREATURE.

    // * Ranged attacker
    // * Will attempt to stay at ranged distance from their
    // * target.
    // SetCombatCondition(X0_COMBAT_FLAG_RANGED);

    // * Defensive attacker
    // * Will use defensive combat feats and parry
    // SetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE);

    // * Ambusher
    // * Will go stealthy/invisible and attack, then
    // * run away and try to go stealthy again before
    // * attacking anew.
    // SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER);

    // * Cowardly
    // * Cowardly creatures will attempt to flee
    // * attackers.
    // SetCombatCondition(X0_COMBAT_FLAG_COWARDLY);


    // **** Escape Commands ***** //
    // * NOTE: ONLY ONE OF THE FOLLOWING SHOULD EVER BE SET AT ONE TIME.
    // * NOTE2: Not clear that these actually work. -- NN

    // * Flee to a way point and return a short time later.
    // *
    // SetSpawnInCondition(NW_FLAG_ESCAPE_RETURN);

    // * Flee to a way point and do not return.
    // *
    // SetSpawnInCondition(NW_FLAG_ESCAPE_LEAVE);

    // * Teleport to safety and do not return.
    // *
    // SetSpawnInCondition(NW_FLAG_TELEPORT_LEAVE);

    // * Teleport to safety and return a short time later.
    // *
    // SetSpawnInCondition(NW_FLAG_TELEPORT_RETURN);



    // ***** CUSTOM USER DEFINED EVENTS ***** /


    /*
      If you uncomment any of these conditions, the creature will fire
      a specific user-defined event number on each event. That will then
      allow you to write custom code in the "OnUserDefinedEvent" handler
      script to go on top of the default NPC behaviors for that event.

      Example: I want to add some custom behavior to my NPC when they
      are damaged. I uncomment the "NW_FLAG_DAMAGED_EVENT", then create
      a new user-defined script that has something like this in it:

      if (GetUserDefinedEventNumber() == 1006) {
          // Custom code for my NPC to execute when it's damaged
      }

      These user-defined events are in the range 1001-1007.
    */

    // * Fire User Defined Event 1001 in the OnHeartbeat
    // *
    // SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);

    // * Fire User Defined Event 1002
    // *
    // SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT);

    // * Fire User Defined Event 1005
    // *
    SetSpawnInCondition(NW_FLAG_ATTACK_EVENT);

    // * Fire User Defined Event 1006
    // *
    // SetSpawnInCondition(NW_FLAG_DAMAGED_EVENT);

    // * Fire User Defined Event 1008
    // *
    // SetSpawnInCondition(NW_FLAG_DISTURBED_EVENT);

    // * Fire User Defined Event 1003
    // *
    SetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT);

    // * Fire User Defined Event 1004
    // *
    // SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT);



    // ***** DEFAULT GENERIC BEHAVIOR (DO NOT TOUCH) ***** //

    // * Goes through and sets up which shouts the NPC will listen to.
    // *
    SetListeningPatterns();

    // * Walk among a set of waypoints.
    // * 1. Find waypoints with the tag "WP_" + NPC TAG + "_##" and walk
    // *    among them in order.
    // * 2. If the tag of the Way Point is "POST_" + NPC TAG, stay there
    // *    and return to it after combat.
    //
    // * Optional Parameters:
    // * void WalkWayPoints(int nRun = FALSE, float fPause = 1.0)
    //
    // * If "NW_FLAG_DAY_NIGHT_POSTING" is set above, you can also
    // * create waypoints with the tags "WN_" + NPC Tag + "_##"
    // * and those will be walked at night. (The standard waypoints
    // * will be walked during the day.)
    // * The night "posting" waypoint tag is simply "NIGHT_" + NPC tag.
    WalkWayPoints();

    //* Create a small amount of treasure on the creature
    if ((GetLocalInt(GetModule(), "X2_L_NOTREASURE") == FALSE)  &&
        (GetLocalInt(OBJECT_SELF, "X2_L_NOTREASURE") == FALSE)  )
    {
        CTG_GenerateNPCTreasure(TREASURE_TYPE_MONSTER, OBJECT_SELF);
    }


    // ***** ADD ANY SPECIAL ON-SPAWN CODE HERE ***** //
    SetLocalInt(OBJECT_SELF,"pouvoir",0);
    // * If Incorporeal, apply changes
    if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_IS_INCORPOREAL) == TRUE)
    {
        effect eConceal = EffectConcealment(50, MISS_CHANCE_TYPE_NORMAL);
        eConceal = ExtraordinaryEffect(eConceal);
        effect eGhost = EffectCutsceneGhost();
        eGhost = ExtraordinaryEffect(eGhost);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eConceal, OBJECT_SELF);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, OBJECT_SELF);

    }

}
Le code a colorer syntaxiquement est trop long (plus de 10240 caractères) et risque de ne pas s'afficher du tout. Vous pouvez le voir en version colorée ici.


C'est tout pour la première possibilité.

La deuxième possibilité :

2) Tu n'utilises pas les pre et post spawn event, dans ce cas, fais une copie du script ci-dessus, appelle-le toujours "dritzz_spawn02", et place-le dans la case OnSpawn de ton PNJ.

Voilà.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
ballestolive
Ecuyer
Inscrit le: 15 Nov 2005
Messages: 64
Localisation: A 35 KM Sud de Paris.
Répondre en citant
Posté le : 29/12/2005 13:21:47 Sujet du message :

OK merci pour tout, j'ai mis cela en place.

Je test dès que j'ai 5 minutes Razz

Merci encore Enki
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 29/12/2005 17:29:50 Sujet du message : petit conseil

Cette partie de script gagne avantageusement à être séparée :
- créer un script à part ; par exemple "gen_spawn" (cf le code en spoiler)
- faire un renvoi par ExecuteScript("gen_spawn",OBJECT_SELF);

Vous éviterez ainsi de rendre votre module obèse à cause des 300Ko Shocked que coûte cette partie à chaque fois qu'elle est dans votre code.

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 :
Code :
#include "x0_i0_anims"
// #include "x0_i0_walkway" - in x0_i0_anims
#include "x0_i0_treasure"

#include "x2_inc_switches"

void main()
{
// ***** DEFAULT GENERIC BEHAVIOR (DO NOT TOUCH) ***** //

// * Goes through and sets up which shouts the NPC will listen to.
// *
SetListeningPatterns();

// * Walk among a set of waypoints.
// * 1. Find waypoints with the tag "WP_" + NPC TAG + "_##" and walk
// * among them in order.
// * 2. If the tag of the Way Point is "POST_" + NPC TAG, stay there
// * and return to it after combat.
//
// * Optional Parameters:
// * void WalkWayPoints(int nRun = FALSE, float fPause = 1.0)
//
// * If "NW_FLAG_DAY_NIGHT_POSTING" is set above, you can also
// * create waypoints with the tags "WN_" + NPC Tag + "_##"
// * and those will be walked at night. (The standard waypoints
// * will be walked during the day.)
// * The night "posting" waypoint tag is simply "NIGHT_" + NPC tag.
WalkWayPoints();

//* Create a small amount of treasure on the creature
if ((GetLocalInt(GetModule(), "X2_L_NOTREASURE") == FALSE) &&
(GetLocalInt(OBJECT_SELF, "X2_L_NOTREASURE") == FALSE) )
{
CTG_GenerateNPCTreasure(TREASURE_TYPE_MONSTER, OBJECT_SELF);
}


// ***** ADD ANY SPECIAL ON-SPAWN CODE HERE ***** //

// * If Incorporeal, apply changes
if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_IS_INCORPOREAL) == TRUE)
{
effect eConceal = EffectConcealment(50, MISS_CHANCE_TYPE_NORMAL);
eConceal = ExtraordinaryEffect(eConceal);
effect eGhost = EffectCutsceneGhost();
eGhost = ExtraordinaryEffect(eGhost);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eConceal, OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, OBJECT_SELF);

}
}

Comme quoi Bioware et l'optimisation ... Laughing
(Enki : mets tes longs morceaux de code en spoiler stp, ca rend les threads + lisibles)
 
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 85.452ms