items et définition de factions

Répondre
Partager Rechercher
existe t'il un script qui assigne une faction au port d'un item?

genre deux anneaux et deux factions (pour les pj) ! ainsi les pj se verraient en hostiles sans devoir cliquer sur hostile dans le tableau des pj
ok je vais essayer avec ça mais je sens que vous aller vous bidonner derriere votre ordi en voyant ce que je pondrai. pour moi, si je suis ma logique, ca prend 4-5 lignes à tout casser

genre

if (le pj a "anneau1") setfaction "gentil" (tiens au fait, les factions ont un tag?)
else (ou re if) (pj "anneau2") set faction "méchant"

pour moi c pas plus compliqué que ca ! mais je suis sûr que çava prendre une 50aine de lignes.

je verrai ca demain aprem, faites rien avant svp je veux voir ce que je peux faire. (avec le script gen peut etre)
voici un premier jet (me suis inspiré du script gen et des différents scripts du jeu !!

Code PHP:

// acquireitem essai anneau et faction

void main ()
{

//définition des variables
object oPC GetModuleItemAcquireBy();  // définir que le pj a l'item
object oItem1 GetObjectByTag("anneau1");//définition des deux items
object oItem2 GetObjectByTag("anneau2");

if (!
GetIsPC(oPC)) return;    //je bloque ici : comment mettre le oItem 1 ou 2
SetFaction "gentils"          // quoi mettre pour la faction? juste le nom?
                              // et je n'ai pas vu de SetFaction ! peut etre un GetFaction... 
voici un petit script rapide fait avec le script gen 1.5

Code PHP:

/*   Script generated by
Lilac Soul's NWN Script Generator, v. 1.5

For download info, please visit:
[url]http://www.lilacsoul.revility.com[/url]    */

void main()
{

object oPC GetModuleItemAcquiredBy();

object oItem;
oItem GetModuleItemAcquired();

if (!
GetIsPC(oPC)) return;

object oTarget;
oTarget GetObjectByTag("anneau1");

AdjustReputation(oPCoTarget, -100);


si je comprend bien, si le pj a "anneau1", il aura une réputation de -100 par rapport aux autres PJ? et si c'est ça, ce -100 permettra t-il aux autres de le voir hostile?
Je ne crois pas, tu ajuste la reputation par rapport à l'object
dans ce cas -100 par rapport à ta baguette mais a t elle une reputation.

Sinon tu place un pnj dans une zone inaccessible avec la faction que tu veux et tu ajuste par rapport à lui

Mais tu ajuste quand ta faction, a l'entrée du pj dans le module?
Au moment ou il place l'anneau pour l'utiliser?


#include "nw_i0_plot"

void main()
{

object oPC = GetEnteringObject();
if (GetIsPC(oPC))
{
if (HasItem(oPC, "anneau1"))
ChangeFaction(oPC, GetObjectByTag("tagpnjmauvais"));
//ou bien ajuste
// AdjustReputation(oPC,GetObjectByTag("tagpnjmauvais"),100);
if (HasItem(oPC, "anneau2"))
ChangeFaction(oPC, GetObjectByTag("tagpnjmauvais"));

}
}
en fait il y a deux anneau et j'aimerai que le fait d'avoir un anneau dans ton inventaire (mem pas obligé de le mettre) t'assigne une faction.

pour le pnj je vois plus ou moins ce que tu veux dire mais je ne vois pas en quoi ca va faire une relation avec les pj de la faction ennemie
hum j ai fait une erreur sur le deuxieme anneau
if (HasItem(oPC, "anneau2"))
ChangeFaction(oPC, GetObjectByTag("tagpnjbon"));


c'est a toi faire tes factions et le rapport entre elle

si ta faction bonne est 100% hostile au mauvais

celui qui entre avec l'anneau bon sera initialisé sur la faction bon et donc 100% hostile au mauvais.

Maintenant le gros bug qu'il faut voir c'est si un PJ a les deux anneaux
IMPOSSIBLE ! j'ai un choix dès le départ du module qui donne un des deux anneaux, ensuite, impossible de le retirer cet anneau (ni déposer, ni évhanger, ni vendre) donc le probleme est résolu (car le fait d'avoir un anneau empeche de faire un choix pour avoir l'autre anneau)
@phenx : je suppose que le script se mets dans le OnAcquireItem du mod?

voici ton script donc (si j'ai bien corrigé)

Code PHP:

#include "nw_i0_plot"

void main()
{

object oPC GetEnteringObject();
if (
GetIsPC(oPC))
{
if (
HasItem(oPC"anneau1"))
ChangeFaction(oPCGetObjectByTag("tagpnjmauvais"));
//ou bien ajuste
// AdjustReputation(oPC,GetObjectByTag("tagpnjmauvais"),100);
if (HasItem(oPC"anneau2"))
ChangeFaction(oPCGetObjectByTag("tagpnjbon"));

}

et voici mon script OAI

Code PHP:

 /*
    s_acquireitem - example script for incorporation into OnAcquireItem
*/

#include "i_tagtests"

void main()
{

object oItem GetModuleItemAcquired();
object oAcquirer GetItemPossessor(oItem);

if (
GetIsNoDrop(oItem))
    
ExecuteScript("s_nodrop_pickup"oAcquirer);

if (
GetIsLore(oItem))
    
ExecuteScript("s_lore_pickup"oAcquirer);


en essayant de les mettre ensemble voici ce que je fais. dites moi si c'est exact

Code PHP:

#include "nw_i0_plot"
#include "i_tagtests"  // je sais pas si on peut mettre deux include et si ca se mets comme ca

void main()
{

object oPC GetEnteringObject();
object oItem GetModuleItemAcquired();
object oAcquirer GetItemPossessor(oItem);

if (
GetIsNoDrop(oItem))
    
ExecuteScript("s_nodrop_pickup"oAcquirer);

if (
GetIsLore(oItem))
    
ExecuteScript("s_lore_pickup"oAcquirer);

if (
GetIsPC(oPC))
{
if (
HasItem(oPC"anneau1"))
ChangeFaction(oPCGetObjectByTag("tagpnjmauvais"));
//ou bien ajuste
// AdjustReputation(oPC,GetObjectByTag("tagpnjmauvais"),100);
if (HasItem(oPC"anneau2"))
ChangeFaction(oPCGetObjectByTag("tagpnjbon"));

}

et ça compile !!!
Moi je pense qu'il vaut mieux être pessimiste et eviter les bugs
de plus ton oPC et oAquirer sont les même non?

#include "nw_i0_plot"
#include "i_tagtests" // je sais pas si on peut mettre deux include et si ca se mets comme ca

void main()
{

object oItem = GetModuleItemAcquired();
object oAcquirer = GetItemPossessor(oItem);

if (GetIsNoDrop(oItem))
ExecuteScript("s_nodrop_pickup", oAcquirer);

if (GetIsLore(oItem))
ExecuteScript("s_lore_pickup", oAcquirer);

if (GetIsPC(oAcquirer))
{
if (HasItem(oAcquirer, "anneau1")&& !HasItem(oAcquirer, "anneau2"))
ChangeFaction(oAcquirer, GetObjectByTag("tagpnjmauvais"));

//ou bien ajuste
// AdjustReputation(oAcquirer,GetObjectByTag("tagpnjmauvais"),100);

if (HasItem(oAcquirer, "anneau2")&& !HasItem(oAcquirer, "anneau1"))
ChangeFaction(oAcquirer, GetObjectByTag("tagpnjbon"));

}
}
bon, ben finalement ca va pas !! j'ai du atende un peu avant de le tester donc c'est pour ça que je poste seulement maintenant.

les pj ont deux anneaux différents mais ne se voient pas hostile.
(par contre les pnj se frappent dessus)

@phenx : peux tu me dire +/- a quoi correspond cette ligne de code :

Code PHP:

if (HasItem(oAcquirer"anneau1")&& !HasItem(oAcquirer"anneau2")) 

j'ai compris que si le oAcquirer (donc pj) a l'anneau 1 il changeait de faction comme le pnj mauvais mais le "&& !HasItem ...anneau2" ca vient faire quoi? parce que dans le code de départ, tu l'avais pas mise cette rajoute !
Le ! signifie pas.
Donc, l'action est déclenché si le PJ a l'anneau 1 et n'a pas l'anneau 2. Ca évite d'avoir à scripter l'interdiction de porter deux anneau en même temps et ça bloque les petits malins espérant manger à tous les rateliers.
bon ca marche tjr pas ! mais en cherchant un peu j'ai trouvé ceci dans le lexicon francais
Citation :
Syntaxe


void SetPCDislike (
object oPlayer,
object oTarget
);


Paramètres
oPlayer
1er perso

oTarget
2éme perso


Description
Fait se détester oPlayer et oTarget
ca serait pas plus facile?
Je vais peut être dire une betise, mais il me semble que les PJ ne peuvent pas changer de faction, que les factions ne concernent que les PNJ. Et que les PJ ont une reputation avec chacune des factions.

Donc il me semble que pour ce problême il faudrait voir en deux parties:

regler la reputation du PJ auprès des PNJ :

Code PHP:

//Les PNJ du même camp aime bien l'acquereur de l'anneau.
AdjustReputation(oPC,GetObjectByTag("TagPNJmemeFaction"), 100);
//Les PNJ de l'autre camp sont ses ennemis.
AdjustReputation(oPC,GetObjectByTag("TagPNJautreFaction"),-100); 
Puis auprès de chaque PJ (on parcoure les PJ et on verifies si le PJ l'anneau adverse. Si oui, il aime pas l'acquereur de l'anneau.):

Code PHP:

   object oPJ GetModuleItemAcquireBy()
   
object oPJ2 GetFirstPC();
   while (
GetIsObjectValid(oPJ2) == TRUE)
   {
      if 
HasItem(oPJ2"AnneauDeLaFactionAdverse")
      {
          
SetPCDislike(oPJ,oPJ2)
      }
      
oPJ2 GetNextPC();
   } 
Ce ne sont que des bouts de codes, mais avec ce que tu as déjà eu, tu devrais pouvoir tout reconstituer. N'oublies pas qu'il te faut aussi avoir le même genre de script pour le moment ou le PJ se conecte (il faut de nouveau modifier la réputation auprès des factions et refaire la boucle des PJ)
voila ce que j'ai fait (ca ressemble p'tet a rien mais dite toujours )

Code PHP:

#include "nw_i0_plot"
#include "i_tagtests" // je sais pas si on peut mettre deux include et si ca se mets comme ca

void main()
{

object oItem GetModuleItemAcquired();
object oAcquirer GetItemPossessor(oItem);
object oPJ GetModuleItemAcquireBy()
object oPJ2 GetFirstPC();
while (
GetIsObjectValid(oPJ2) == TRUE)

if (
GetIsNoDrop(oItem))
ExecuteScript("s_nodrop_pickup"oAcquirer);

if (
GetIsLore(oItem))
ExecuteScript("s_lore_pickup"oAcquirer);

if (
GetIsPC(oAcquirer))
{

if (
HasItem(oAcquirer"anneau1")
ChangeFaction(oAcquirerGetObjectByTag("tagpnjbon"));
//Les PNJ du même camp aime bien l'acquereur de l'anneau.
AdjustReputation(oPC,GetObjectByTag("tagpnjbon "), 100);
//Les PNJ de l'autre camp sont ses ennemis.
AdjustReputation(oPC,GetObjectByTag("tagpnjmauvais"),-100);
   {

      if 
HasItem(oPJ2"anneau2")

      {

          
SetPCDislike(oPJ,oPJ2)

      }

      
oPJ2 GetNextPC();

   }

//ou bien ajuste
// AdjustReputation(oAcquirer,GetObjectByTag("tagpnjmauvais"),100);

if (HasItem(oAcquirer"anneau2")
ChangeFaction(oAcquirerGetObjectByTag("tagpnjbon"));
//Les PNJ du même camp aime bien l'acquereur de l'anneau.
AdjustReputation(oPC,GetObjectByTag("tagpnjmauvais "), 100);
//Les PNJ de l'autre camp sont ses ennemis.
AdjustReputation(oPC,GetObjectByTag("tagpnjbon"),-100);
   {

      if 
HasItem(oPJ2"anneau1")

      {

          
SetPCDislike(oPJ,oPJ2)

      }

      
oPJ2 GetNextPC();

   }

}

Tu as raison, ça ne ressemble à rien C'est totalement mélangé et c'est en parti notre faute: on t'en a trop donné dans tous les sens.

Je vais essayer de te faire un truc complet, mais je doute d'en avoir le temps aujourd'hui.
Voilà ce que je mettrais dans le OnAcquiredItem

Code PHP:

void main()
{

if !
GetIsPC(oAcquirer)
{
    return();
}
if 
GetTag(oItem) = "anneau1"
{
    
//Les PNJ du même camp aime bien l'acquereur de l'anneau.
    
AdjustReputation(oAcquirer,GetObjectByTag("tagpnjbon "), 100);
    
//Les PNJ de l'autre camp sont ses ennemis.
    
AdjustReputation(oAcquirer,GetObjectByTag("tagpnjmauvais"),-100);
    
object oPJ GetFirstPC();
    {
        if 
HasItem(oPJ"anneau2")
        {
            
SetPCDislike(oAcquirer,oPJ);
            
SetPCDislike(oPJ,oAcquirer);
        }
        
oPJ GetNextPC();         
    }
    return();
}
if 
GetTag(oItem) = "anneau2"
{
    
//Les PNJ du même camp aime bien l'acquereur de l'anneau.
    
AdjustReputation(oAcquirer,GetObjectByTag("tagpnjmauvais "), 100);
    
//Les PNJ de l'autre camp sont ses ennemis.
    
AdjustReputation(oAcquirer,GetObjectByTag("tagpnjbon"),-100);
    
object oPJ GetFirstPC();
    {
        if 
HasItem(oPJ"anneau1")
        {
            
SetPCDislike(oAcquirer,oPJ);
            
SetPCDislike(oPJ,oAcquirer);
        }
        
oPJ GetNextPC();         
    }
    return();
}

Et dans le OnClientEnter:

Code PHP:

void main()
{
object oPC GetEnteringObject();
if !
GetIsPC(oPC)
{
    return();
}
if 
HasItem(oPC"anneau1")
{
    
//Les PNJ du même camp aime bien l'acquereur de l'anneau.
    
AdjustReputation(oPC,GetObjectByTag("tagpnjbon "), 100);
    
//Les PNJ de l'autre camp sont ses ennemis.
    
AdjustReputation(oPC,GetObjectByTag("tagpnjmauvais"),-100);
    
object oPJ GetFirstPC();
    {
        if 
HasItem(oPJ"anneau2")
        {
            
SetPCDislike(oPC,oPJ);
            
SetPCDislike(oPJ,oPC);
        }
        
oPJ GetNextPC();         
    }
}
if 
HasItem(oPC"anneau2")
{
    
//Les PNJ du même camp aime bien l'acquereur de l'anneau.
    
AdjustReputation(oPC,GetObjectByTag("tagpnjmauvais"), 100);
    
//Les PNJ de l'autre camp sont ses ennemis.
    
AdjustReputation(oPC,GetObjectByTag("tagpnjbon"),-100);
    
object oPJ GetFirstPC();
    {
        if 
HasItem(oPJ"anneau1")
        {
            
SetPCDislike(oPC,oPJ);
            
SetPCDislike(oPJ,oPC);
        }
        
oPJ GetNextPC();         
    }
}

C'est à tester, vu que je n'ai même pas Aurora sous la main pour voir si ça compile.
Répondre

Connectés sur ce fil

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