Objet spécial

Répondre
Partager Rechercher
Salut, je cherche a créer avec Aurora 2 objets un peu spéciaux, qui sont "liées".

Basiquement il s'agit de 2 anneaux qui une fois porté lient les porteurs.
* Quand l'un est blessé, l'autre l'est aussi.
* Quand l'un est soigné, l'autre l'est aussi.
* Quand l'un des deux est par ex charmé, l'autre a un malus x, etc.

Avez vous une idée de ce qu'il faudrait scripter pour avoir ce genre d'effet ?
Basiquement, il faudrait pouvoir sauvegarder pour chaque anneau 2 chaînes qui correspondent au nom des PJ détenteurs des anneaux jumelés, soit dans une BD soit par un système quelconque de persistance de variable sur des objets.

Ensuite le reste est une histoire d'ExecuteScript. Dès que l'anneau est porté, il déclenche un script qui se colle sur le pj qui porte l'anneau et qui s'auto appelle, un peu comme un OnHeartBeat.

Ce script a juste pour tâche de vérifier l'état des variables que tu désires (pdv, effet etc etc). Il exécute certaines parties de son code si la variable est vérifiée. Ce script vérifie aussi que le détenteur porte toujours l'anneau. Si il ne le porte pas il s'arrête de s'auto-appeler.

C'est en fait le principe de base de l'ensemble des items qui ont des effets spéciaux lorsque tu les portes ou que tu t'en sers.
J'avoue que j'ai du mal à comprendre ce que tu appelle chaîne. Est-ce qu'on ne peux pas utiliser GetItemPossessor pour reconnaître le porteur de l'anneau lié ?

Sinon pour les effets, est-ce qu'il n'y a pas un emplacement de script qui se lance quand un personnage est blessé ?
Je pense qu'il veut dire : chaînes de caractère, donc une variable de type texte (getlocalstring, getcampaignstring, et autre travaillant sur du texte).

Pour la position du script, comme il le dit... dans l'emplacement réservé à l'équipement d'item du module... mais lui c'est juste le lanceur de l'effet.

Relit bien ce que Mickey974, tu comprendras mieux le principe de fonctionnement. Et comment le réaliser dans les grandes lignes...
Bon alors voici ce que j'ai fait pour infliger un malus si les personnages sont dans des zones différentes. Le script est lancé au moment ou l'objet est equipé avec un execute script.

Code PHP:

void main()
{
object oPC GetFirstPC();
while(
GetIsObjectValid(oPC))
    {
    if(
oPC != OBJECT_SELF)
        {
        
object oInfo GetItemPossessedBy(oPC,"it_infopj");
        
int nRing GetLocalInt(oInfo,"5_Ring");
        if(
nRing == 1)
            {
            
int nLoin GetLocalInt(oInfo,"5_ring_loin");
            
object oMyArea GetArea(OBJECT_SELF);
            
object oArea GetArea(oPC);
            if(
oMyArea != oArea  && nLoin == 0)
                {
                
effect eEff EffectAbilityDecrease(ABILITY_CONSTITUTION,2);
                
effect eSupEff SupernaturalEffect(eEff);
                
SetLocalInt(oInfo,"5_ring_loin",1);
                
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eSupEff,oPC);
                }
            else if(
oMyArea == oArea && nLoin == 1)
                {
                
effect eEff GetFirstEffect(oPC);
                while(
GetIsEffectValid(eEff))
                    {
                    if((
GetEffectSubType(eEff) == SUBTYPE_SUPERNATURAL)
                    &&(
GetEffectType(eEff) == EFFECT_TYPE_ABILITY_DECREASE))
                        {
                        
RemoveEffect(oPCeEff);
                        break;
                        }
                    
eEff GetNextEffect(oPC);
                    }
                
SetLocalInt(oInfo,"5_ring_loin",0);
                }
            }
        }
    
oPC GetNextPC();
    }
DelayCommand(18.0,ExecuteScript("5_anno_area",OBJECT_SELF));

J'ai fait le choix de chercher une variable (posée au moment ou l'anneau est équipé) au lieu des anneaux jumelés, car cela permet d'avoir plus de 2 objets liés. 5 objets ici qui tous posent la meme variable.
La variable nLoin est posée pour eviter de remettre plusieurs fois le malus.

Je me pose quand meme 2 questions pour ca et le reste.

1) Est-ce que le fait de relancer le script ne vas pas faire une grosse surcharge ?
2) Comment faire pour les PV ?
J'ai pensé à utiliser le spellhook pour les sorts de soin. En gros quand un soin est lancé sur un des persos les autres sont soignés d'une partie de leur PV aussi.
Mais pour les dommages je ne vois pas comment gérer ca sans faire des dommages systématiques.
Par ex : Le PC1 subit x dommages. Le PC2 associé subit donc z dommages. C'est faisable si ca se passe juste au moment ou PC1 est blessé, mais s'il faut attendre de récupérer ses PV et comptabiliser ce qu'il vient de perdre en PV (????) et l'infliger aux autres, comment faire pour eviter de réinfliger une blessure à chaque execution du script ?
Citation :
J'avoue que j'ai du mal à comprendre ce que tu appelle chaîne
réponse
Citation :
Je pense qu'il veut dire : chaînes de caractère, donc une variable de type texte (getlocalstring, getcampaignstring, et autre travaillant sur du texte).
Citation :
Est-ce qu'on ne peux pas utiliser GetItemPossessor pour reconnaître le porteur de l'anneau lié ?
Oui, tu peux. Mais ca t'obliges à chaque boucle du script de taper dans cette fonction. Donc perte de temps process.

Citation :
1) Est-ce que le fait de relancer le script ne vas pas faire une grosse surcharge ?
Ben comme tout script ca consommera du temps process. C'est imparable, mais ca sera nettement moins gourmand qu'un OnHeartBeat quoiqu'on dise. Le plus sur moyen de ne pas faire de surcharge étant en définitive de ne pas faire de script !

