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:07:51
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 |
Blackblood Chevalier Messages: 80 Localisation: France |
Bonjour à tous,
J'aimerais que mon garde réagisse lorsqu'un PJ attaque un autre PJ. J'avoue que ce doit être compliqué à réaliser car j'ai du mal à trouver la solution. Les faits : mon garde possède déjà un script sur OnHeartBeat qui vérifie si le PJ a ses armes à la main et lui demande de les enlever. Afin d'éviter le OnHeartBeat gourmand en ressource, je souhaiterais placer le script sur OnPerception. Ce que je veux : que le NPC(garde) attaque le PJ attaquant un PJ. Difficile pour lui de faire la distinction qui attaque qui ? (GetlastAttacker). Voilà, merci d'avance pour votre aide. |
Revenir en haut | |
Joubinator Ecuyer Messages: 42 Localisation: Yvelines |
Juste une idée comme cela ....
Si tu utilisais le OnHeartBeat de ta Zone. 1 seul script pour tout tes pnjs. C'est mieux que 1 script par Pnjs Idée : NWScript :
Si le dernier attaqué est un Pj et Si le dernier attaquant est un Pj Alors Changer la réputation du Pj attaquant à 0 vis à vis de la faction de tes gardes Normalement des que tes gardes entendront, veront le pj attaquant ils devraient l'attaquer Cela pourrait être pas mal non? _________________ M'enfous si les pjs tuent mes monstres,.... j'en ai plein (paroles d'un DM d'expérience ) |
Revenir en haut | |
Blackblood Chevalier Messages: 80 Localisation: France |
Pas bête ce que tu suggère : si le dernier attaquant = PJ et si le dernier attaqué = PJ alors faction des gardes = - 100 et cible = dernier attaquant.
ça pourrait fonctionner sur le OnPerception ? Car si un garde perçoit ces données, ce sera toute la faction qui attaquera. |
Revenir en haut | |
Joubinator Ecuyer Messages: 42 Localisation: Yvelines |
J'ai pas Aurora sous les yeux et je n'aurai certainement pas le temps de le tester, mais voici ce que j'ai fait de mémoire.
Si tu pouvais l'essayer. NWScript : void main() { object oPC = GetFirstPC(); object oArea = GetArea(oPC); object oPj1 = GetLastAttacker(oPC); object oPj2 = GetAttackTarget(oPj1); if (GetIsInCombat(oPC)&& GetIsObjectValid(oPj2)) { while (GetIsObjectValid(oPC) == TRUE && GetArea(OBJECT_SELF)==oArea) { oPC = GetNextPC(); } AdjustReputation(oPj1, oPnj, -100); } } }/* suspect block end found !*/ _________________ M'enfous si les pjs tuent mes monstres,.... j'en ai plein (paroles d'un DM d'expérience ) |
Revenir en haut | |
Joubinator Ecuyer Messages: 42 Localisation: Yvelines |
J'ai pas Aurora sous les yeux et je n'aurai certainement pas le temps de le tester, mais voici ce que j'ai fait de mémoire.
Si tu pouvais l'essayer. Si l'idée est réalisable, se serait chouette pour beaucoup de monde. Effectivement , si le pj attaquant entre dans le champ de vision du pnj, et que le pj a aussi une réputation de 0 vis à vis de la faction du pnj, alors il me semble bien que le pnj attaque le pj:oops: NWScript : void main() { object oPC = GetFirstPC(); object oArea = GetArea(oPC); object oPj1 = GetLastAttacker(oPC); object oPj2 = GetAttackTarget(oPj1); if (GetIsInCombat(oPC)&& GetIsObjectValid(oPj2)) { while (GetIsObjectValid(oPC) == TRUE && GetArea(OBJECT_SELF)==oArea) { AdjustReputation(oPj1, oPnj, -100); oPC = GetNextPC(); } } } _________________ M'enfous si les pjs tuent mes monstres,.... j'en ai plein (paroles d'un DM d'expérience ) |
Revenir en haut | |
Blackblood Chevalier Messages: 80 Localisation: France |
Merci pour tes réponses Joubinator.
Après avoir placé le script sur OnPerception du PNJ, je constate que cela ne fonctionne pas. Mettons-nous à la place du PNJ : il perçoit 2 joueurs qui s'approchent ---> le script se déclenchent, ils ne sont pas en combat donc pas de réaction. Et c'est fini, même si ensuite les PJ se battent, le PNJ a fait son boulot sur le OnPerception. Je n'ai pas eu le temps de tester en plaçant le script sur OnHeartBeat pour voir si les réactions du PNJ serait meilleur. Je crois que ce script est ambitieux, surtout pour un débutant comme-moi. |
Revenir en haut | |
Joubinator Ecuyer Messages: 42 Localisation: Yvelines |
Attention le script est à placer dans le ONHEARTBEAT de ta Zone
Le but est de mettre 1 seul script qui gere la situtation evoquée pour tout tes pnjs de cette zone, plutot que de mettre 1 script par pnj. _________________ M'enfous si les pjs tuent mes monstres,.... j'en ai plein (paroles d'un DM d'expérience ) |
Revenir en haut | |
Blackblood Chevalier Messages: 80 Localisation: France |
arf, j'avais oublié, désolé, je te tiens au courant.
merci encore |
Revenir en haut | |
Blackblood Chevalier Messages: 80 Localisation: France |
Bon désolé mais ça ne fonctionne pas. J'ai le sentiment qu'il faudrait se pencher vers une fonction type GetNearestPC, mais celui-là il est chaud comme la braise avec toutes ces données ....
|
Revenir en haut | |
Blackblood Chevalier Messages: 80 Localisation: France |
Salut, j'ai trouvé un petit quelque chose qui commence à fonctionner, il n'est pas terminé mais au moins le garde réagis et attaque le tueur de joueur !
J'ai voulu qu'ensuite le garde (PNJ) ressucite la victime de l'assassin mais il est tranquillement retourné à sa place Voici le script : NWScript : #include "nw_i0_generic" /* Script generated by Lilac Soul's NWN Script Generator, v. 1.6 For download info, please visit: http://www.lilacsoul.revilit y.com */ //Goes OnPlayerDeath of the module properties void main() { object oPC1 = GetLastPlayerDied(); if (!GetIsPC(oPC1)) return; object oPC2 = GetLastAttacker(oPC1); if (!GetIsPC(oPC2)) return; ///// la garde de Lyon attaque le tueur ///// object oTarget; oTarget = GetObjectByTag("Garde_de_Lyon"); AdjustReputation(oPC, oTarget, -100); oTarget = GetObjectByTag("Garde_de_Lyon"); SetIsTemporaryEnemy(oPC2, oTarget); AssignCommand(oTarget, ActionAttack(oPC2)); AssignCommand(oTarget, DetermineCombatRound(oPC2)); ///// le Garde de Lyon ressucite la victime ////// object oCaster; oCaster = GetObjectByTag("Garde_de_Lyon"); oTarget = GetObjectByTag(oPC1); AssignCommand(oCaster, ActionCastSpellAtObject(SPELL_RESURRECTION, oTarget, METAMAGIC_ANY, FALSE, 20, PROJECTILE_PATH_TYPE_DEFAULT, TRUE)); } |
Revenir en haut | |
kiky.le.magnifique Homme très gay Messages: 907 Localisation: Camping de la nation martienne... |
Ton garde a t il la capacité de le faire?
(forcément, si c'est un guerrier ou un barbare...) Change ta variable Bcheat sur TRUE dans ton ActionCastSpell peut être... ActionCastSpellAtObject(SPELL_RESURRECTION, oTarget, METAMAGIC_ANY, TRUE, 20, PROJECTILE_PATH_TYPE_DEFAULT, TRUE) _________________ http://perso.wanadoo.fr/kikitor | Deviant Art | www.VistaEntraide.com | CCLLSELFV! | D-lire_K | Viendez rêver au Pays des fées... | Ne taquinez pas l'admin! |
Revenir en haut | |
Blackblood Chevalier Messages: 80 Localisation: France |
Oui mon garde a la capacité de lancer des sorts puisqu'en plus d'être guerrier, il est également prêtre.
Je pense comprendre pourquoi il ne ressucite pas la victime. Nous sommes d'accord sur le fait que ce script se déclenche à la mort d'un jouer (jusque là tout va bien). Le garde identifie l'assassin par le "object oPC2 = GetLastAttacker(oPC1); " sur la victime. Que fait le garde il attaque et tue l'assassin ---> OnPlayerDeath, le script se déclenche à nouveau et l'assassin devient devient le "GetLastPlayerDied" donc la victime n'est plus enregistré par le garde. Il me faut donc trouver une variable qui pourrait stocker le tag de la victime jusqu'à sa résurrection. |
Revenir en haut | |
Blackblood Chevalier Messages: 80 Localisation: France |
Je viens de terminer mon scripte qui fonctionne, je vous en fais la primeur.
Voici son fonctionnement : un joueur en tue un deuxième dans la zone "ville". Un des gardes de la ville s'approche de l'assassin, lui parle et l'assassin est envoyé en prison (tag waypoint). Un deuxième garde s'approche de la victime et le ressucite. Ce script est à placer dans le OnPlayerDeath du module. Le première partie assez longue est le script d'origine qui permet soit la déco, soit le respawn soit d'attendre ... NWScript : ///// partie Bioware ///// //:///////////////////////// ///////////////////// //:: Death Script //:: NW_O0_DEATH.NSS //:: Copyright (c) 2001 Bioware Corp. //:///////////////////////// //////////////////// /* This script handles the default behavior that occurs when a player dies. BK: October 8 2002: Overriden for Expansion */ //:///////////////////////// //////////////////// //:: Created By: Brent Knowles //:: Created On: November 6, 2001 //:///////////////////////// //////////////////// /* void ClearAllFactionMembers(object oMember, object oPlayer) { // AssignCommand(oMember, SpeakString("here")) ; AdjustReputation(oPlayer, oMember, 100); SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad&qu ot;, 10); // * Player bad object oClear = GetFirstFactionMember(oMember, FALSE); while (GetIsObjectValid(oClear) == TRUE) { ClearPersonalReputation(oPlaye r, oClear); oClear = GetNextFactionMember(oMember, FALSE); } } */ void Raise(object oPlayer) { effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION); effect eBad = GetFirstEffect(oPlayer); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer); //Search for negative effects while(GetIsEffectValid(eBad)) { if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS || GetEffectType(eBad) == EFFECT_TYPE_DEAF || GetEffectType(eBad) == EFFECT_TYPE_PARALYZE || GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL) { //Remove effect if it is negative. RemoveEffect(oPlayer, eBad); } eBad = GetNextEffect(oPlayer); } //Fire cast spell at event for the specified target SignalEvent(oPlayer, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE)); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPlayer); } void main() { object oPlayer = GetLastPlayerDied(); // * increment global tracking number of times that I died SetLocalInt(oPlayer, "NW_L_PLAYER_DIED", GetLocalInt(oPlayer, "NW_L_PLAYER_DIED") + 1); // * BK: Automation Control. Autopcs ignore death if (GetLocalInt(oPlayer, "NW_L_AUTOMATION") == 10) { Raise(oPlayer); DelayCommand(1.0, ExecuteScript("crawl", OBJECT_SELF)); return; // Raise and return } // * Handle Spirit of the Wood Death string sArea = GetTag(GetArea(oPlayer)); /* if (sArea == "MAP_M2Q2F2" && GetDistanceBetweenLocations(Ge tLocation(GetObjectByTag(" ;M2Q2F2_M2Q2G")), GetLocation(oPlayer)) < 5.0 && GetLocalInt(GetModule()," NW_M2Q2E_WoodsFreed") == 0) { int bValid; Raise(oPlayer); string sDestTag = "WP_M2Q2GtoM2Q2F"; object oSpawnPoint = GetObjectByTag(sDestTag); AssignCommand(oPlayer,JumpToLo cation(GetLocation(oSpawnPoint ))); return; } */ // * in last level of the Sourcestone, move the player to the beginning of the area // * May 16 2002: or the main area of the Snowglobe (to prevent plot logic problems). // * May 21 2002: or Castle Never if (sArea == "M4Q1D2" || sArea == "M3Q3C" || sArea == "MAP_M1Q6A") { //Raise(oPlayer); //string sDestTag = "M4QD07_ENTER"; //object oSpawnPoint = GetObjectByTag(sDestTag); // AssignCommand(oPlayer, DelayCommand(1.0, JumpToLocation(GetLocation(oSp awnPoint)))); // * MAY 2002: Just popup the YOU ARE DEAD panel at this point DelayCommand(2.5, PopUpDeathGUIPanel(oPlayer,FALSE, TRUE, 66487)); return; } // * make friendly to Each of the 3 common factions AssignCommand(oPlayer, ClearAllActions()); // * Note: waiting for Sophia to make SetStandardFactionReptuation to clear all personal reputation if (GetStandardFactionReputation(STANDARD_FACTION_COMMONER, oPlayer) <= 10) { SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 80, oPlayer); } if (GetStandardFactionReputation(STANDARD_FACTION_MERCHANT, oPlayer) <= 10) { SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 80, oPlayer); } if (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPlayer) <= 10) { SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 80, oPlayer); } DelayCommand(2.5, PopUpGUIPanel(oPlayer,GUI_PANEL_PLAYER_DEATH)); object oPC1 = GetLastPlayerDied(); if (!GetIsPC(oPC1)) return; object oPC2 = GetLastAttacker(oPC1); if (!GetIsPC(oPC2)) return; string sAreaPC1 = GetTag(GetArea(oPC1)); if (sAreaPC1 == "ville") { object oTarget; oTarget = GetObjectByTag("Garde1a"); AssignCommand(oTarget, ActionMoveToObject(oPC2,TRUE)); AssignCommand(oTarget, SpeakString("")); object oWaypoint; location lTarget; oWaypoint = GetWaypointByTag("wp_prison4"); lTarget = GetLocation(oWaypoint); //only do the jump if the location is valid. //though not flawless, we just check if it is in a valid area. //the script will stop if the location isn't valid - meaning that //nothing put after the teleport will fire either. //the current location won't be stored, either if (GetAreaFromLocation(lTarget)==OBJECT_INVALID) return; DelayCommand(10.0, AssignCommand(oPC2, ClearAllActions())); DelayCommand(13.0, AssignCommand(oPC2, ActionJumpToLocation(lTarget))); effect eEffect; eEffect = EffectVisualEffect(VFX_IMP_UNSUMMON); DelayCommand(10.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC2)); object oCaster; oCaster = GetObjectByTag("Garde2a"); DelayCommand(10.0, AssignCommand(oCaster, ActionMoveToObject(oPC1, TRUE))); DelayCommand(12.0, AssignCommand(oCaster, SpeakString("Que Tyr m'aide pour ramener cette ame !"))); DelayCommand(13.0, AssignCommand(oCaster, ActionCastSpellAtObject(SPELL_RESURRECTION, oPC1, METAMAGIC_ANY, TRUE, 25, PROJECTILE_PATH_TYPE_DEFAULT, FALSE))); } } |
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