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 16:34:02
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 |
lhymn Novice Messages: 10 |
Posté le : 19/12/2003 15:34:40 Sujet du message : Une faction qui n'attaque plus si on possède un objet
Je recherche un scripte ou autre chose qui me permettrait de
Changé la réaction d'une faction (hostilité en neutre par exemple) si on possède un objet (exemple une armure bien précise) Merci pour toute aide que vous pouvez m'apporté |
Revenir en haut | |
Lavok Légende vivante Messages: 434 Localisation: Sphère planaire |
Voilà le petit script nécessaire à cette opération :
NWScript : void main() { object oPC = GetFirstPC(); object oItem = GetItemPossessedBy(oPC, "Tag_de_l'objet"); object oMembre = GetObjectByTag("Tag_d'un_membre_quelconque_de_la_faction"); if(GetIsObjectValid(oItem)==FALSE) { AdjustReputation(oPC, oMembre, 50-GetFactionAverageReputation(oMembre, oPC)); } } _________________ ToB : Une seule chose semble certaine : tant que le trône de sang de Bhaal restera vide, le chaos règnera. Moi : Une seule chose semble certaine : tant que la tête de singe de Bush restera vide, le chaos règnera. |
Revenir en haut | |
lhymn Novice Messages: 10 |
Merci très cool pour le scripte cela vas bien m'aidé
Pour le module multi on verra une autre fois car je débute Et merci encore |
Revenir en haut | |
lhymn Novice Messages: 10 |
Je m'ais ce scripte dans OnActivateItem ou autre par ?
|
Revenir en haut | |
Lavok Légende vivante Messages: 434 Localisation: Sphère planaire |
Non, l'événement OnActivateItem se déclenche quand on utilise le pouvoir spécial d'un objet d'inventaire.
Mets ceci dans l'OnAcquireItem du module : NWScript :
void main() { object oPC = GetModuleItemAcquiredBy(); object oItem = GetModuleItemAcquired(); object oMembre = GetObjectByTag("Tag_d'un_membre_quelconque_de_la_faction"); if(GetTag(oItem)=="Tag_de_l'objet") { SetLocalObject(oPC, "objetfaction", oItem); SetLocalInt(oPC, "factionobjet", GetFactionAverageReputation(oMembre, oPC)); AdjustReputation(oPC, oMembre, 50-GetFactionAverageReputation(oMembre, oPC)); } } Et ça dans le OnUnAcquireItem : NWScript :
void main() { object oPC = GetFirstPC(); object oItem = GetLocalObject(oPC, "objetfaction"); object oMembre = GetObjectByTag("Tag_d'un_membre_quelconque_de_la_faction"); if(GetTag(oItem)=="Tag_de_l'objet") { AdjustReputation(oPC, oMembre, GetLocalInt(oPC, "factionobject")-GetFactionAverageReputation(oMembre, oPC)); } } Ce deuxième script remettra l'atitude de la faction à celle qu'elle avait au moment où le joueur ramasse l'objet qui déclenche le changement de réputation. Ceci dit, si pour que la faction soit neutre il faut que le joueur porte une armure, la procédure est complétement différente. _________________ ToB : Une seule chose semble certaine : tant que le trône de sang de Bhaal restera vide, le chaos règnera. Moi : Une seule chose semble certaine : tant que la tête de singe de Bush restera vide, le chaos règnera. |
Revenir en haut | |
lhymn Novice Messages: 10 |
Lavok a écrit : Ceci dit, si pour que la faction soit neutre il faut que le joueur porte une armure, la procédure est complétement différente. |
Revenir en haut | |
Lavok Légende vivante Messages: 434 Localisation: Sphère planaire |
Si tu pouvais expliquer un peu le contexte, je rendrais mes scripts moins austères et je saurais ce qui convient ou non à la situation... Comme tu peux le constater, les scripts que je t'ai donnés jusqu'à présent n'étaient pas adaptés .
En ce qui concerne ton histoire, je suppose qu'il s'agit d'une phase d'infiltration où le joueur se déguise en garde, j'ai bon ? _________________ ToB : Une seule chose semble certaine : tant que le trône de sang de Bhaal restera vide, le chaos règnera. Moi : Une seule chose semble certaine : tant que la tête de singe de Bush restera vide, le chaos règnera. |
Revenir en haut | |
lhymn Novice Messages: 10 |
Pardon c'est vrais que je n'ais pas trop expliqué
Tu as tout à fait compris en faîte c'est pour une quête le joueur doit s'introduire dans un campement ennemie pour récupéré un objet et une de façon de le faire c'est de mettre une armure de l'ennemie trouvé Voilà |
Revenir en haut | |
Lavok Légende vivante Messages: 434 Localisation: Sphère planaire |
J'ai rajouté un cri d'alerte qui fait se rameuter les autres gardes. Attention, c'est costaud !
Script d'include (à ne mettre nulle part mais à nommer 'includealerte') : NWScript :
void ConditionAlerte(object oIntrus) { SpeakString("Alerte !", TALKVOLUME_SHOUT); AdjustReputation(oIntrus, OBJECT_SELF, -100); float fDistanceAlerte = 50.0; object oGarde = GetFirstObjectInShape(SHAPE_SPHERE, fDistanceAlerte, GetLocation(OBJECT_SELF)); while(GetIsObjectValid(oGarde)==TRUE) { if(GetFactionEqual(oGarde)==TRUE && GetIsInCombat(oGarde)==FALSE) { AssignCommand(oGarde, ActionAttack(oIntrus)); } oGarde = GetNextObjectInShape(SHAPE_SPHERE, 50.0, GetLocation(OBJECT_SELF)); } } void Alerte(object oJoueur) { if(GetIsInCombat(OBJECT_SELF)==FALSE && GetCurrentAction(OBJECT_SELF)!= ACTION_ATTACKOBJECT) { ConditionAlerte(oJoueur); } else if (GetLocalInt(oJoueur, "pjattaqueungarde")==1) { ConditionAlerte(oJoueur); SetLocalInt(oJoueur, "pjattaqueungarde", 2); } } Script à placer dans le 'OnPerception' de chaque garde : NWScript :
//:///////////////////////// //////////////////////// //:: NW_C2_DEFAULT2 /* Default OnPerception event handler for NPCs. Handles behavior when perceiving a creature for the first time. */ //:///////////////////////// //////////////////////// #include "includealerte" #include "nw_i0_generic" void main() { // * if not runnning normal or better Ai then exit for performance reasons // * if not runnning normal or better Ai then exit for performance reasons object oPercep = GetLastPerceived(); if(GetIsPC(oPercep)==TRUE) { if(GetTag(GetItemInSlot(INVENTORY_SLOT_CHEST, oPercep))=="Tag_armure") { if(GetLocalInt(oPercep, "pjinfiltration")==0) { AdjustReputation(oPercep, OBJECT_SELF, 50-GetFactionAverageReputation(OBJECT_SELF, oPercep)); SetLocalInt(oPercep, "pjinfiltration", 1); } else if(GetIsEnemy(oPercep)==TRUE) { Alerte(oPercep); } } else { Alerte(oPercep); } } if (GetAILevel() == AI_LEVEL_VERY_LOW) return; int bSeen = GetLastPerceptionSeen(); // This will cause the NPC to speak their one-liner // conversation on perception even if they are already // in combat. if(GetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERSATION) && GetIsPC(oPercep) && bSeen) { SpeakOneLinerConversation(); } // March 5 2003 Brent // Had to add this section back in, since modifications were not taking this specific // example into account -- it made invisibility basically useless. //If the last perception event was hearing based or if someone vanished then go to search mode if ((GetLastPerceptionVanished()) && GetIsEnemy(GetLastPerceived())) { object oGone = GetLastPerceived(); if((GetAttemptedAttackTarget() == GetLastPerceived() || GetAttemptedSpellTarget() == GetLastPerceived() || GetAttackTarget() == GetLastPerceived()) && GetArea(GetLastPerceived()) != GetArea(OBJECT_SELF)) { //SpeakString("dude...lik e disappeared."); ClearAllActions(); DetermineCombatRound(); } } // This section has been heavily revised while keeping the // pre-existing behavior: // - If we're in combat, keep fighting. // - If not and we've perceived an enemy, start to fight. // Even if the perception event was a 'vanish', that's // still what we do anyway, since that will keep us // fighting any visible targets. // - If we're not in combat and haven't perceived an enemy, // see if the perception target is a PC and if we should // speak our attention-getting one-liner. if (GetIsFighting(OBJECT_SELF)) { // don't do anything else, we're busy MyPrintString("GetIsFighting: TRUE"); } // * BK FEB 2003 Only fight if you can see them. DO NOT RELY ON HEARING FOR ENEMY DETECTION else if (GetIsEnemy(oPercep) && bSeen) { MyPrintString("GetIsEnemy: TRUE"); // We spotted an enemy and we're not already fighting if(!GetHasEffect(EFFECT_TYPE_SLEEP)) { if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) { MyPrintString("DetermineSpecialBehavior"); DetermineSpecialBehavior(); } else { MyPrintString("DetermineCombatRound"); SetFacingPoint(GetPosition(oPercep)); SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK); DetermineCombatRound(); } } } else { if (bSeen) { MyPrintString("GetLastPerceptionSeen: TRUE"); if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) { DetermineSpecialBehavior(); } else if (GetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION) && GetIsPC(oPercep)) { // The NPC will speak their one-liner conversation // This should probably be: // SpeakOneLinerConversation(oPer cep); // instead, but leaving it as is for now. ActionStartConversation(OBJECT_SELF); } } // activate ambient animations or walk waypoints if appropriate if (!IsInConversation(OBJECT_SELF)) { if (GetIsPostOrWalking()) { WalkWayPoints(); } else if (GetIsPC(oPercep) && (GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS) || GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVIAN) || GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS) || GetIsEncounterCreature())) { SetAnimationCondition(NW_ANIM_FLAG_IS_ACTIVE); } } } // Send the user-defined event if appropriate if(GetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT) && GetLastPerceptionSeen()) { SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_PERCEIVE)); } } Script à placer dans le 'OnHeartbeat' de chaque garde : NWScript :
//:///////////////////////// //////////////////////// //:: NW_C2_DEFAULT1 /* Default OnHeartbeat script for NPCs. This script causes NPCs to perform default animations while not otherwise engaged. This script duplicates the behavior of the default script and just cleans up the code and removes redundant conditional checks. */ //:///////////////////////// //////////////////////// //:: Copyright (c) 2002 Floodgate Entertainment //:: Created By: Naomi Novik //:: Created On: 12/22/2002 //:///////////////////////// //////////////////////// #include "includealerte" #include "nw_i0_generic" void main() { object oPC = GetFirstPC(); if(GetObjectSeen(oPC) ==TRUE || GetObjectHeard(oPC)==TRUE) { if(GetTag(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC))!="Tag_armure" && GetLocalInt(oPC, "pjinfiltration")==1) { Alerte(oPC); } else if(GetIsEnemy(oPC)==TRUE) { Alerte(oPC); } } // * if not runnning normal or better Ai then exit for performance reasons if (GetAILevel() == AI_LEVEL_VERY_LOW) return; // Buff ourselves up right away if we should if(GetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY)) { // This will return TRUE if an enemy was within 40.0 m // and we buffed ourselves up instantly to respond -- // simulates a spellcaster with protections enabled // already. if(TalentAdvancedBuff(40.0)) { // This is a one-shot deal SetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY, FALSE); // This return means we skip sending the user-defined // heartbeat signal in this one case. return; } } if(GetHasEffect(EFFECT_TYPE_SLEEP)) { // If we're asleep and this is the result of sleeping // at night, apply the floating 'z's visual effect // every so often if(GetSpawnInCondition(NW_FLAG_SLEEPING_AT_NIGHT)) { effect eVis = EffectVisualEffect(VFX_IMP_SLEEP); if(d10() > 6) { ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); } } } // If we have the 'constant' waypoints flag set, walk to the next // waypoint. else if ( GetWalkCondition(NW_WALK_FLAG_CONSTANT) ) { WalkWayPoints(); } // Check to see if we should be playing default animations // - make sure we don't have any current targets else if ( !GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget()) // && !GetIsPostOrWalking()) && !GetIsObjectValid(GetNearestSeenEnemy())) { if (GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL) || GetBehaviorState(NW_FLAG_BEHAVIOR_OMNIVORE) || GetBehaviorState(NW_FLAG_BEHAVIOR_HERBIVORE)) { // This handles special attacking/fleeing behavior // for omnivores & herbivores. DetermineSpecialBehavior(); } else if (!IsInConversation(OBJECT_SELF)) { if (GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS) || GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVIAN) || GetIsEncounterCreature()) { PlayMobileAmbientAnimations(); } else if (GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS)) { PlayImmobileAmbientAnimations(); } } } // Send the user-defined event signal if specified if(GetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_HEARTBEAT)); } } Et enfin script à placer dans le 'OnPhysicalAttacked' de chaque garde : NWScript :
//:///////////////////////// ///////////////////// //:: Default On Attacked //:: NW_C2_DEFAULT5 //:: Copyright (c) 2001 Bioware Corp. //:///////////////////////// //////////////////// /* If already fighting then ignore, else determine combat round */ //:///////////////////////// //////////////////// //:: Created By: Preston Watamaniuk //:: Created On: Oct 16, 2001 //:///////////////////////// //////////////////// #include "includealerte" #include "nw_i0_generic" void main() { object oPC = GetFirstPC(); object oAttaquant = GetLastAttacker(); if(oPC==oAttaquant || oPC==GetMaster(oAttaquant)) { if(GetTag(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC))=="Tag_armure" && GetLocalInt(oPC, "pjattaqueungarde")==0) { SetLocalInt(oPC, "pjattaqueungarde", 1); Alerte(oPC); } } if(GetFleeToExit()) { // Run away! ActivateFleeToExit(); } else if (GetSpawnInCondition(NW_FLAG_SET_WARNINGS)) { // We give an attacker one warning before we attack // This is not fully implemented yet SetSpawnInCondition(NW_FLAG_SET_WARNINGS, FALSE); //Put a check in to see if this attacker was the last attacker //Possibly change the GetNPCWarning function to make the check } else { object oAttacker = GetLastAttacker(); if (!GetIsObjectValid(oAttacker)) { // Don't do anything, invalid attacker } else if (!GetIsFighting(OBJECT_SELF)) { // We're not fighting anyone else, so // start fighting the attacker if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) { SetSummonHelpIfAttacked(); DetermineSpecialBehavior(oAttacker); } else if (GetArea(oAttacker) == GetArea(OBJECT_SELF)) { SetSummonHelpIfAttacked(); DetermineCombatRound(oAttacker); } //Shout Attack my target, only works with the On Spawn In setup SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK); //Shout that I was attacked SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK); } } if(GetSpawnInCondition(NW_FLAG_ATTACK_EVENT)) { SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_ATTACKED)); } } Brèves explications : Tu es libre de garder ou non le cri d'alerte, mais j'avais pensé qu'il serait intéressant que des gardes accourent au cri de leur collègue (ainsi le joueur se voit forcé d'attaquer un garde isolé pour réussir son infiltration). La "portée" de ces cris est de 50 mètres par défaut (change le float dans le premier script si tu désires une autre distance). Le tag de l'armure doit être 'Tag_armure' ou le tien mais dans ce cas, il te faudra changer ce tag dans mes scripts . _________________ ToB : Une seule chose semble certaine : tant que le trône de sang de Bhaal restera vide, le chaos règnera. Moi : Une seule chose semble certaine : tant que la tête de singe de Bush restera vide, le chaos règnera. |
Revenir en haut | |
Slim_Shadow Novice Messages: 6 |
Pour ca :
NWScript :
if(GetTag(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC))=="Tag_armure" && GetLocalInt(oPC, "pjattaqueungarde")==0) Si on veut qu'au lieu que cela soit une armure on veuille juste que ce soit une objet dans l'inventaire. Comment on fait ? Que faut il changé dans tes script pour que ca marche N Désolé je debute moi aussi |
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