La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/11/2024 20:19:55


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Blackblood
Chevalier
Inscrit le: 20 Juil 2004
Messages: 80
Localisation: France
Répondre en citant
Posté le : 14/09/2004 09:25:15 Sujet du message : Un garde qui défend ses habitants

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 Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Joubinator
Ecuyer
Inscrit le: 07 Jan 2003
Messages: 42
Localisation: Yvelines
Répondre en citant
Posté le : 14/09/2004 10:27:40 Sujet du message :

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 Very Happy

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
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Normalement des que tes gardes entendront, veront le pj attaquant ils devraient l'attaquer

Cela pourrait être pas mal non? Very Happy
_________________
M'enfous si les pjs tuent mes monstres,.... j'en ai plein (paroles d'un DM d'expérience Wink )
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Blackblood
Chevalier
Inscrit le: 20 Juil 2004
Messages: 80
Localisation: France
Répondre en citant
Posté le : 14/09/2004 13:19:52 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Joubinator
Ecuyer
Inscrit le: 07 Jan 2003
Messages: 42
Localisation: Yvelines
Répondre en citant
Posté le : 14/09/2004 14:53:54 Sujet du message :

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. Very Happy

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 !*/

Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.

_________________
M'enfous si les pjs tuent mes monstres,.... j'en ai plein (paroles d'un DM d'expérience Wink )
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Joubinator
Ecuyer
Inscrit le: 07 Jan 2003
Messages: 42
Localisation: Yvelines
Répondre en citant
Posté le : 14/09/2004 14:56:08 Sujet du message :

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. Very Happy
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();
  }

}
}

Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.

_________________
M'enfous si les pjs tuent mes monstres,.... j'en ai plein (paroles d'un DM d'expérience Wink )
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Blackblood
Chevalier
Inscrit le: 20 Juil 2004
Messages: 80
Localisation: France
Répondre en citant
Posté le : 15/09/2004 07:13:18 Sujet du message :

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. Razz
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Joubinator
Ecuyer
Inscrit le: 07 Jan 2003
Messages: 42
Localisation: Yvelines
Répondre en citant
Posté le : 15/09/2004 08:41:03 Sujet du message :

Attention le script est à placer dans le ONHEARTBEAT de ta Zone Laughing
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 Wink )
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Blackblood
Chevalier
Inscrit le: 20 Juil 2004
Messages: 80
Localisation: France
Répondre en citant
Posté le : 15/09/2004 12:05:47 Sujet du message :

arf, j'avais oublié, désolé, je te tiens au courant.

merci encore
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Blackblood
Chevalier
Inscrit le: 20 Juil 2004
Messages: 80
Localisation: France
Répondre en citant
Posté le : 16/09/2004 07:22:50 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Blackblood
Chevalier
Inscrit le: 20 Juil 2004
Messages: 80
Localisation: France
Répondre en citant
Posté le : 17/09/2004 07:37:38 Sujet du message :

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 Laughing

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));

}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
kiky.le.magnifique
Homme très gay
Inscrit le: 19 Sep 2003
Messages: 907
Localisation: Camping de la nation martienne...
Répondre en citant
Posté le : 17/09/2004 07:42:00 Sujet du message :

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)
Surprised
_________________
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 Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Blackblood
Chevalier
Inscrit le: 20 Juil 2004
Messages: 80
Localisation: France
Répondre en citant
Posté le : 17/09/2004 09:44:28 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Blackblood
Chevalier
Inscrit le: 20 Juil 2004
Messages: 80
Localisation: France
Répondre en citant
Posté le : 21/09/2004 08:17:25 Sujet du message :

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 /////


//:Confused///////////////////////// /////////////////////

//:: Death Script

//:: NW_O0_DEATH.NSS

//:: Copyright (c) 2001 Bioware Corp.

//:Confused///////////////////////// ////////////////////

/*

    This script handles the default behavior

    that occurs when a player dies.



    BK: October 8 2002: Overriden for Expansion

*/


//:Confused///////////////////////// ////////////////////

//:: Created By: Brent Knowles

//:: Created On: November 6, 2001

//:Confused///////////////////////// ////////////////////

/*

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)));

}

}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Montrer les messages depuis :
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


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 89.373ms