La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 23/11/2024 22:00:28
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
Allansia Novice Messages: 5 |
Bonjour.
Ayant repris 2 vieux scripts tiré de la derniere extension et modifié un poil, je vous explique le fonctionnement. L'effet escompté, qui est de créer une zone de magie morte fonctionne mais y a des problemes. Voici comment ca se passe : - Les 2 Script s'utilise dans un Trigger, sur l'événement OnExit et OnEnter. - Dès que le PJ entre dans la zone tous les sorts en fonctions disparaissent ainsi que les pouvoirs des objets magiques. - une copie de l'équipement (avec encore les effets magiques) est faites sur le WayPoint "MORTE_CHEST", donc prévoyer de mettre le WP dans une zone non accessible aux PJ dans la meme zone. - Quand le PJ déambule dans la zone, il ne peux lancer aucun sort. Ils subissent un échec de 100% - dès que le PJ sors de la zone il retrouve la magie de ses objets qu'il transporte sur lui (s'il a déposé sa fidele épée +100 de la mort qui tue dans la zone de magie morte ben elle reste sur le WP, donc s'il veut la récupérer il va la rechercher). A noter que ces deux scripts n'affecte en rien les objets placer dans des conteneur (sac magique). TOUT le contenu qui se trouve sur le PJ lors de sa sortie est restitué (je sais je radote) et au même emplacement qu'il soit équipé ou non. Script à mettre dans le OnEnter : NWScript :
#include "x2_inc_itemprop" void RemoveAllProperties(object oItem, object oPC) { if(oItem == OBJECT_INVALID) return; // WayPoint ou vont etre copie les objets object oWP = GetWaypointByTag("MORTE_CHEST"); // ici les variables de copie d'objet int nKey = GetLocalInt(OBJECT_SELF, "ITEM_KEY"); nKey++; SetLocalInt(OBJECT_SELF, "ITEM_KEY", nKey); string sKey = IntToString(nKey); object oCopy = CopyObject(oItem, GetLocation(oWP), OBJECT_INVALID, "morte_item" + sKey); SetLocalString(oItem, "ITEM_KEY", sKey); itemproperty ip = GetFirstItemProperty(oItem); while(GetIsItemPropertyValid(ip)) { RemoveItemProperty(oItem, ip); ip = GetNextItemProperty(oItem); } } void RemoveEffects(object oObject) { effect eEff = GetFirstEffect(oObject); while(GetIsEffectValid(eEff)) { int nType = GetEffectType(eEff); if(GetEffectSubType(eEff) != SUBTYPE_EXTRAORDINARY && (nType == EFFECT_TYPE_ABILITY_INCREASE || nType == EFFECT_TYPE_AC_INCREASE || nType == EFFECT_TYPE_ATTACK_INCREASE || nType == EFFECT_TYPE_BLINDNESS || nType == EFFECT_TYPE_CHARMED || nType == EFFECT_TYPE_CONCEALMENT || nType == EFFECT_TYPE_CONFUSED || nType == EFFECT_TYPE_CURSE || nType == EFFECT_TYPE_DAMAGE_IMMUNITY_INCREASE || nType == EFFECT_TYPE_DAMAGE_INCREASE || nType == EFFECT_TYPE_DAMAGE_REDUCTION || nType == EFFECT_TYPE_DAMAGE_RESISTANCE || nType == EFFECT_TYPE_DAZED || nType == EFFECT_TYPE_DEAF || nType == EFFECT_TYPE_DOMINATED || nType == EFFECT_TYPE_ELEMENTALSHIELD || nType == EFFECT_TYPE_ETHEREAL || nType == EFFECT_TYPE_FRIGHTENED || nType == EFFECT_TYPE_HASTE || nType == EFFECT_TYPE_IMMUNITY || nType == EFFECT_TYPE_IMPROVEDINVISIBILITY || nType == EFFECT_TYPE_INVISIBILITY || nType == EFFECT_TYPE_INVULNERABLE || nType == EFFECT_TYPE_ABILITY_INCREASE || nType == EFFECT_TYPE_NEGATIVELEVEL || nType == EFFECT_TYPE_PARALYZE || nType == EFFECT_TYPE_POLYMORPH || nType == EFFECT_TYPE_REGENERATE || nType == EFFECT_TYPE_SANCTUARY || nType == EFFECT_TYPE_SAVING_THROW_INCREASE || nType == EFFECT_TYPE_SEEINVISIBLE || nType == EFFECT_TYPE_SILENCE || nType == EFFECT_TYPE_SKILL_INCREASE || nType == EFFECT_TYPE_SLOW || nType == EFFECT_TYPE_SPELL_IMMUNITY || nType == EFFECT_TYPE_SPELL_RESISTANCE_INCREASE || nType == EFFECT_TYPE_SPELLLEVELABSORPTION || nType == EFFECT_TYPE_TEMPORARY_HITPOINTS || nType == EFFECT_TYPE_TRUESEEING || nType == EFFECT_TYPE_ULTRAVISION || nType == EFFECT_TYPE_INVULNERABLE)) RemoveEffect(oObject, eEff); eEff = GetNextEffect(oObject); } } void main() { object oEnter = GetEnteringObject(); // j'ajoute ca pour les summons de creatures object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION,oEnter); object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR,oEnter); object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED,oEnter); object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED,oEnter); // et ici ce qui detruit les creatures deja invoques if(GetIsObjectValid(oAnimal)) { ActionDoCommand(DestroyObject(oAnimal)); } if(GetIsObjectValid(oFamiliar)) { ActionDoCommand(DestroyObject(oFamiliar)); } if(GetIsObjectValid(oDominated)) { ActionDoCommand(DestroyObject(oDominated)); } if(GetIsObjectValid(oSummoned)) { ActionDoCommand(DestroyObject(oSummoned)); } // j'enleve les effets magiques RemoveEffects(oEnter); // je met un echec de sorts a 100% effect eSpellFailure = EffectSpellFailure(100, SPELL_SCHOOL_GENERAL); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSpellFailure, oEnter); // j'enleve les effets magiques des objets qui deviennent non-magiques // je copie les objets avant leur dissipation object oItem = GetFirstItemInInventory(oEnter); while(oItem != OBJECT_INVALID) { RemoveAllProperties(oItem, oEnter); oItem = GetNextItemInInventory(oEnter); } oItem = GetItemInSlot(INVENTORY_SLOT_ARMS, oEnter); RemoveAllProperties(oItem, oEnter); oItem = GetItemInSlot(INVENTORY_SLOT_ARROWS, oEnter); RemoveAllProperties(oItem, oEnter); oItem = GetItemInSlot(INVENTORY_SLOT_BELT, oEnter); RemoveAllProperties(oItem, oEnter); oItem = GetItemInSlot(INVENTORY_SLOT_BOLTS, oEnter); RemoveAllProperties(oItem, oEnter); oItem = GetItemInSlot(INVENTORY_SLOT_BOOTS, oEnter); RemoveAllProperties(oItem, oEnter); oItem = GetItemInSlot(INVENTORY_SLOT_BULLETS, oEnter); RemoveAllProperties(oItem, oEnter); oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oEnter); RemoveAllProperties(oItem, oEnter); oItem = GetItemInSlot(INVENTORY_SLOT_CLOAK, oEnter); RemoveAllProperties(oItem, oEnter); oItem = GetItemInSlot(INVENTORY_SLOT_HEAD, oEnter); RemoveAllProperties(oItem, oEnter); oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oEnter); RemoveAllProperties(oItem, oEnter); oItem = GetItemInSlot(INVENTORY_SLOT_LEFTRING, oEnter); RemoveAllProperties(oItem, oEnter); oItem = GetItemInSlot(INVENTORY_SLOT_NECK, oEnter); RemoveAllProperties(oItem, oEnter); oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oEnter); RemoveAllProperties(oItem, oEnter); oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oEnter); RemoveAllProperties(oItem, oEnter); } Script à mettre dans le OnExit : NWScript :
#include "x2_inc_itemprop" void RestoreAllProperties(object oItem, object oPC, int nSlot = -1) { if(oPC != OBJECT_INVALID) { if(oItem == OBJECT_INVALID) oItem = GetItemInSlot(nSlot, oPC); if(oItem == OBJECT_INVALID) return; } string sKey = GetLocalString(oItem, "ITEM_KEY"); object oOriginalItem = GetObjectByTag("morte_item" + sKey); object oNewItem; if(oOriginalItem != OBJECT_INVALID) { IPCopyItemProperties(oOriginalItem, oItem); DestroyObject(oOriginalItem); DeleteLocalString(oItem, "ITEM_KEY"); } } void RemoveEffects(object oObject) { effect eEff = GetFirstEffect(oObject); while(GetIsEffectValid(eEff)) { if(GetEffectType(eEff) == EFFECT_TYPE_SPELL_FAILURE || GetEffectType(eEff) == EFFECT_TYPE_POLYMORPH) RemoveEffect(oObject, eEff); eEff = GetNextEffect(oObject); } } void main() { object oExit = GetExitingObject(); if(GetObjectType(oExit) == OBJECT_TYPE_CREATURE) { //Ici le Pj peux de nouveau lancer des sorts RemoveEffects(oExit); //Ici il recupere les objets magiques qu'il a garde sur lui object oItem = GetFirstItemInInventory(oExit); while(oItem != OBJECT_INVALID) { DelayCommand(4.0, RestoreAllProperties(oItem, oExit, -1)); oItem = GetNextItemInInventory(oExit); } DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_ARMS)); DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_ARROWS)); DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_BELT)); DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_BOLTS)); DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_BOOTS)); DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_BULLETS)); DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_CHEST)); DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_CLOAK)); DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_HEAD)); DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_LEFTHAND)); DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_LEFTRING)); DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_NECK)); DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_RIGHTHAND)); DelayCommand(4.0, RestoreAllProperties(OBJECT_INVALID, oExit, INVENTORY_SLOT_RIGHTRING)); } } Et voila, maintenant passons aux problêmes que j'ai relever (il y en a peut etre d'autre aussi) : - Les créatures invoqués/contrôlés/familiers ne sont pas affectés alors qu'elles devraient, j'ai pas réussi a trouver une fonction script qui renvoi un familier ou une créature convoqués. - Lors de l'entrée dans la zone (donc c'est a ce moment la que les objets sont copiés), j'ai l'impression qu'il y a une grosse perte de ressources et un brutal lag. Pas réussie a le régler. - Bizaremment, si on met les deux scripts dans le OnEnter/OnExit d'une zone ils ne fonctionnent pas, seulement dans un trigger. - J'ai pu testé que pour un seul joueur, donc je sais pas sur un mod multi ce que ca donne. - Je ne sais pas non plus en cas de déco/reco du perso dans la zone de magie morte, si celui-ci retrouve ses objets d'origine, si ca change rien ou si y a un prob et qu'il récupère pas ses objets magiques (en gros le script fais un duplicate des objets en les rendant non magiques et stock sur le WP les objets magiques). Bon je chippote la un peu mais ca peut engendrer des problemes. - Je crois que c'est tout, mais il peut y avoir d'autre problemes. A vos idées/suggestions, je suis partis sur le principe de respecter un maximum le BG des zone de magie morte des Royaumes Oubliés et comme y avait un effet identique dans la derniere extension, j'en ai profiter mais reste a le paufiner. Tel quel il fonctionne sauf les problemes que j'ai cité, en espérant qu'il serve a quelqu'un. Edit : Je viens de penser qu'il peut y avoir un prob si on est transformé (pas la capacité des druides qui est naturelle), mais si on a un effet type loup garou ou autre ou via un sort ? En théorie et en suivant le Bg il faut que la transformation cesse (mais ne reprenne pas car ca proviens un sort - si c'est une malédiction comme la lycanthropie la je sais pas). |
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
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