Pistage

Répondre
Partager Rechercher
Bonsoir,

Etant donné que j'ai du mal avec les 2DA je voulais crées une nouvelle compétence "Pistage" comme sur nwn2, alors est ce possible par un "script" ou un "objet" de détecter les pjs qui se trouvent sur la mini map (faire en sorte que ce soit que les druide et rodeur)

merci bien
Je dirai que c'est possible, mais pas satisfaisant.
Si j'avais à faire ce système, j'utiliserais ça:

  • A l'entrée dans une zone (évènement OnEnter de la zone), je liste tous les PJs, je fais pour chacun un jet de dés: Perception (auditive et/ou détection) du Rôdeur/Druide entrant vs les compétences de dissimulation du PJ.
  • A partir de là:
    1. Le jet de sauvegarde réussit, on n'affiche rien
    2. Le jet de sauvegarde rate: on crée un Waypoint prévu pour afficher une note sur la mini-carte et on l'affiche (SetMapPinEnabled() ).
Je ne laisserais pas les boutons visibles en permanence, parce que les PJs peuvent bouger et ça induirait donc en erreur le traqueur.

On pourrait le faire par un objet à activer également. Seul l'évènement déclencheur changerait (OnActivateItem)


Problème 1: on ne peut pas accéder par script à la note qui apparaîtra sur le bouton de la mini-carte. On ne pourra pas, par exemple, mettre sur le bouton le nom du PJ positionné qui aura raté son jet de sauvegarde ni aucune autre indication non prévue en dur. Tous les boutons seront par conséquent identiques (sauf chaîne de caractère entrée manuellement différente -> plusieurs modèles différents). Ils seront de toute façon immobiles sauf si on veut plomber le serveur et solliciter un OHB de zone pour un rafraîchissement de position toutes les 6 secondes

Problème 2:
S'il y a plusieurs rôdeurs ( X ) entrant en même temps, on va créer plusieurs fois le jeu de Waypoints (X fois). Pas très pratique mais contournable avec une variable locale sur la zone.

Question: les pinoches affichées sont-elles visibles par tous ceux qui entrent une fois qu'elles ont été créées ou non ? à tester. Mais je suppose que oui.


Ce système n'est globalement pas très satisfaisant à mon avis et je n'en vois pas d'autre.
Citation :
Publié par Azmathiel
Je dirai que c'est possible, mais pas satisfaisant.
Si j'avais à faire ce système, j'utiliserais ça:

  • A l'entrée dans une zone (évènement OnEnter de la zone), je liste tous les PJs, je fais pour chacun un jet de dés: Perception (auditive et/ou détection) du Rôdeur/Druide entrant vs les compétences de dissimulation du PJ.
  • A partir de là:
    1. Le jet de sauvegarde réussit, on n'affiche rien
    2. Le jet de sauvegarde rate: on crée un Waypoint prévu pour afficher une note sur la mini-carte et on l'affiche (SetMapPinEnabled() ).
Je ne laisserais pas les boutons visibles en permanence, parce que les PJs peuvent bouger et ça induirait donc en erreur le traqueur.

On pourrait le faire par un objet à activer également. Seul l'évènement déclencheur changerait (OnActivateItem)


Problème 1: on ne peut pas accéder par script à la note qui apparaîtra sur le bouton de la mini-carte. On ne pourra pas, par exemple, mettre sur le bouton le nom du PJ positionné qui aura raté son jet de sauvegarde ni aucune autre indication non prévue en dur. Tous les boutons seront par conséquent identiques (sauf chaîne de caractère entrée manuellement différente -> plusieurs modèles différents). Ils seront de toute façon immobiles sauf si on veut plomber le serveur et solliciter un OHB de zone pour un rafraîchissement de position toutes les 6 secondes
Il me semble que tu es pas oblige de creer des wp pour afficher des punaises, tu as juste besoin des coordonees. Tu peux aussi afficher ce que tu veux dessus et tout cela par script uniquement.

Par contre oui effectivement pas d'autre solution de les mettres sur le OHB, ou un truc emulant cela, je le mettrais plutot sur le PJ moi perso.


Citation :
Publié par Azmathiel
Problème 2:
S'il y a plusieurs rôdeurs ( X ) entrant en même temps, on va créer plusieurs fois le jeu de Waypoints (X fois). Pas très pratique mais contournable avec une variable locale sur la zone.

Question: les pinoches affichées sont-elles visibles par tous ceux qui entrent une fois qu'elles ont été créées ou non ? à tester. Mais je suppose que oui.


Ce système n'est globalement pas très satisfaisant à mon avis et je n'en vois pas d'autre.
Les punaises sont liees de toutes façons a un PJ donc normalement pas de pb pour que seul le rodeur dans une zone puisse voir les punaises sur la carte.

Une punaise en fait c'est un ensemble de variable locale sur un PJ

On en avait un peu parler la et j'avais trouve ce post sur le sujet a l'epoque. En fait c con mais avec la console et en regardant les variables locales sur un PJ on aurait pu s'en rendre compte depuis plus longtemps.

A partir de cela j'avais fait un system de persistance des punaises pour notre serveur.
Mais bon c'est super loin tout cela et j'ai pas aurora sous la main.
Pas vraiment enfin je pense pas.

Deja si tu le mets sur un script lancer par un delayCommand, il s'execute quand il a le temps au final, donc si vraiment pas de ressource il attendra. Ensuite c'est pas forcement super long comme traitement, c scanne toutes les creatures d'une zone faire le jet de competence qui va bien pour chaque et positionner des variables locales. Faut voir...
Au pire il suffit de rallonger le temps entre chaque lancement etc...
Je reprends ce qui est dit dans le premier fil sur le sujet et qui provient du Lexicon:

Citation :
...
Not a bug, but it is too bad that there is no "oPC" parameter to only enable the map pin for a single player instead of all players in a multiplayer environment.
Si je comprends bien, ça signifie que les pinoches affichées sont visibles par tous les joueurs présents ou entrant dans la zone où elles sont. Donc, pas que pour les rôdeurs (pas de paramètre oPC dixit le quote).

Rajout: je n'avais pas pensé aux pinoches mises manuellement sur la carte par le joueur ! Je les avais complètement oubliées celles-là.
En effet, le second fil, sur le forum Bioware pourrait être source d'inspiration !
Je ne sais pas d'où ils ont tiré ces infos, mais si elles sont avérées (à tester, donc), ça peut effectivement être une façon de traiter la chose de façon élégante. [/rajout]

Le lag dû à un OHB est toujours à relativiser en fonction de ce que fait le module dans son ensemble et de la puissance de la machine supportant le serveur. C'est un calcul et/ou un choix à faire en connaissance de cause en ayant une vision d'ensemble des tâches traitées par le serveur pour un module. Seul le créateur pourra répondre à cette interrogation, et souvent à l'issue de tests de charge en temps réel.
La technique du DelayCommand() est viable, je l'utilise déjà pour un ensemble de scripts que mes PJs ont aux fesses en permanence (gestion des paramètres sommeil, faim et soif, mana des lanceurs de sorts).

Citation :
Publié par Garrath
Il me semble que tu es pas oblige de creer des wp pour afficher des punaises, tu as juste besoin des coordonees. Tu peux aussi afficher ce que tu veux dessus et tout cela par script uniquement.
Je ne savais pas. (mais je viens de lire le second fil)
Parce que d'après ce que j'ai vu, SetMapPinEnabled est la seule fonction traitant des pinoches et de la mini-carte et elle ne comporte guère de paramètres de modification. Si tu parles de ça, c'est que tu dois avoir essayé. Tu pourrais développer la technique ? je suis curieux et j'aime apprendre de nouveaux trucs
Sans compter que ça économiserait le temps machine utilisé pour la création de l'objet Waypoint.

Je copie ici la fonction dédiée recopiée du second fil:
Code PHP:

void AddMapPin(object oPCobject oAreastring sEntryfloat fXfloat fYfloat fZ 0.0) {
    
int nPinCount GetNumberOfMapPins(oPC);
    
int nPinNo nPinCount 1;
    if(!
GetIsObjectValid(oPC))
        return;
    
SetLocalString(oPC"NW_MAP_PIN_NTRY_" IntToString(nPinNo), sEntry);
    
SetLocalFloat(oPC"NW_MAP_PIN_XPOS_" IntToString(nPinNo), fX);
    
SetLocalFloat(oPC"NW_MAP_PIN_YPOS_" IntToString(nPinNo), fY);
    
SetLocalFloat(oPC"NW_MAP_PIN_ZPOS_" IntToString(nPinNo), fZ);
    
SetLocalObject(oPC"NW_MAP_PIN_AREA_" IntToString(nPinNo), oArea);
    
SetLocalInt(oPC"NW_TOTAL_MAP_PINS"nPinCount+1);

sEntry contiendrait la chaîne à afficher sur le bouton de la mini-carte: nom du PJ ou n'importe quoi d'autre.

Une façon d'éviter trop de temps de calcul est de créer les pinoches sur le OnEnter de la zone courante et d'effectuer uniquement des calculs de rafraichissement dans l'OHB/DelayCommand(). On économise le plus gros: la création du Waypoint.
Citation :
Publié par Azmathiel
Je ne savais pas. (mais je viens de lire le second fil)
Parce que d'après ce que j'ai vu, SetMapPinEnabled est la seule fonction traitant des pinoches et de la mini-carte et elle ne comporte guère de paramètres de modification. Si tu parles de ça, c'est que tu dois avoir essayé.
Oui j'ai essaye a l'epoque, j'ai fait un system pour gerer la persistance des punaises pour un joueur, car je trouvais cela chiant de perdre ses punaises a chaque fois.
Et cela marche tres bien (dsl je suis pas chez moi donc je peux pas le fournir mais si j'y pense je regarderai si j'arrive a mettre la main dessus ce WE)

Alors c bien loin tout cela, mais bon la technique est tres simple c'est juste des variables locales au PJ. Et avant meme de dev si tu veux verifier tu crees une punaise pour ton pj, et apres en mode console tu regardes les variables locales du PJ et tu vas les voir apparaitre. A l'epoque du coup j'avais essaye de voir s'il y avait d'autre bonne surprise de ce type dans les variables locales au PJ mais j'ai rien trouve d'autre ;-)

Citation :
Publié par Azmathiel
Tu pourrais développer la technique ? je suis curieux et j'aime apprendre de nouveaux trucs
Sans compter que ça économiserait le temps machine utilisé pour la création de l'objet Waypoint.
Ben en gros ca te cree une liste de variable locale suffixée par leur indice.
il faut recuperer le nombre de punaise perso du PJ par GetLocalInt(oPC, "NW_TOTAL_MAP_PINS"); ensuite tu crees les differentes variables locales avec le bon suffixe, et ensuite tu incrementes ta variable qui defini le nombre de donnees que tu as.
Alors je sais plus si tu peux gerer a partir de 0 ou de 1 comme suffixe.
Tu peux tres bien avoir des trous dans ta liste (perso sur mon system de persistance je nettoyais les trous dans la liste).

C'est super simple.

Et tu n'as pas besoin de WP...
Citation :
Publié par Kragg le Severe
*s'instrui* Certes , a quoi servent les pinochent ?
C'est les petits losanges de couleur que tu peux placer sur les minimaps...

Citation :
Publié par Kragg le Severe
Pour le lagg je pense que ca devrait aller avec un athlon XP 4200 dual core 2 avec 2.5 ddr..
oui effectivement...

Citation :
Publié par Kragg le Severe
Et sinon pour le script sa se passe comment ?
Relativement simplement

A chaque entree ou sortie d'une zone il faut que tu reinitialises les punaises visibles par le joueur. La difficulte c'est de reinitialises les punaises qui correspondent au depistages et pas celles que le joueur se serait cree.
Donc garder qqpart la liste des punaises crees pour le system de pistage.
Le mieux a mon avis c'est de reinitialises a chaque fois et de positionner les punaises normal au debut de la liste mais bon... (c'est peut etre la partie la plus compliquee)

Apres tous les temps de seconde tu lances un script (ohb ou delaycommand perso je prefere le delaycommand)
1 - suppression de toutes les punaises du system
2 - le script boucle sur les creatures que tu veux scanner :
est ce que tu veux scanner les PJ par exemple?
est ce que tu veux scanner que les creatures hostiles?

ensuite a l'interieure de la boucle, tu fais ton jet de competence pour la creature, si test est bon, tu recuperes la position de la creature et grace a cela tu crees la punaises sur la minimap

FIN. (si delaycommand pas oublier le rappel du script sur le PJ)

Alors a savoir que tu peux pas gerer de couleur de punaise (ou sinon peut etre en modifiant la couleur dans la chaine de caractere mais j'ai jamais essaye...) ce qui est un petit peu dommage ;-)

Ca c'est du cote script... apres faut gerer la competence donc faut modifier les 2da qui vont bien, tlk etc... mais bon dans mes souvenirs c pas forcement si dure que cela.

Voilà en gros l'algo du script...
Maintenant c'est pas super complique a faire, mais il manque 2 3 infos sur ce que tu veux faire reellement pour te fournir le script complet (genre creature a scanner...).
Citation :
A l'epoque du coup j'avais essaye de voir s'il y avait d'autre bonne surprise de ce type dans les variables locales au PJ mais j'ai rien trouve d'autre ;-)
Si si y'a aussi les entrées de journal !

C'est des variables du genre NW_JOURNAL_ENTRY<tag>.
Citation :
est ce que tu veux scanner les PJ par exemple?
est ce que tu veux scanner que les creatures hostiles?
Les deux c'est possible ? si non , que les pjs
par contre si c'est possible mettre des punaises de couleurs
Rouge pour les monstres et bleu pour les pjs

Par contre en ce qui concerne de scanner les monstres c'est obligé de fournir le monstres ? , parce que j'en ai pas mal qui sont différent selon les zones..

Merci
Citation :
Publié par Azmathiel
Je copie ici la fonction dédiée recopiée du second fil: ...
Dommage qu'il n'y ai pas les commandes GetLocalVector et SetLocalVector, ça aurait simplifié le script des pinoches.

EDIT : Par contre il serai facile de créer ces fonctions. Pourquoi n'y ai-pas pensé plus tôt ?
La fonction recopiée au dessus n'a pas trop de sens sans cet include à appeler au début du script gérant ce système:

Code PHP:

//return the total number of map pins this PC has placed
int     GetNumberOfMapPins(object oPC);
//get the area object of a specific map pin
object  GetAreaOfMapPin(object oPCint nPinNo);
//delete a specific map pin
void    DeleteMapPin(object oPCint nPinNo);
int GetNumberOfMapPins(object oPC)
{
    return 
GetLocalInt(oPC"NW_TOTAL_MAP_PINS");
}
object  GetAreaOfMapPin(object oPCint nPinNo)
{
    return 
GetLocalObject(oPC"NW_MAP_PIN_AREA_"+IntToString(nPinNo));
}
void DeleteMapPin(object oPCint nPinNo)
{
    if(
nPinNo 1)
        return;
    if(!
GetIsObjectValid(oPC))
        return;
    
int nPinCount GetNumberOfMapPins(oPC);
    if(
nPinCount 1)
        return;
    if(
nPinCount nPinNo)
        return;
    
DeleteLocalString(oPC"NW_MAP_PIN_NTRY_"+IntToString(nPinNo));
    
DeleteLocalFloatoPC"NW_MAP_PIN_XPOS_"+IntToString(nPinNo));
    
DeleteLocalFloatoPC"NW_MAP_PIN_YPOS_"+IntToString(nPinNo));
    
DeleteLocalObject(oPC"NW_MAP_PIN_AREA_"+IntToString(nPinNo));
    
int i nPinNo+1;
    for (
i=nPinNo+1;i<nPinCount;i++)
    {
        
SetLocalString(oPC"NW_MAP_PIN_NTRY_"+IntToString(i), GetLocalString(oPC"NW_MAP_PIN_NTRY_"+IntToString(i+1)));
        
SetLocalFloatoPC"NW_MAP_PIN_XPOS_"+IntToString(i), GetLocalFloat (oPC"NW_MAP_PIN_XPOS_"+IntToString(i+1)));
        
SetLocalFloatoPC"NW_MAP_PIN_YPOS_"+IntToString(i), GetLocalFloat (oPC"NW_MAP_PIN_YPOS_"+IntToString(i+1)));
        
SetLocalObject(oPC"NW_MAP_PIN_AREA_"+IntToString(i), GetLocalObject(oPC"NW_MAP_PIN_AREA_"+IntToString(i+1)));
    }
    
DeleteLocalString(oPC"NW_MAP_PIN_NTRY_"+IntToString(nPinCount));
    
DeleteLocalFloatoPC"NW_MAP_PIN_XPOS_"+IntToString(nPinCount));
    
DeleteLocalFloatoPC"NW_MAP_PIN_YPOS_"+IntToString(nPinCount));
    
DeleteLocalObject(oPC"NW_MAP_PIN_AREA_"+IntToString(nPinCount));
    
SetLocalInt(oPC"NW_TOTAL_MAP_PINS"nPinCount-1);
}
void AddMapPin(object oPCobject oAreastring sEntryfloat fXfloat fY) {
    
int nPinCount GetNumberOfMapPins(oPC);
    
int nPinNo nPinCount 1;
    if(!
GetIsObjectValid(oPC))
        return;
    
SetLocalString(oPC"NW_MAP_PIN_NTRY_" IntToString(nPinNo), sEntry);
    
SetLocalFloat(oPC"NW_MAP_PIN_XPOS_" IntToString(nPinNo), fX);
    
SetLocalFloat(oPC"NW_MAP_PIN_YPOS_" IntToString(nPinNo), fY);
    
SetLocalObject(oPC"NW_MAP_PIN_AREA_" IntToString(nPinNo), oArea);
    
SetLocalInt(oPC"NW_TOTAL_MAP_PINS"nPinCount+1);

(recopié également du fil sus-cité)
Apres verif et test, il y a une impossibilite...

Les punaises mises par variables locales et script ne sont pas raffraichissable. Elle ne sont visibles dans une area que si elles sont crees avant d'aller dans l'area...
Merci d'avoir testé.
Comme ça, au moins, le problème de surcharge CPU est résolu

Néanmoins, je me demande un truc... Pour que ce soit efficace, il faudrait donc utiliser l'évènement OnExit d'une zone pour pré-calculer les positions des pinoches sur la mini-carte de la zone où va entrer le PJ, c'est ça ?
Comment connaître la destination ?

(Edit ânerie supprimée)

Rajout:
Pour la sauvegarde de la zone, j'émets une réserve... Les SetLocalObject(), je n'aime pas trop. Les résultats sont aléatoires. Je préfère la sauvegarde d'un string correspondant au tag de la zone, par exemple (à condition qu'il soit unique) ou mieux encore, le resref.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés