Invocations multiples et aléatoires!

Répondre
Partager Rechercher
C'est encore moi, avec encore un gros projet mais là j'ai un peu plus d'information en langage scripté ^^

Alors en fait je voudrais créer un objet qui une fois utilisé permet d'invoquer une créature ( fabriquée avant ) parmi 6 créatures en tout! Il y aurait 4 créature lvl 35-40, 1 lvl 15 et 1 lvl 60! Et en fait je voudrais inclure si possible des probabilité d'apparition:
( Mes créatures sont des farfadets )

Les 4 lvl 35-40: 21% de chance d'apparaître pour chacun d'eux,
Le lvl 15: 11% de chance d'apparaître,
Le lvl 60: 5% de chance d'apparaître!

Et en plus ( et oui encore ^^ ) je voudrais qu'une fois invoquée la créature disparaîsse au bout de 60 secondes!

Alors le script d'invocation je l'ai:


NWScript : void main()
{
object oPC;

if (!GetIsPC(GetItemActivatedTarget()))
{

SendMessageToPC(GetItemActivator(), "tag de l'objet");
return;
}

oPC = GetItemActivator();

AssignCommand(oPC, SummonAnimalCompanion());

effect eEffect;
eEffect = EffectSummonCreature("ref-res de la creature", VFX_IMP_DOOM, 1.0);

ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);

}

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.




Voilou goutte.gif désolé de ce que je vous envoie ^^ je sais que vous avez pas que ça à faire ...ohwell.gif
_________________
La Nature a toujours été là pour nous, alors soyons encore là pour elle!
Salut,

A la lecture de ton post, je me suis demandé où tu avais été pêcher le code que tu mentionnes. Laisses tomber ta source, elle est polluée.

D'abord, pour poster du code, on utilise les balises PHP: (php) (/php) en remplaçant les () par des crochets []. Ensuite, voilà un script (fait sur mesure pour toi, contrairement à mes habitudes, mais là, j'avais un quart d'heure à perdre) à fusionner avec ton actuel OnActivateItem qui devrait faire ce que tu souhaites:

Code PHP:

void main()
{
    
// ce script est à intégrer au OnActivateItem du module
    // c'est pour cela qu'il y a la condidition ci-dessous

    
if (GetTag(OBJECT_SELF) == "tag_objet_active_ici")
    {
        
object oPC GetItemActivator();

        
// Limitation d'usage aux seuls joueurs, y compris MD. Pas grand intérêt, mais demandé.
        
if (!GetIsPC(oPC)) return;

        
//Définition de toutes les variables
        
location lLoc GetItemActivatedTargetLocation();
        
int JetDe d100(1)+1//Attention: variation de 0 a 99, on ajoute donc 1
        
string ResRefCre15 "xxxxxx15"//resref de la creature level 15
        
string ResRefCre35 "xxxxxx35"//resref de la creature level 35
        
string ResRefCre37 "xxxxxx37"//resref de la creature level 37
        
string ResRefCre39 "xxxxxx39"//resref de la creature level 39
        
string ResRefCre40 "xxxxxx40"//resref de la creature level 40
        
string ResRefCre60 "xxxxxx60"//resref de la creature level 60
        
string ResRef;

        
// ces créatures doivent bien sur être définies avant et munies des scripts adéquats

        
if (JetDe <= 11)                         // 11%
        
{
            
ResRef ResRefCre15;
        }
        else if ((
JetDe 11) && (JetDe <= 32))  // 21%
        
{
            
ResRef ResRefCre35;
        }
        else if ((
JetDe 32) && (JetDe <= 53))  // 21%
        
{
            
ResRef ResRefCre37;
        }
        else if ((
JetDe 53) && (JetDe <= 74))  // 21%
        
{
            
ResRef ResRefCre39;
        }
        else if ((
JetDe 74) && (JetDe <= 95))  // 21%
        
{
            
ResRef ResRefCre40;
        }
        else if (
JetDe 95)                     // 5%
        
{
            
ResRef ResRefCre60;
        }
        
// Tout est prêt pour créer l'effet, alors allons-y
        
effect eSum EffectSummonCreature(ResRefVFX_FNF_SUMMON_MONSTER_30.51); // 0.5 seconde de délai pour montrer le caractère irascible des farfadets
        // Création de la créature pour 60 secondes
        
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARYeSumlLoc60.0);
    }

N'oublies pas de renseigner le bon tag pour l'objet et les bons resrefs pour les créatures. Bon amusement.

(Ce script n'est pas testé, j'assure le SAV pendant encore une semaine, après, je suis en vacances.)
Hé hé alors, j'ai essayé mais ça ne fonctionne pas:

Le ResRef de mes créatures sont:

Celle lvl 60: creature026
Celle lvl 40: creature027
Celle lvl 39: creature028
Celle lvl 37: farfadetdelahord
Celle lvl 35: creature029
Et celle lvl 15: farfadetdelaband

Mon objet a pour Tag "InvocateurdesespritsdAthelLoren"

Donc voilà ce que ça donne ( selon ton conseil je vais bien utiliser le php ^^):

Code PHP:

void main()
{
// ce script est à intégrer au OnActivateItem du module
// c'est pour cela qu'il y a la condidition ci-dessous
 
if (GetTag(OBJECT_SELF) == "InvocateurdesespritsdAthelLoren")
{
object oPC GetItemActivator();
 
// Limitation d'usage aux seuls joueurs, y compris MD. Pas grand intérêt, mais demandé.
if (!GetIsPC(oPC)) return;
 
//Définition de toutes les variables
location lLoc GetItemActivatedTargetLocation();
int JetDe d100(1)+1//Attention: variation de 0 a 99, on ajoute donc 1
string ResRefCre15 "farfadetdelaband"//resref de la creature level 15
string ResRefCre35 "creature029"//resref de la creature level 35
string ResRefCre37 "farfadetdelahord"//resref de la creature level 37
string ResRefCre39 "creature028"//resref de la creature level 39
string ResRefCre40 "creature027"//resref de la creature level 40
string ResRefCre60 "creature026"//resref de la creature level 60
string ResRef;
 
// ces créatures doivent bien sur être définies avant et munies des scripts adéquats
 
if (JetDe <= 11// 11%
{
ResRef ResRefCre15;
}
else if ((
JetDe 11) && (JetDe <= 32)) // 21%
{
ResRef ResRefCre35;
}
else if ((
JetDe 32) && (JetDe <= 53)) // 21%
{
ResRef ResRefCre37;
}
else if ((
JetDe 53) && (JetDe <= 74)) // 21%
{
ResRef ResRefCre39;
}
else if ((
JetDe 74) && (JetDe <= 95)) // 21%
{
ResRef ResRefCre40;
}
else if (
JetDe 95// 5%
{
ResRef ResRefCre60;
}
// Tout est prêt pour créer l'effet, alors allons-y
effect eSum EffectSummonCreature(ResRefVFX_FNF_SUMMON_MONSTER_30.51); // 0.5 seconde de délai pour montrer le caractère irascible des farfadets
// Création de la créature pour 60 secondes
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARYeSumlLoc60.0);
}

Et aussi je sais peut être pourquoi ça ne fonctionne pas! 'ai toujours du mal à mettre dans un même script, deux script différents. Parce que en fait dans le OnActivateItem de mon module j'ai déjà le script de ma pierre de rappel donc j'ai essayé de mettre les deux ensemble mais je sais jamais où placer le deuxième, si c'est entre les crochets ou pas ...

Donc mon OnActivateItem est le suivant:

Code PHP:

 
 void main
()
{
  
object oItem GetItemActivated();
  
string sItem GetTagoItem );
  
object oPlayer GetItemActivator();
  if ( 
sItem == "teleporteur" )
  {
    if ( 
GetLocalIntoItem"dejacree" ) != )
    {
      
effect eEffect EffectVisualEffect(VFX_FNF_TIME_STOP );
      
location lPortail GetLocationoPlayer );
      
CreateObjectOBJECT_TYPE_PLACEABLE"portailteleport"lPortailFALSE"portailteleport" );
      
ApplyEffectAtLocationDURATION_TYPE_INSTANTeEffectlPortail0.0 );
      
SetLocalIntoItem"dejacree"1);
    }
    else
    {
      
object oPortail GetObjectByTag"portailteleport" );
      
effect eEffect EffectVisualEffectVFX_FNF_WORD );
      
location lPlayer GetLocationoPlayer );
      
location lPortail GetLocationoPortail );
      
ApplyEffectAtLocationDURATION_TYPE_INSTANTeEffectlPlayer0.0 );
      
AssignCommandoPlayerJumpToObjectoPortail ) );
      
ApplyEffectAtLocationDURATION_TYPE_INSTANTeEffectlPortail0.0 );
      
DestroyObjectoPortail4.0 );
      
SetLocalIntoItem"dejacree");
    }
    
void main()
{
// ce script est à intégrer au OnActivateItem du module
// c'est pour cela qu'il y a la condidition ci-dessous
if (GetTag(OBJECT_SELF) == "InvocateurdesespritsdAthelLoren")
{
object oPC GetItemActivator();
// Limitation d'usage aux seuls joueurs, y compris MD. Pas grand intérêt, mais demandé.
if (!GetIsPC(oPC)) return;
//Définition de toutes les variables
location lLoc GetItemActivatedTargetLocation();
int JetDe d100(1)+1//Attention: variation de 0 a 99, on ajoute donc 1
string ResRefCre15 "farfadetdelaband"//resref de la creature level 15
string ResRefCre35 "creature029"//resref de la creature level 35
string ResRefCre37 "farfadetdelahord"//resref de la creature level 37
string ResRefCre39 "creature028"//resref de la creature level 39
string ResRefCre40 "creature027"//resref de la creature level 40
string ResRefCre60 "creature026"//resref de la creature level 60
string ResRef;
// ces créatures doivent bien sur être définies avant et munies des scripts adéquats
if (JetDe <= 11// 11%
{
ResRef ResRefCre15;
}
else if ((
JetDe 11) && (JetDe <= 32)) // 21%
{
ResRef ResRefCre35;
}
else if ((
JetDe 32) && (JetDe <= 53)) // 21%
{
ResRef ResRefCre37;
}
else if ((
JetDe 53) && (JetDe <= 74)) // 21%
{
ResRef ResRefCre39;
}
else if ((
JetDe 74) && (JetDe <= 95)) // 21%
{
ResRef ResRefCre40;
}
else if (
JetDe 95// 5%
{
ResRef ResRefCre60;
}
// Tout est prêt pour créer l'effet, alors allons-y
effect eSum EffectSummonCreature(ResRefVFX_FNF_SUMMON_MONSTER_30.51); // 0.5 seconde de délai pour montrer le caractère irascible des farfadets
// Création de la créature pour 60 secondes
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARYeSumlLoc60.0);
}
 }


Donc c'est peut être de là que le problème vient ... Voilou ^^ après ça tu aura le droit de prendre tes vacances Non je rigole
Meci d'avance
Oui, effectivement, ton problème vient de la fusion des deux scripts.
- void main()
C'est la définition même de ton programme: cf le tutoriel cité en référence dans l'autre fil. Il ne peut y en avoir qu'un or, tu en as deux.

Essaie déjà de corriger ça, on avisera après.
Alors j'ai modifié selon les quelques règles que j'ai compris dans le site que tu m'a donné ( qui est super ) et la compilation des deux scripts donne ça mais ça ne fonctionne hélas pas plus ...

Code PHP:

 void main()
{
  
object oItem GetItemActivated();
  
string sItem GetTagoItem );
  
object oPlayer GetItemActivator();
  if ( 
sItem == "teleporteur" )
  {
    if ( 
GetLocalIntoItem"dejacree" ) != )
    {
      
effect eEffect EffectVisualEffect(VFX_FNF_TIME_STOP );
      
location lPortail GetLocationoPlayer );
      
CreateObjectOBJECT_TYPE_PLACEABLE"portailteleport"lPortailFALSE"portailteleport" );
      
ApplyEffectAtLocationDURATION_TYPE_INSTANTeEffectlPortail0.0 );
      
SetLocalIntoItem"dejacree"1);
    }
    else
    {
      
object oPortail GetObjectByTag"portailteleport" );
      
effect eEffect EffectVisualEffectVFX_FNF_WORD );
      
location lPlayer GetLocationoPlayer );
      
location lPortail GetLocationoPortail );
      
ApplyEffectAtLocationDURATION_TYPE_INSTANTeEffectlPlayer0.0 );
      
AssignCommandoPlayerJumpToObjectoPortail ) );
      
ApplyEffectAtLocationDURATION_TYPE_INSTANTeEffectlPortail0.0 );
      
DestroyObjectoPortail4.0 );
      
SetLocalIntoItem"dejacree");
      }
// ce script est à intégrer au OnActivateItem du module
// c'est pour cela qu'il y a la condidition ci-dessous
{
if else (
GetTag (OBJECT_SELF) == "InvocateurdesespritsdAthelLoren")
{
object oPC GetItemActivator();
// Limitation d'usage aux seuls joueurs, y compris MD. Pas grand intérêt, mais demandé.
if (!GetIsPC(oPC)) return;
//Définition de toutes les variables
location lLoc GetItemActivatedTargetLocation();
int JetDe d100(1)+1//Attention: variation de 0 a 99, on ajoute donc 1
string ResRefCre15 "farfadetdelaband"//resref de la creature level 15
string ResRefCre35 "creature029"//resref de la creature level 35
string ResRefCre37 "farfadetdelahord"//resref de la creature level 37
string ResRefCre39 "creature028"//resref de la creature level 39
string ResRefCre40 "creature027"//resref de la creature level 40
string ResRefCre60 "creature026"//resref de la creature level 60
string ResRef;
}
// ces créatures doivent bien sur être définies avant et munies des scripts adéquats
if (JetDe <= 11// 11%
{
ResRef ResRefCre15;
}
else if ((
JetDe 11) && (JetDe <= 32)) // 21%
{
ResRef ResRefCre35;
}
else if ((
JetDe 32) && (JetDe <= 53)) // 21%
{
ResRef ResRefCre37;
}
else if ((
JetDe 53) && (JetDe <= 74)) // 21%
{
ResRef ResRefCre39;
}
else if ((
JetDe 74) && (JetDe <= 95)) // 21%
{
ResRef ResRefCre40;
}
else if (
JetDe 95// 5%
{
ResRef ResRefCre60;
}
// Tout est prêt pour créer l'effet, alors allons-y
effect eSum EffectSummonCreature(ResRefVFX_FNF_SUMMON_MONSTER_30.51); // 0.5 seconde de délai pour montrer le caractère irascible des farfadets
// Création de la créature pour 60 secondes
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARYeSumlLoc60.0);
}
 }

J'ai changé quelques { et } et quelques "if" et "else if"
Citation :
Publié par erwann1
J'ai changé quelques { et } et quelques "if" et "else if"
... et mis la pagaille totale

As-tu attribué la propriété "Lancer un sort / Pouvoir unique" à l'objet à activer et non pas "Lancer un sort / Pouvoir unique sur soi seulement" ?
Sinon, ça ne peut pas fonctionner (il faut pouvoir déterminer un endroit où l'invocation apparaîtra et donc utiliser le curseur-viseur).

Code PHP:

void main()
{
      
object oItem GetItemActivated();
      
string sItem GetTagoItem );
      
object oPlayer GetItemActivator();
      if ( 
sItem == "teleporteur" )
      {
            if ( 
GetLocalIntoItem"dejacree" ) != )
            {
              
effect eEffect EffectVisualEffect(VFX_FNF_TIME_STOP );
              
location lPortail GetLocationoPlayer );
              
CreateObjectOBJECT_TYPE_PLACEABLE"portailteleport"lPortailFALSE"portailteleport" );
              
ApplyEffectAtLocationDURATION_TYPE_INSTANTeEffectlPortail0.0 );
              
SetLocalIntoItem"dejacree"1);
            }
            else
            {
              
object oPortail GetObjectByTag"portailteleport" );
              
effect eEffect EffectVisualEffectVFX_FNF_WORD );
              
location lPlayer GetLocationoPlayer );
              
location lPortail GetLocationoPortail );
              
ApplyEffectAtLocationDURATION_TYPE_INSTANTeEffectlPlayer0.0 );
              
AssignCommandoPlayerJumpToObjectoPortail ) );
              
ApplyEffectAtLocationDURATION_TYPE_INSTANTeEffectlPortail0.0 );
              
DestroyObjectoPortail4.0 );
              
SetLocalIntoItem"dejacree");
              }
        }