Citation :
2) Comment faire pour les PV ?
D'où l'utilité de faire une chaine qui permet de retrouver les détenteurs des anneaux (2, 5, ou n anneaux le principe étant le même). Dès l'acquisition/séparation de l'anneau ces chaînes doivent être renseignés. Lors d'utilisation de l'anneau (le port de l'anneau) le script lie les effets aux autres porteurs (si eux même portent l'anneau, ou si tu choisis le fait de simplement détenir l'anneau). Lorsqu'il y a un effet qui se produit sur le PJ A, il est répercuté sur les PJ qui portent les anneaux liés. L'inverse étant vrai également, puisque chaque porteur déclenche le même script qui est attaché à son identificateur de PJ. Il n'y a pas de risque que le PDV soit retiré à chaque exécution puisque le retrait est lié à un effet précis.

Citation :
Mais pour les dommages je ne vois pas comment gérer ca sans faire des dommages systématiques.
Si PJ A recoit -n pdv alors lors de l'exécution du script, tu vérifies la différence entre le nombre de pdv max de PJ A et son nombre actuel si c'est inférieur, alors tu place une variable sur PJA qui dira au script que les pdv en - de PJA ont deja été décrémenté sur les autres PJ liés. Sur ce passage tu récupère le nom des PJ lié et tu leur applique les -n pdv. Au prochain passage du script, celui ci vérifiera si les pdv ont augmenté ou diminué. Selon le cas, la variable te permettra de voir la différence entre les PDV de PJ A a ce passage par rapport au passage précédent, et donc d'affecter aux autres pj uniquement la différence entre la valeur de la variable au passage n-1 et les pdv de PJA au passage n. Donc aucun risque de placer des pdv en moins ou plus à chaque passage de script.
Note en passant:
Je suggere de charger le nom des personnages liés a la connection du joueur et de le coller sur une variable locale sur les anneaux. A fortiori si c'est la database Bioware que tu utilises!
Remarque.. on peut pas le stocker direct sur l'objet tout simplement?
Y'a un truc que je ne dois pas comprendre dans l'histoire de la chaîne. Dans tous les cas, qu'on ais le nom des autres PC stocké sur l'anneau ou pas, il faudra faire ne boucle sur les PC present pour determiner s'ils ont bien ce nom ?

N'est-ce pas plus simple de faire comme je l'ai fait. C'est a dire de coller une variable commune à tous les porteurs d'anneaux, et donc de les identifier par cette variable plutôt que par leur nom ?
Ca permet de faire un (if(GetLocalInt(oItem) == 1) au lieu d'un if(GetName(oPC) == Truc || GetName(oPC) == bidule || GetName(oPC) == Truc || machin, etc...) non ?

Citation :
Lorsqu'il y a un effet qui se produit sur le PJ A, il est répercuté sur les PJ qui portent les anneaux liés.
Comment faire pour que cela se produise au moment où l'effet affecte le PJ A ? Si le script tourne en boucle toutes les x secondes, il ne détectera l'effet que au moment de son passage sur le PJ A non ?
Citation :
il faudra faire ne boucle sur les PC present pour determiner s'ils ont bien ce nom ?
Là c'est moi qui suis paumé ! Heu non ! Pourquoi faire ? Lorsqu'un PJ entre dans le module tu captes son id par rapport à son nom ! Et ensuite cet id est associé au nom. Il te reste plus qu'à exécuter tes scripts par rapport à cet id.

Citation :
N'est-ce pas plus simple de faire comme je l'ai fait.
C'est toi qui vois.

Citation :
Comment faire pour que cela se produise au moment où l'effet affecte le PJ A ? Si le script tourne en boucle toutes les x secondes, il ne détectera l'effet que au moment de son passage sur le PJ A non ?
Les miracles n'étant pas de mon domaine, je me cantonne à faire avec ce que propose Bioware. Autrement dit, les scripts ne pouvant pas être collé dans les évènements des objets PJ (même si par des moyens détournés on peut les attribuer, hélas ils ne s'exécuteront pas), tu a le choix du OnHeartBeat, ou du script qui s'auto appelle. Le dernier ayant 2 avantages :
- Réglage de la fréquence
- Possibilité d'arrêt/Démarrage à volonté

Pour certains types d'effet tu pourra faire dans l'instantané. Mais pour les pdv je ne crois pas.
Pour lier les anneaux, à la connexion je ferais un SetLocalObject sur chacun des anneaux afin de pouvoir directement atteindre l'autre porteur à partir d'un anneau.

Par contre pour détecter l'application d'un nouvel effet...

A priori les effets automatiques viennent via les sorts, les pièges, les souffles de dragon, les uppercuts des moines, les attaques handicapantes des roublards et deux trois trucs que j'ai surement oubliés. Les effets appliqués par des scripts maison ne posent pas de problème vu qu'il suffit de modifier le script pour l'appliquer aussi au porteau de l'autre anneau.

Si c'est par sort ça doit pouvoir se faire avec le spellhook, tu mets un bloc qui ne s'exécute que si la cible du sort porte tel ou tel anneau.
Comme le spellhook s'exécute avant le reste du sort par contre l'effet éventuel ne sera pas encore appliqué sur la cible, je suggère donc un DelayCommand d'une seconde qui vérifiera si un nouvel effet a été collé (ou enlevé, par une dissipation ou une restauration par exemple) sur la cible. Le problème c'est que c'est pas parce qu'on lance un sort d'effet sur quelqu'un que ça va nécessairement lui appliquer un nouvel effet : si c'est un sort offensif, ça ne le fait que s'il rate son jet, si c'est un sort amical ça ne le fait que si il ne bénéficiait pas de l'effet avant.

En revanche dans le spellhook on n'a pas accès à la durée de l'effet, donc je vois pas comment appliquer au porteur de l'autre anneau, un effet de même durée. A moins de calculer dans le spellhook la durée de l'effet du sort, qui est grosso modo soit 1 tour/niv, soit 1 round/niv, soit 1 heure/niv, modulo l'utilisation du don extension de durée. Dans tous les cas ça me paraît plus simple qu'un OnHeartBeat qui devrait vérifier l'ensemble des effets dont un PJ bénéficie, et les comparer au OnHeartBeat précédent.
En fouillant je me demande s'il n'est pas possible d'utiliser le script du module "OnUserDefined".

Ce scripte là se lance dans quelle circonstances ? Est-ce qu'il ne s'applique qu'aux PJs ?

Si tel est le cas, alors je peux utiliser l'EVENT_DAMAGED pour récupérer les dommages fait a un porteur et les infliger aux autres porteurs non ?
Citation :
Ce scripte là se lance dans quelle circonstances ?
Lorsque le module reçoit un évènement qu'on désires traiter au niveau module.

Citation :
Est-ce qu'il ne s'applique qu'aux PJs ?
Absolument pas.

Citation :
Si tel est le cas, alors je peux utiliser l'EVENT_DAMAGED pour récupérer les dommages fait a un porteur et les infliger aux autres porteurs non ?
Si l'event cité est capté dans ce script à chaque fois qu'un pj/pnj/objets utilisables subira des dégâts, le script du module (OnUserDefined) sera activé. Fais ton choix !
Citation :
Il te reste plus qu'à exécuter tes scripts par rapport à cet id.
Comment ?

Sinon j'ai aussi essayé de mettre des script sur les event des PJ avec Leto. En l'occurence un script sur le OnDamaged mais il ne se lance pas. Puis dans le OnUserDefined avec la variable quand le PJ entre dans le mod, cela ne marche pas non plus.

Quelqu'un a une idée de pourquoi un script mis sur un PJ ne se lance pas ?
Citation :
Comment ?

C'est ce que je t'explique depuis le début ! Chaque anneau reçoit des chaînes contenant le nom des PJ. Lorsqu'un pj entre dans le module il obtient un identificateur. Toi tu vérifies à ce moment là que le PJ qui entre n'a pas un des noms qui correspond aux noms contenus dans les chaînes. Si c'est le cas, tu associes l'identificateur du PJ à la chaîne. Ensuite tu lance un truc du style : ExecuteScript("MonScript",ID_du_PJ);. De plus tu places une variable de signalement au niveau du module comme quoi ce PJ est dans le monde. Cette variable est du type Objet et contient l'identificateur du PJ. La variable doit avoir un nom normalisé afin qu'il soit possible de la traiter en série.

Dans "MonScript" :

- Lors de la première entrée du PJ, il doit vérifier que le PJ porte l'anneau. Si c'est le cas il continue de se lancer et aussi, vérifie les variable de signalement afin de pouvoir appliquer les effets aux autre PJ si ceux-ci portent l'anneau et aussi qu'ils sont présent dans le module.

- Placer un script qui puisse lancer "MonScript" dans le OnPlayerEquipItem, dans le cas ou lors de l'entrée dans le module, le PJ ne portait pas l'anneau.

A chaque exécution de "MonScript", celui-ci doit vérifier que le PJ porte l'anneau. C'est la condition qui fait que le script se relance automatiquement.

Citation :
Quelqu'un a une idée de pourquoi un script mis sur un PJ ne se lance pas ?
Les PJ sont des objets qui sont sous le contrôle du joueur. Placer des scripts dans les évènements propres aux PNJ et que l'on retrouve dans le fichier bic du PJ sous Leto, revient à transgresser la règle du pouvoir qu'a le joueur sur son PJ. C'est un peu la porte ouverte à n'importe quoi. Déjà que les pouvoirs du DM sont horribles concernant la liberté des joueurs, imaginez un DM qui posséderait un bâton permettant de vous coller des scripts sur les évènements de vos PJ (ce qui est absolument faisable soit dit en passant par le biais que je viens d'expliquer ci-dessus, mais pas dans les emplacement des évènements), cela mettrait un sacré frein à l'envie des joueur de venir sur les mondes (Déjà qu'on trouve pas mal de module qui sont équipés de DM fous, égocentriques, se prenant pour des divinités et je passe les meilleurs).
Citation :
Publié par Mickey974

Chaque anneau reçoit des chaînes contenant le nom des PJ. Lorsqu'un pj entre dans le module il obtient un identificateur. Toi tu vérifies à ce moment là que le PJ qui entre n'a pas un des noms qui correspond aux noms contenus dans les chaînes. Si c'est le cas, tu associes l'identificateur du PJ à la chaîne. Ensuite tu lance un truc du style : ExecuteScript("MonScript",ID_du_PJ);.
ok, je pense avoir compris. Ce que tu avais oublié de préciser c'est qu'il faut définir l'objet qui correspond à l'ID au moment ou le PJ entre dans le module, ou dans le OnModuleLoad . Bref, quoi qu'il arrive il faut définir l'objet
Je ne voyais pas comment à partir d'un simple ID tu appliquais un objet sur la personne qu'elle désignait.
Donc, s'il faut définir l'objet, ca va donner un truc du genre GetItemPossessor("tag_d_anno_n").

Peut être que c'est dans ce genre de mise en place ou j'ai quelque lacunes. Quelqu'un peut-il expliquer comment rendre une definition d'objet durable sans qu'a chaque fois que celui-ci est appelé il soit redefinit ?

Est-ce qu'il y a une différence entre :
object oPC = GetItemPossessor(oItem)
et
object oPC_ID_Nom seul, sachant qu'on a définit oPC_ID_Nom = GetItemPossessor(oItem) quelque part avant, comme lors de l'entrée du PJ ?
Répondre

Connectés sur ce fil

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