Rituel

Répondre
Partager Rechercher
Hello,

J'ai un petit problème pour cibler un PC (ou NPC), je m'explique:

Pour un rituel, il faut que l'on recupere une mèche de cheveux sur une creature (PC ou NPC).
(Jusque là pas de problèmes)

Mais ensuite, en utilisant un parchemin avec pouvoir unique, il faut que les effets contenus affectent la creature à qui appartient la mèche de cheveux meme si l'utilisateur du parchemin et la victime se trouvent chacun à l'autre bout du mod.

Ce qui me pose probleme, c'est comment cibler cette creature pour lui appliquer les effets ?

J'ai pensé a appliquer une variable ou un objet sur la victime lors de la recuperation de la mèche, mais comment la retrouver parmis tous les PC ou NPC apres avec le parrchemin ?

Merci
Citation :
Publié par Xialya
J'ai pensé a appliquer une variable ou un objet sur la victime lors de la recuperation de la mèche, mais comment la retrouver parmis tous les PC ou NPC apres avec le parrchemin ?
C'est ça la solution: tu sauvegardes le personnage concerné par un SetLocalObject() sur ta mèche. Et quand tu en as besoin, tu la relis et l'utilises directement, même pas besoin de recherche. Là, deux solutions: le personnage est là ou pas. C'est à tester.
Citation :
tu sauvegardes le personnage concerné par un SetLocalObject() sur ta mèche.
Et comment est ce que l'on fait ca ? ^^


EDIT:

Code PHP:

 void main()
 {
     
object oPC GetFirstPC();
     while(
GetIsObjectValid(oPC))
     {
         if (
GetItemPossessedBy(oPC"ritualvictim")!= OBJECT_INVALID)
         {
             
ExecuteScript("ritual01"oPC);
         }
         
oPC GetNextPC();
     }
 } 
J'ai fait ca pour tester, ca marche, mais bon, ca cible que les PC (alors que je voudrais les NPC également), et ca ne s'applique pas à quelqu'un de particulier, mais à tous ceux qui possedent l'objet "ritualvictim".
Donc je suis toujours coincée :/
Alors alors...

Dans le script qui permet de lancer le rituel la première fois, il faut que tu mettes la cible en variable locale sur la mêche, comme l'a dit Azmathiel. En adaptant ce petit bout de script, ce devrait être possible :
Code PHP:

// j'ai supposé que la variable oMeche était celle 
// que tu aurais définie pour définir l'objet en question, au même titre que 
// la variable oCible, définissant la cible du rituel.
// Remplace ces variables par celles que tu as définies
// dans ton script.

SetLocalObject(oMeche,"CIBLE_RITUEL",oCible); 
Maintenant, il faut que tu adaptes le script te permettant d'infliger le traitement que tu souhaites à la cible visée :
Code PHP:

void main()
{
    
// Je suppose que tu procèdes au rituel en
    // "activant" la mêche...
    
object oMeche GetItemActivated();
    
object oCible GetLocalObject(oMeche);

    if(
oCible != OBJECT_INVALID)
        
ExecuteScript("ritual01"oCible);

Je vais essayer d'être plus clair, tout en reposant sur les scripts que t'a donnés Deyo.
Au moment où tu crées ta mèche (je suppose que tu le fais avec un CreateItemOnObject() ou un CreateObject()) tu récupères l'objet comme ceci dans les deux cas:
Voici l'exemple complet de sauvegarde avec un CreateItemOnObject()
Code PHP:

      void main()
      {
          
object oTarget//Personnage recuperant la meche dans son inventaire
                          //dans le cas d'un CreateItemOnObject() a recuperer avec le bon evenement
          
object oProprietaire// Proprietaire de la meche qui sera victime du rituel
      
          
object oMeche CreateItemOnObject("resref_de_la_meche"oTarget1);
          
// Ensuite, je sauvegarde ma variable locale sur la meche
          
SetLocalObject(oMeche,"proprietaire"oProprietaire);
      } 
Après ça, il te suffit de relire la variable avec un GetLocalObject() pour récupérer directement le PJ/PNJ ancien propriétaire de la mèche.
La suite, c'est comme l'a décrit Deyo. Le test de présence en cas de PJ est fait aussi grâce à ça:
Code PHP:

      if(oCible != OBJECT_INVALID
Mais tu peux aussi envisager ici d'autres solutions en cas d'absence du PJ/PNJ.
Et le tour est joué. Pas besoin de scanner l'ensemble des objets présents dans le module.
Merci beaucoup a vous deux pour votre aide

Le script pour récuperer la mèche fonctionne. (enfin je suppose que la variable est bien sauvegardée sur la mèche récupérée).

Par contre Deyo, ton script ne se compile pas et je n'arrive pas à trouver comment le faire marcher :/

Petite précision:

C'est avec un parchemin que le rituel se lance, et le script doit cibler la personne à qui appartient la mèche.
Comme ça, ça marchera peut-être mieux :

Code PHP:

void main() 
    { 
        
// Je suppose que tu procèdes au rituel en 
        // "activant" la mêche... 
        
object oMeche GetItemActivated(); 
        
object oCible GetLocalObject(oMeche,"CIBLE_RITUEL"); 
     
        if(
oCible != OBJECT_INVALID
            
ExecuteScript("ritual01"oCible); 
    } 
Tout marche parfaitement, merci beaucoup !

Voici les scripts en question, si ca peut être utile à quelqu'un.

Le premier: Un couteau possédant un "Unique Power" permettant de prélever une mèche de cheveux sur une victime, avec risque d'echec.

Code PHP:

   void main()
   {
   
object oPC;
   
object oTarget;
   
object oOwner;
   
   
oPC GetItemActivator();
   
oOwner GetItemActivatedTarget();
   
   if (
GetIsSkillSuccessful(oPCSKILL_PICK_POCKET15))
      {
             
object oLock CreateItemOnObject("hairlock"oPC1);
             
SetLocalObject(oLock,"owner"oOwner);
      }
   else
      {
      
oTarget GetItemActivatedTarget();
   
      
SendMessageToPC(oTarget"A person has tryied to cut you a hair lock !");
   
      
AdjustReputation(oPCoTarget, -100);
   
      }
   } 
Ensuite, le parchemin qui permet de lancer le rituel. (parchemin avec "Unique Power")

Code PHP:

   void main()
   {
   
object oPC;
   
   
oPC GetItemActivator();
   
   
effect eEffect;
   
eEffect EffectDamage(25DAMAGE_TYPE_MAGICALDAMAGE_POWER_NORMAL);
   
   
ApplyEffectToObject(DURATION_TYPE_INSTANTeEffectGetItemActivator());
   
   
object oTarget;
   
oTarget GetItemActivator();
   
   
int nInt;
   
nInt GetObjectType(oTarget);
   
 if (
nInt != OBJECT_TYPE_WAYPOINTApplyEffectToObject(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_COM_BLOOD_CRT_RED), oTarget);
   else 
ApplyEffectAtLocation(DURATION_TYPE_INSTANTEffectVisualEffect(VFX_COM_BLOOD_CRT_RED), GetLocation(oTarget));
   
   if (
GetItemPossessedBy(oPC"maho")!= OBJECT_INVALID)
      {
      if (
GetItemPossessedBy(oPC"hairlock")!= OBJECT_INVALID)
         {
         if (
GetIsSkillSuccessful(oPCSKILL_SPELLCRAFT30))
         {
          
object oLock GetObjectByTag("hairlock");
          
object oTarget GetLocalObject(oLock"owner");
   
         if(
oTarget != OBJECT_INVALID)
           
ExecuteScript("ritual01"oTarget);
      }
     }
    }
   } 
Pour le début du script, je n'utilise pas le système de magie du jeu, j'utilise le mien qui consiste en des parchemins, suivant des types de magies differentes.
Ici la magie du sang, qui demande un sacrifice personnel pour lancer les sorts, d'où le perte de HP au début.

Puis viens le script pour les effets du rituel:

Code PHP:

   void main()
   {
   
object oTarget OBJECT_SELF;
   
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(d20()), oTarget);
   
   
effect eEffect;
   
eEffect EffectCurse(555555);
   
   
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeEffectoTarget1200.0f);
   
   
eEffect EffectDisease(DISEASE_DEMON_FEVER);
   
   
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeEffectoTarget1200.0f);
   } 

Voila, encore un grand merci à vous
De rien, bien joué !

Je me permets juste une petite remarque et un conseil:
Tu déclares tes variables au moment où tu les utilises dans ton script. Ce n'est pas une erreur en soi puisque ça ne prête pas à conséquence ici, mais je te conseillerais de les déclarer plutôt en tête de script et d'en prendre l'habitude. Ça t'évitera de nombreuses heures de débogage dans les futurs scripts longs et/ou complexes.
Il arrive souvent qu'on utilise à plusieurs endroits la même variable et, dans le feu de l'action, on a parfois du mal à se souvenir si elles ont ou non été déclarées. Du coup, comme a pris la mauvaise habitude de les déclarer à l'utilisation, on la re-déclare. Et de ce fait, on remet, parfois, par erreur d'organisation, à zéro une valeur dont on avait peut-être besoin. Autant prendre de bonnes habitudes
Répondre

Connectés sur ce fil

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