// ce script est à intégrer au OnActivateItem du module
// c'est pour cela qu'il y a la condidition ci-dessous

    
if (sItem == "InvocateurdesespritsdAthelLoren")
    {
        if (!
GetIsPC(oPlayer)) return;
        
// Limitation d'usage aux seuls joueurs, y compris MD. Pas grand intérêt, mais demandé.

        //Définition de toutes les variables
        
location lLoc GetItemActivatedTargetLocation();
        
int JetDe d100(1)+1//Attention: variation de 0 a 99, on ajoute donc 1
        
string ResRefCre15 "farfadetdelaband"//resref de la creature level 15
        
string ResRefCre35 "creature029"//resref de la creature level 35
        
string ResRefCre37 "farfadetdelahord"//resref de la creature level 37
        
string ResRefCre39 "creature028"//resref de la creature level 39
        
string ResRefCre40 "creature027"//resref de la creature level 40
        
string ResRefCre60 "creature026"//resref de la creature level 60
        
string ResRef;

        
// ces créatures doivent bien sur être définies avant et munies des scripts adéquats
        
if (JetDe <= 11// 11%
        
{
            
ResRef ResRefCre15;
        }
        else if ((
JetDe 11) && (JetDe <= 32)) // 21%
        
{
            
ResRef ResRefCre35;
        }
        else if ((
JetDe 32) && (JetDe <= 53)) // 21%
        
{
            
ResRef ResRefCre37;
        }
        else if ((
JetDe 53) && (JetDe <= 74)) // 21%
        
{
            
ResRef ResRefCre39;
        }
        else if ((
JetDe 74) && (JetDe <= 95)) // 21%
        
{
            
ResRef ResRefCre40;
        }
        else if (
JetDe 95// 5%
        
{
            
ResRef ResRefCre60;
        }
        
// Tout est prêt pour créer l'effet, alors allons-y
        
effect eSum EffectSummonCreature(ResRefVFX_FNF_SUMMON_MONSTER_30.51); // 0.5 seconde de délai pour montrer le caractère irascible des farfadets
        // Création de la créature pour 60 secondes
        
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARYeSumlLoc60.0);
    }

Voici le listing fusionné et corrigé (pas testé, par contre, je n'ai pas créé les objets ni les créatures). Le seul doute que j'ai est sur l'attribution de la créature au manipulateur de l'objet, mais en principe, ça devrait être bon.
Tu seras sympa de laisser les indentations que je mets dans le code. Elles me permettent de ne pas attraper la migraine quand je dévermine. Merci.
Cool merci je vais tester cela


Citation :
... et mis la pagaille totale
Désolé je croyais bien faire et avoir compris les règles de base ... mais apparemment ce n'est pas le cas XD


Citation :
As-tu attribué la propriété "Lancer un sort / Pouvoir unique" à l'objet à activer et non pas "Lancer un sort / Pouvoir unique sur soi seulement" ?

Bah en fait j'ai tout essayé "pouvoir unique uniquement sur soi-même", "pouvoir unique", "activer objet" ...

Bon j'édite si ça marche et si ça marche pas aussi ^^ en tout cas merci


Bn bah j'ai essayé et ça ne marche toujours pas malgré le fait que j'ai tout fait ce que tu as dit ... et pourtant j'ai tout vérifié les Resref de mes créatures et le Tag de mon objet ... Donc bah je sais pas ... c'est peut être mon ordinateur qui est allergique aux bonnes idées ^^ ...
"Ça ne marche pas" ? Super, on est aidé avec ça.
Citation :
c'est peut être mon ordinateur qui est allergique aux bonnes idées ^^ ...
Oui, c'est sûrement ça. C'est une bonne cause de dysfonctionnement de script.


C'est pour ça que je n'ai pas pour habitude de faire des scripts pour les autres à leur place. Et je vais d'ailleurs m'empresser de reprendre mes bonnes habitudes.

Mais là, j'ai commencé... Il ne me reste plus qu'à créer ce qui manque et à tester le script en conditions d'exploitation. Je poste dès que j'ai terminé les tests.
Quand je commence quelque chose, je le finis.



J'ai trouvé la raison. Comme je le soupçonnais, le script tel quel perd les pédales car il ne sait pas qui sera maître de l'invocation.
Donc, il faut remplacer ApplyEffectAtLocation par ApplyEffectToObject.

Code PHP:

ApplyEffectToObject(DURATION_TYPE_INSTANTeSumoPlayer60.0); 

Remplace par ça dans le script original et tout fonctionnera. Cette fois c'est testé.

Bon courage.
Il y a un point sur lequel je ne suit pas d'accord. Cela concerne le jet de dé.
Il est dit en commentaire que d100() prend une valeur entre 0 et 99 : c'est faux.


d100() : prend une valeur entre 1 et 100
Random(100) : prend une valeur entre 0 et 99


en fait d100() = Random(100)+1
Répondre

Connectés sur ce fil

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