Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > probleme de détection d'un PC par un NPC.
probleme de détection d'un PC par un NPC.
Par Tribane le 19/7/2002 Ã 11:38:22 (#1827619)
1. de savoir si le NPC detecte la presence du PC
2.s'il est en train de faire éfraction d'appeler la garde
Mais il ne se passe rien le NPC n'adresse meme pas la parole au PC qd il le detecte!
J'ai beau lire et relire je ne vois pas d'erreurs.
void main()
{
object operso=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
if (GetObjectSeen(operso, OBJECT_SELF))
{
int nact=GetCurrentAction(operso);
if(nact==DOOR_ACTION_UNLOCK || nact==ACTION_PICKPOCKET || nact==DOOR_ACTION_BASH || nact==PLACEABLE_ACTION_BASH || nact==PLACEABLE_ACTION_UNLOCK)
{
SpeakString("Vous me cambriolez!Et sous mon nez en plus, vous avez un foutu culot! GARDES GAAAARDES!");
SetEncounterActive(TRUE,GetObjectByTag("enc_garde"));
ExecuteScript("nw_c2_default5",OBJECT_SELF);
}
else
BeginConversation(GetTag(OBJECT_SELF),operso);
}
else
{
if (GetTag(OBJECT_SELF)=="chambres_gar")
AssignCommand(OBJECT_SELF,ActionSit(GetNearestObjectByTag("Chair")));
ExecuteScript("nw_c2_default1", OBJECT_SELF);
}
}
Par contre il execute tres bien le debut et la fin du script l'erreur doit etre dans
if(nact==DOOR_ACTION_UNLOCK || nact==ACTION_PICKPOCKET || nact==DOOR_ACTION_BASH || nact==PLACEABLE_ACTION_BASH || nact==PLACEABLE_ACTION_UNLOCK)
mais non, c con mais je ne vois rien...
Voila, et merci pour votre potentiel aide!
Par Fredegar le 19/7/2002 Ã 12:48:05 (#1827987)
if ( (nact==DOOR_ACTION_UNLOCK) || (nact==ACTION_PICKPOCKET) ||
(nact==DOOR_ACTION_BASH) || (nact==PLACEABLE_ACTION_BASH) ||
(nact==PLACEABLE_ACTION_UNLOCK) )...
Par Gargantuel le 19/7/2002 Ã 13:46:31 (#1828319)
OnPerception ? OnHeartBeart ?
J'aurais tendance à le mettre dans OnPerception mais on a pas l'impression que le script a été écrit pour cela ...
Moi j'aurais mis un truc de ce style dans le OnPerception de ton NPC (mais j'ai pas testé) :
void main()
{
oObject = GetLastPerceived();
// le NPC as t il percu un joueur ? ET l'as t il vu ?
if (GetIsPC(oObject) && GetLastPerceptionSeen())
{
// Bon il a bien vu un joueur mais que fait le joueur ?
int iCurrentAction = GetCurrentAction(oObject);
if (iCurrentAction == ACTION_PICKPOCKET ||
iCurrentAction == ACTION_DOOR_ACTION_UNLOCK ||
iCurrentAction == DOOR_ACTION_BASH ||
iCurrentAction == PLACEABLE_ACTION_BASH ||
iCurrentAction == PLACEABLE_ACTION_UNLOCK)
{
// Mauvaise action
SpeakString("Vous me cambriolez!Et sous mon nez en plus, vous avez un foutu culot! GARDES GAAAARDES!");
SetEncounterActive(TRUE,GetObjectByTag("enc_garde"));
ExecuteScript("nw_c2_default5",OBJECT_SELF);
} else {
// Tout va bien, on lui cause
BeginConversation(GetTag(OBJECT_SELF),operso);
}
} else {
// Tout va bien on s'assoit
AssignCommand(OBJECT_SELF,ActionSit(GetNearestObjectByTag("Chair")));
ExecuteScript("nw_c2_default1", OBJECT_SELF);
}
}
Par contre j'ai un doute sur le fait que le GetCurrentAction puisse te renvoyer des DOOR_ACTION_* ou des PLACEABLE_ACTION_* ...
Par Tribane le 19/7/2002 Ã 14:28:05 (#1828561)
Bon, j'vais éssayer tt sa a l'instant meme tt de suite.Par contre l'ajout des parenthese n'a pas changé le probleme :(.
Edition: Arg sa ne marche pas non plus :(
La personne ne me voit pas elle reste assise, j'ai beau engager la conversation, elle retourne s'asseoire apres.
On perception est réactualisé tout les combiens? car s'il ne se déclenche que dés qu'il m'aperceoi puis se redéclenche la prochaine fois qu'il mréapercoit sa n'a pas bcp d'interet dans cette situation :o
Par Fed le 19/7/2002 Ã 15:19:15 (#1828851)
Donc ce n'est pas vraiment adpaté à ton problème.
Un solution qui me viens en tête serait de mettre le script prévenant les gardes sur les portes/coffre à crocheter.
Lorsque le PJ crochette la chose, le script vérifie que personne ne le vois. Si quelqu'un peut voir le PJ en train de crochetter, alors tu le fait appeller les gardes. L'evenement auquel relier le script serait onUnlock je pense, ou onDisturbed, ou même les deux.
Je te laisse cogiter la dessus :)
Bon courage pour la suite
Par Gargantuel le 19/7/2002 Ã 15:23:50 (#1828887)
1 - Remet ce script à la place (juste la facon de demarrer la conversation qui change) :
void main()
{
oObject = GetLastPerceived();
// le NPC as t il percu un joueur ? ET l'as t il vu ?
if (GetIsPC(oObject) && GetLastPerceptionSeen())
{
// Bon il a bien vu un joueur mais que fait le joueur ?
int iCurrentAction = GetCurrentAction(oObject);
if (iCurrentAction == ACTION_PICKPOCKET ||
iCurrentAction == ACTION_DOOR_ACTION_UNLOCK ||
iCurrentAction == DOOR_ACTION_BASH ||
iCurrentAction == PLACEABLE_ACTION_BASH ||
iCurrentAction == PLACEABLE_ACTION_UNLOCK)
{
// Mauvaise action
SpeakString("Vous me cambriolez!Et sous mon nez en plus, vous avez un foutu culot! GARDES GAAAARDES!");
SetEncounterActive(TRUE,GetObjectByTag("enc_garde"));
ExecuteScript("nw_c2_default5",OBJECT_SELF);
} else {
// Tout va bien, on lui cause
AssignCommand(OBJECT_SELF, ClearAllActions());
AssignCommand(OBJECT_SELF, ActionStartConversation(oObject));
}
} else {
// Tout va bien on s'assoit
AssignCommand(OBJECT_SELF,ActionSit(GetNearestObjectByTag("Chair")));
ExecuteScript("nw_c2_default1", OBJECT_SELF);
}
}
2 - Assures toi bien qu'il y a une conversation associée aux propriétés de ton NPC.
Par Tribane le 19/7/2002 Ã 15:29:21 (#1828928)
Par Gargantuel le 19/7/2002 Ã 15:49:22 (#1829063)
Par Tribane le 19/7/2002 Ã 20:17:19 (#1830625)
void main()
{
int ncount=0;
object ocreature;
while(ocreature!=OBJECT_INVALID)
{
ncount++;
ocreature=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC,OBJECT_SELF,ncount);
if (GetObjectSeen(OBJECT_SELF,ocreature))
{
AssignCommand(ocreature,ActionSpeakString("Vous me cambriolez!Et sous mon nez en plus, vous avez un foutu culot! GARDES GAAAARDES!"));
SetEncounterActive(TRUE,GetObjectByTag("enc_garde"));
ExecuteScript("nw_c2_default5",ocreature);
}
}
}
Par Rafa le 19/7/2002 Ã 20:35:32 (#1830696)
Par Kemay le 20/7/2002 Ã 1:28:45 (#1832135)
Le problème avec le onPerception, c'est qu'il réagit au moment où le PC rentre dans son champ de perception. C'est à dire que si au moment où le NPC voit le joueur, ce dernier est en train de faire une effraction, alors le NPC va appeler la garde. Mais si au moment où le NPC voit le joueur, le joueur ne fait rien d'interdit, le NPC ne réagira pas, même si par la suite le joueur commet des effractions.
En utilisant onHeartBeat tu pourrais dire au NPC de vérifier toutes les 6 secondes si le joueur ne fait rien d'illégal. Mais la méthode que je recommanderai serait de faire des scripts déclenchés au moment d'une effraction qui préviennent le NPC le plus proche qu'une action illégale a eu lieu. Lorsqu'un NPC est prévenu, il vérifie s'il voit effectivement le joueur et si c'est le cas il appelle la garde.
Par example, ouvrir ou détruire un contenaire :
1. Premier script
A placer dans onOpen et onDeath script event du contenaire qu'il est illégal d'ouvrir ou de deplacer//à inclure si vous utilisez la génération d'inventaire aléatoire de Bioware
#include "NW_O2_CONINCLUDE"
void main()
{
//Déterminer qui a ouvert l'objet
object oOpener = GetLastOpenedBy();
//Déterminer le témoin le plus proche de l'effraction
object oTemoin = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_NOT_PC);
//"Se souvenir" de qui a commis l'effraction
SetLocalObject(oTemoin,"Voleur",oOpener);
//Prévenir le témoin de l'effraction
//"Nom_Du_Script" doit être le nom sous lequel vous sauvegardez le second script
ExecuteScript("Nom_Du_Script",oTemoin);
//Generation aléatoire d'inventaire pour bas niveau de Bioware
if (GetLocalInt(OBJECT_SELF,"NW_DO_ONCE") != 0)
{
return;
}
GenerateLowTreasure(oOpener, OBJECT_SELF);
SetLocalInt(OBJECT_SELF,"NW_DO_ONCE",1);
ShoutDisturbed();
}
2. Second script
Script à inclure au module (ne nécessite pas d'être placé sur un event, il doit juste faire partie de la liste des scripts du modules)void main()
{
//Déterminer qui a commis l'effraction
object oPC=GetLocalObject(OBJECT_SELF,"Voleur");
//Si le vandale est un PC et si le témoin voit le PC
if ( GetIsPC(oPC) && GetObjectSeen(oPC) ) {
//le propriétaire ppelle la Garde
ActionSpeakString("Vous me cambriolez!Et sous mon nez en plus, vous avez un foutu culot! GARDES GAAAARDES!");
//La garde arrive... instantanément parce qu'ici on ne plaisante pas avec le vol
SetEncounterActive(TRUE,GetObjectByTag("enc_garde")); }
//si le témoin n'a pas vu le PC ou après avoir appelé la garde, il oublie qui est le vandale
DeleteLocalObject(OBJECT_SELF,"Voleur");
}
Note : Je n'ai pas testé l'apparition de la garde et me suis contenté de recopier la façon dont c'était fait dans les scripts précédents. Cela dit le reste est testé et fonctionne.
Note 2 : Après m'être pris le chou un bon moment pour comprendre pourquoi ca ne fonctionnait pas en essayant de placer les scripts sur l'event onUnLock, je suis tombé sur un poste du forum officiel qui expliquait qu'il y avait un bug et que les events OnLock et OnUnlock ne fonctionnent tout simplement pas. Pas d'estimation de date pour fixer ça de la part de Bioware.
JOL Archives 1.0.1
@ JOL / JeuxOnLine