JeuxOnLineForumsPlusConnectés : 618 (sites) | 1157 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Un garde qui detecte les pickpocket (PJ/PNJ) RSS
   
Répondre
Partager Outils Rechercher
Avatar de Iridian
Iridian
Roi
 
Avatar de Iridian
 

Un garde qui detecte les pickpocket (PJ/PNJ)

Voici le premier jet d'un script permettant a un garde de détecter les pickpocket.
Pour l'exemple, il s'agit d'un chien de garde.

Le script fonctionne très bien mais j'aimerai avoir vos avis pour quelques points (voir les commentaires)

Code PHP:
void main()
{
    
object oItem GetModuleItemAcquired();

    
float fDistanceMax 10.0//distance maximale de perception d'un vol
    
if (GetStolenFlag(oItem))
    {
        
object oVoleur GetItemPossessor(oItem);
        
object oGarde GetNearestObjectByTag("chiendegarde",oVoleur);
        if (
GetIsObjectValid(oGarde))
        {
            
float fDistance GetDistanceBetween(oGarde,oVoleur);
            
AssignCommand(oGarde,SpeakString("distance ="+FloatToString(fDistance),TALKVOLUME_TALK));
            if ((
fDistance<fDistanceMax) && (fDistance>0.0))
            {
                
//il y a un garde a distance de perception, voyons s'il a remarque quelque chose
                //je ne sais pas si search est le meilleur choix pour le garde, mais c'est tous ce que j'ai trouve d'interressant
                
if(GetSkillRank(SKILL_SEARCH,oGarde)+d20()>GetSkillRank(SKILL_PICK_POCKET,oVoleur)+d20())
                {
                    
//le garde a repere le vol
                    
if (GetIsPC(oVoleur)){SendMessageToPC(oVoleur,"Le garde vous a vu voller");}
                    
SetIsTemporaryEnemy(oVoleur,oGarde);
                    
AssignCommand(oGarde,ActionAttack(oVoleur));
                }
            }
        }

        
//Ici un CopyObject serai mieu, si il ne conserve pas le flag "stolen"
        //Dans le doute je garde le CreateItemOnObject
        
CreateItemOnObject(GetTag(oItem),GetItemPossessor(oItem));
        
DestroyObject(oItem);
    }

Donc les points qui m'intéressent :
CopyObject ou CreateItemOnObject ? (pour retirer le Flag "Stolen")
Y a t-il plus logique que la compétence shearch pour détecter un vol ?
Existe il une fonction permettant d'opposer 2 caracts (ca m'étonnerai car j'ai bien cherché, mais j'ai pu passer a coté) ?
Autre chose ?

Merci d'avance
Lien direct vers le message - Vieux
Avatar de Ange Musicien
JOL Ange Musicien
Alpha & Oméga
 
Avatar de Ange Musicien
 
Bien si tu veux opposer dextérité à sagesse, c'est facile, mais c'est pas une fonction, tu peux créer un script qui fait ça, qui se déclenche quand tu fais ExecuteScript.
Si tu veux opposer dextérité à Détection (plus logique que fouille), c'est plus compliqué, tu devras choisir les rapports qui l'emportent, etc.
Si tu veux opposer deux capacités, c'est facile, je me demande même si il y a pas une fonction, mais j'en sais rien parce que je ne l'utilise jamais

Je ne comprends pas la question pour le FlagStolen, sorry

Vlà. C'est pas génial mais c'est tout ce que j'ai.
Lien direct vers le message - Vieux
Avatar de Iridian
Iridian
Roi
 
Avatar de Iridian
 
J'aurai voulu opposer détection et pick-pocket, mais je n'ai pas trouvé détection .... (sans doute une grosse lacune en anglais)

Pour le FlagStolen, en c'est simple, prenons un exemple :

PJVoleur est un voleur, PNJGarde est un garde, PJAmi est un ami du voleur, PJPassant est un autre PJ.

PJVoleur vole un anneau a PJPassant :
L'anneau est marqué comme volé, et donc si PNJGarde est dans le coin et réussi son jet de dès, il s'attaquera a PJVoleur.

Imaginons que PNJGarde soit loin au moment du vol.

Quelques jours plus tard, PJVoleur rencontre PJAmi et lui donne l'anneau :
L'evenement "onAcquireItem" se déclenche, et manque de bol PNJGarde est dans le coin. Si celui ci réussi son jet de dès, il détecte le vol (ba oui l'objet est toujours flaggé comme volé !) et s'attaque a PJAmi.

Donc il me faut me débarrasser du flag "Stolen".
Helas, s'il existe une fonction GetStolenFlag(), il n'y a pas de SetStolenFlag() !

La question est donc :
-qui a t-il de mieux pour enlever ce flag, un CopyObject ou un CreateItemOnObject ?
Lien direct vers le message - Vieux
Avatar de Jaha Effect
Jaha Effect
Alpha & Oméga
 
Avatar de Jaha Effect
 
Le flag stolen risque de poser des problèmes pour ceux qui utilisent l'ATS de Mojo car pour éviter les ventes aux marchands, les objets sont noté comme volé.
Le pauvre artisant risque de ce voir traiter de voleur (même si c'est pas toujours faux) et poursuivi par un garde .
Je sais pas si la constante INVENTORY_DISTURB_TYPE_STOLEN peut être utile dans ton cas?

Jaha Effect
Lien direct vers le message - Vieux
Avatar de Iridian
Iridian
Roi
 
Avatar de Iridian
 
Citation:
Provient du message de Jaha Effect
Le flag stolen risque de poser des problèmes pour ceux qui utilisent l'ATS de Mojo car pour éviter les ventes aux marchands, les objets sont noté comme volé.
Le pauvre artisant risque de ce voir traiter de voleur (même si c'est pas toujours faux) et poursuivi par un garde .
Je sais pas si la constante INVENTORY_DISTURB_TYPE_STOLEN peut être utile dans ton cas?

Jaha Effect
Je ne pense pas, elle serait utile si je pouvais accéder au script InventoryDisturb des joueurs, mais las, ce n'est pas le cas.

Sinon je n'avais pas pensé à l'ATS, mais si je ne me trompe les objets sont crée directement dans l'inventaire. Donc le gain d'un objet ne déclenche par le 'onUnaquireItem'. Je vais donc voir s'il est possible de déclencher le script sur cet évènement plutôt que sur le 'onAcquireItem'.
Lien direct vers le message - Vieux
Avatar de Ange Musicien
JOL Ange Musicien
Alpha & Oméga
 
Avatar de Ange Musicien
 
Tu récupères sur une int... C'est tout ! Maintenant si l'objet est volé au voleur ça ne sert à rien, car le garde ne dira rien... Or tu veux que l'objet puisse être volé à un voleur, n'est-ce pas ?

Solution 2:
Détection si oItem est volé, pas si il est donné, c'est à dire si LastAction(oAcquirer==Steal) (si ça existe pas, dis moi le). Je vais faire des recherches....
Lien direct vers le message - Vieux
Avatar de Iridian
Iridian
Roi
 
Avatar de Iridian
 
Citation:
Provient du message de Ange Musicien
Tu récupères sur une int... C'est tout ! Maintenant si l'objet est volé au voleur ça ne sert à rien, car le garde ne dira rien... Or tu veux que l'objet puisse être volé à un voleur, n'est-ce pas ?

Solution 2:
Détection si oItem est volé, pas si il est donné, c'est à dire si LastAction(oAcquirer==Steal) (si ça existe pas, dis moi le). Je vais faire des recherches....
Ce type de truc existe, c'est même par la que j'avais commencé. Helas, malgré tous mes efforts, la dernière action renvoyé était toujours invalide ...

Sinon je ne comprend pas trop ton premier paragraphe ...
Si l'objet est volé au voleur, son flag "stolen" repasse a "vrai" et le garde se jette sur le voleur du voleur, pas de problèmes. (enfin en théorie, je n'ai pas testé ca, mais je ne vois pas pourquoi le moteur ne ferai pas son travail, car on est d'accord, c'est le moteur de jeu qui fixe le flag "stolen" a vrai)
Lien direct vers le message - Vieux
Avatar de Ange Musicien
JOL Ange Musicien
Alpha & Oméga
 
Avatar de Ange Musicien
 
Voleur1 vole à passant variable est à 0
variable passe à 1
Voleur2 vole à voleur1 variable est à 1... pas bien...

Donc il faut que la variable passe automatiquement à 0 en cas de vol uniquement. Dans ce cas seulement le garde s'en aperçoit, si int = 0 et si la dernière action est un vol...
Lien direct vers le message - Vieux
Avatar de Iridian
Iridian
Roi
 
Avatar de Iridian
 
Citation:
Provient du message de Ange Musicien
Voleur1 vole à passant variable est à 0
variable passe à 1
Voleur2 vole à voleur1 variable est à 1... pas bien...

Donc il faut que la variable passe automatiquement à 0 en cas de vol uniquement. Dans ce cas seulement le garde s'en aperçoit, si int = 0 et si la dernière action est un vol...
Tout a fait, sauf que je n'arrive pas a exploiter la fonction qui renvoie la dernière action.
C'est pour ca que je recrée l'objet, ca remet le flag à 0
Lien direct vers le message - Vieux
Avatar de Ange Musicien
JOL Ange Musicien
Alpha & Oméga
 
Avatar de Ange Musicien
 
Bon et ben à la place de create objet tu met int - 1... Comprends pas... Il faut bien qu'il fasse la différence entre volé et acquéri... Si tu remplace FlagStolen par Create ou Copy, il ne le saura pas ...
Lien direct vers le message - Vieux
Avatar de Iridian
Iridian
Roi
 
Avatar de Iridian
 
Ce n'est pas que je sois particulièrement butté (quoique) mais je ne peu pas utiliser un entier pour ca, car je ne sais pas détecter le vol. Je suis donc obligé d'utiliser la fonction GetFlagStolen() (ou un truc comme ca).

Quand je fait "int aTest=GetCurrentAction(oTest);" aTest n'est jamais égal à ACTION_PICKPOCKET mais a toujours la meme valeur (32xxx, je suppose la valeur "action incorrecte").

(désolé, j'ai un peu du mal a exposer le problème de façon claire et complète)
Lien direct vers le message - Vieux
Avatar de Ange Musicien
JOL Ange Musicien
Alpha & Oméga
 
Avatar de Ange Musicien
 
J'ai trouvé. je te fais le script pour après demain
Lien direct vers le message - Vieux
Avatar de Ange Musicien
JOL Ange Musicien
Alpha & Oméga
 
Avatar de Ange Musicien
 
Y a plein de fautes dans ton script !!! C'est normal que tu n'y arrives pas !!! Je t'en files un neuf et revisité dans une demi-heure à une heure, le temps de tester et tout et tout
Lien direct vers le message - Vieux
Avatar de Ange Musicien
JOL Ange Musicien
Alpha & Oméga
 
Avatar de Ange Musicien
 
Désolé je suis long mais il me donne des maux de tête effroyable .
Lien direct vers le message - Vieux
Avatar de Ange Musicien
JOL Ange Musicien
Alpha & Oméga
 
Avatar de Ange Musicien
 
Ca y est ! Je fais les tests et si ça ne marche pas, j'éditerais. Tu as fait trois grosses erreurs :
- Surtout ne pas rendre d'objet au PC, il le trouvera sur la carcasse du Voleur, en mode dé-volé. Sinon il l'a en double ...
- Créer un objet nécessite un BluePrint, et pas un Tag. Donc utilise GetResRef(oItem) si tu veux créer.
- GetStolenFlag est une variable, il me semble alors qu'il aurait fallu mettre : if(GetStolenFlag(oItem) == TRUE).

Mon script est très différent du tien...
Code PHP:
////////////////////////////////////////////////////
// "Un garde qui detecte le vol" By Ange Musicien //
////////////////////////////////////////////////////

void main()
{
object oSelf OBJECT_SELF;
while(
GetIsObjectValid(oSelf))
//Demande le reperage si le garde est valide
//Créé un mode "repérage" actif en permanence
 
{
 
location lSelf GetLocation(oSelf);
 
object oVoleur GetFirstObjectInShape(SHAPE_SPHERE,10.0,lSelf,FALSE,OBJECT_TYPE_CREATURE);
 while(
GetIsObjectValid(oVoleur))
  {
  
int nAction GetCurrentAction(oVoleur);
  if(
nAction == ACTION_PICKPOCKET)
  
// Uniquement si l'action courrante est le vol
   
{
   
int nDetection GetSkillRank(SKILL_SPOT,oSelf);
   
int nVol GetSkillRank(SKILL_PICK_POCKET,oVoleur);
   if(
nVol+d20(1)<nDetection+d20(1))
   
// Uniquement si le voleur est vu.
    
{
    
ActionSpeakString("Au voleur !!!");
    
SetIsTemporaryEnemy(oVoleur,oSelf,FALSE);
    
ActionAttack(oVoleur,FALSE);
    
//Attaque le voleur
    
int nTestmort GetIsDead(oVoleur);
    
// Verifie que le voleur est mort
    
while(nTestmort==TRUE)
     {
     
object oVole GetFirstItemInInventory(oVoleur);
     
int nTestvole GetStolenFlag(oVole);
     
//Recherche les objets voles
     
if(nTestvole == TRUE)
      {
      
string sResRef GetResRef(oVole);
      
DestroyObject(oVole,0.0);
      
CreateItemOnObject(sResRef,oVoleur,1);
      
// Les remplaces pour qu'il ne soient pas affiches
      // comme voles.
      
}
     }
    }
   }
  }
 }

Hop là, je vais voir si ça marche...

EDIT // J'inclue une phrase de type : "Voleur !!!"
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Un garde qui detecte les pickpocket (PJ/PNJ)
   

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +1. Il est actuellement 13h52.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite