Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

probleme de détection d'un PC par un NPC.

Par Tribane le 19/7/2002 à 11:38:22 (#1827619)

Ce code doit avoir pour but
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)

En effet, il y a des histoires de priorités quand on fait une condition de ce genre. Ainsi, je te conseillerais de mettre chacune de tes conditions nact==xxxx entre parenthèses. Je ne suis pas du tout sûr du résultat mais tu ne perds rien à essayer. Ca donnerait pour ton test quelque chose comme ça :

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)

Tu l'as mis où ce script ?
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)

Non, je ne l'ai pas mis ON PERCEPTION, mais c vrai que c...Plus adapté a la situation:chut:.
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)

L'évenement onPerception n'est declenché que quand la perception de l'objet change. En plus clair, dès que l'objet entends/vois quelquechose de nouveau, ou dès que l'objet n'entends plus/ne vois plus quelquechose, le script est declenché (cf cours de script pour les quiches, leçon 4).
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)

Ca pourrait venir de la maniere dont la conversation a été configuré. Donc :
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)

nop je ne crois pas que ce soit la source du probleme, car meme apres avoir fait une mauvaise action il ne ce pas rien, mais bon, je vais tt de meme éssayer.

Par Gargantuel le 19/7/2002 à 15:49:22 (#1829063)

Comme le disait Fed, ce n'est peut etre pas la bonne solution pour detecter les mauvaises actions de tes joueurs. Par contre c'est la solution à utiliser pour que ton NPC engage la conversation avec ton joueur lorsqu'il le rencontre, ce qui devrait au moins se passer dans le cas présent.

Par Tribane le 19/7/2002 à 20:17:19 (#1830625)

J'ai éssayé de mettre ce script directement dans les scripts du coffre....et evidement sa ne marche pas...ce pb commence a serhieusement me prendre le chou...

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)

[Edit]-quand on raconte n'importe quoi mieux vaut se taire :chut: -

Par Kemay le 20/7/2002 à 1:28:45 (#1832135)

En fait tu ne peux pas faire ce que tu veux en un seul script à moins d'utiliser l'event onHeartBeat du NPC ce qui est fortement déconseillé pour éviter des problèmes de performance du module.

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