La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 09/05/2025 10:27:32


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Semcatala
Grand Sage du Conseil
Inscrit le: 20 Jan 2004
Messages: 951
Répondre en citant
Posté le : 19/01/2006 23:18:04 Sujet du message : Economie de ressources ordi sur les OHB !

**** Attention ****
Ce systéme est inutile pour les trés courts scripts de ohb
**** Attention ****

Les ohb sont gourmands en ressources car ils fonctionnent que l'on soit ou pas dans une zone , je vous file un moyen simple de pouvoir tout simplement cour-circuiter automatiquement les scripts lancés par les ohb dans les zones ou il n'y a personne , pour économiser les ressources ordi , on n'en a jamais trop. Embarassed

C'est particuliérement interessant lorsque l'on souhaite utiliser des scripts de ohb qui pourraient faire lagger , car ça permet de multiplier les OHB de taille moyenne a grande sur un mod sans qu'ils ne soient tous en même temps en train de pomper les ressources , seuls seront activés ceux sur une zone ou se trouve au moins un joueur.

Le principe consiste a placer une variable sur la zone , a TRUE il y a au moins un joueur , a FALSE , il n'y a plus personne.

Dés le début du script de ohb , on verifie cette variable , si elle est a TRUE , le script se déroule normalement , si elle est a FALSE , on cour-circuite le script , et il ne consomme donc quasi rien comme ressources.

3 scripts a utiliser , 2 a placer dans le "onenter" et le "onexit" de la zone ou ce systéme sera utilisé ( ou LES zoneS ) , et le dernier script a placer en tête du script de OHB de l'objet ou du pnj qui aura un OHB.

le "ONENTER"
NWScript :

void main()
{
object oPC = GetEnteringObject();

////////////////////////////// ////////////////////////////// //////
////            Script d'economies de ressources
////////////////////////////// ////////////////////////////// //////
object zone = GetArea(oPC);
string nom_zone_actuelle = GetName(OBJECT_SELF);
string tag_zone_actuelle = GetTag(zone);
SendMessageToPC(oPC,"Bienvenue dans la zone : "+nom_zone_actuelle+ " ! Vous allez morfler !");
SetLocalString(oPC,"tag_zone_actuelle",tag_zone_actuelle);
SetLocalString(oPC,"nom_zone_actuelle",nom_zone_actuelle);
SetLocalInt(zone,"variable_zone_presence_pc",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.



le "ONEXIT"
NWScript :

void main()
{
object oPC = GetExitingObject();

////////////////////////////// ////////////////////////////// //////
////            Script d'economies de ressources
////////////////////////////// ////////////////////////////// //////
string nom_zone_actuelle = GetLocalString(oPC,"nom_zone_actuelle");
string tag_zone_actuelle = GetLocalString(oPC,"tag_zone_actuelle");
object zone = GetObjectByTag(tag_zone_actuelle);
SendMessageToPC(oPC,"Barre toi de la zone : "+nom_zone_actuelle+ " ! Faiblard !");

object objet_zone = GetFirstObjectInArea(zone);
    while(GetIsObjectValid(objet_zone))
    {
        if(GetIsPC(objet_zone))
        return;

    objet_zone = GetNextObjectInArea(zone);
    }
SetLocalInt(zone,"variable_zone_presence_pc",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.


et le script de OHB :

NWScript :

void main()
{
object oPC = GetFirstPC();

object zone = GetArea(OBJECT_SELF);
int variable = GetLocalInt(zone,"variable_zone_presence_pc");

if ( variable == FALSE )
{
return;
}


////////////////////////////// ////////////////////////////// ///////
///////////  Votre Script perso de ohb se met ci dessous
////////////////////////////// ////////////////////////////// ///////


    while ( GetIsObjectValid(oPC) )
    {
    SendMessageToPC(oPC,"Au moins un joueur est present dans la zone ou se trouve le OHB sur l'objet , le OHB est donc actif ! ");
    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.

_________________
" La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG
" La véritable école du Commandement est la culture générale. " CdG
" Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F
" La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG
" La fin de l'espoir est le commencement de la mort. " CdG
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 19/01/2006 23:55:42 Sujet du message :

Un autre truc pour alleger un ohb, c'est de mettre un compteur dedans, pour que le script ne s'execute pas en entier toutes les 6 secondes si ça n'est pas nécessaire.
en gros :
NWScript :

void main()
{
int nCounter = GetLocalInt(GetModule(),"OHBCOUNT");
if (nCounter == 1)
{
//bout de script A
}
else if (nCounter == 10)
{
//bout de script B
}
//ainsi de suite
nCounter++;
if (nCounter == 50) nCounter = 0;
SetLocalInt(GetModule,"OHBCOUNT",nCounter);

}
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.


Pour un script de module par exemple. Selon le nombre de valeur qui lancent une partie, on a leur fréquence.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 20/01/2006 00:28:19 Sujet du message :

Je vouslais savoir, qu'est ce qu'un OHB?

Ensuite, je ne crois pas que ca:
NWScript :
object objet_zone = GetFirstObjectInArea(zone);
    while(GetIsObjectValid(objet_zone))
    {
        if(GetIsPC(objet_zone))
        return;

    objet_zone = GetNextObjectInArea(zone);
    }
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.

cela permette d'economiser des ressources. Imagine, qu'une zone comporte beaucoup de placables et de créatures, tu vas les appeller avec le GetNextObjectInArea, jusqu'à qu'un PC soit trouvé. S'il n'y a plus de PC dans la zone, et bien tous les objets vont être appellés!
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Semcatala
Grand Sage du Conseil
Inscrit le: 20 Jan 2004
Messages: 951
Répondre en citant
Posté le : 20/01/2006 00:36:03 Sujet du message :

L'Erudit>

OHB signifie " OnHeartBeat "

Le pasage dont tu me parles ne se trouve pas dans le ohb , mais dans le " onexit " , qui n'est activé que lors de la sortie d'un pj de la zone.
Si tu as une autre solution plus simple pour vérifier la présence d'un joueur humain dans une zone , je suis preneur ( faut dire aussi que j'en ai pas cherché d'autres , il est tard ! mdr ! ) , j'aurais aimé qu'il y ai une fonction " GetIsPcInArea " , mais je crois que ça n'existe pas.

Sinon oui ça va économiser des ressources , car le but est de desactiver les OHB inutilisés.
De plus , une des causes du lag est le trop grand nombre de placeables déposés sur une zone , donc si il y a trop de placeables sur une zone , ce n'est pas un script qui va faire ramer , mais plutôt ce trop plein de placeables ! Very Happy

De toutes façon j'aime pas les zones surchargées en placeables ! NA ! Razz
_________________
" La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG
" La véritable école du Commandement est la culture générale. " CdG
" Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F
" La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG
" La fin de l'espoir est le commencement de la mort. " CdG
Dernière édition par Semcatala le 20/01/2006 00:42:11; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 20/01/2006 00:41:51 Sujet du message :

Tu peux peut-être incrementer une variable de 1 quand un PC rentre dans la zone, et inversement, la réduire quand il en sort (sur les OnEnter//OnExit). Moins lourd. Mais ça peut peut-être planter si un joueur fait une déco ou plante dans la zone, je suis pas sur qu'il y ait un évenement.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Anthraxcite
Légende vivante
Inscrit le: 12 Juin 2004
Messages: 372
Localisation: Belgique
Répondre en citant
Posté le : 20/01/2006 00:52:38 Sujet du message :

Pour vérifier la présence de PJ mieux vaut boucler sur la liste des PJs plutot que sur les objets d'une zone, la recherche est beaucoup plus courte.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 20/01/2006 00:53:42 Sujet du message :


Citation :
j'aurais aimé qu'il y ai une fonction " GetIsPcInArea "
Peut être qu'il ya moyen de créer une fonction qui ressemblerait à ça.

Quelques pistes à la volée:
- GetArea: tu selectionnes la zone
- GetNearestCreature avec les criteres et valeur: PC/vivant. Je ne sais pas si cela marche avec un objet correspondant à une zone, donc danc ce cas, tu utilises GetNearestCreatureToLocation, avec une location quelquepart dans la zone.

Tu n'appelles plus que les créatures, ce qui est plus interessant que d'appeller tous les types d'objets.
Dernière édition par L'Erudit le 20/01/2006 00:56:02; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 20/01/2006 00:55:24 Sujet du message :


Citation :
Pour vérifier la présence de PJ mieux vaut boucler sur la liste des PJs plutot que sur les objets d'une zone, la recherche est beaucoup plus courte.
Ca depend combien tu as d'objets, et combien tu as de PJ connectés, mais de manière générale, ton affirmation est vérifiée.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Anthraxcite
Légende vivante
Inscrit le: 12 Juin 2004
Messages: 372
Localisation: Belgique
Répondre en citant
Posté le : 20/01/2006 01:02:24 Sujet du message :


L'Erudit a écrit :
GetNearestCreature avec les criteres et valeur: PC/vivant. Je ne sais pas si cela marche avec un objet correspondant à une zone, donc danc ce cas, tu utilises GetNearestCreatureToLocation, avec une location quelquepart dans la zone.
C'est dommage qu'on ait pas plus de renseignement des créateurs sur le fonctionnement des recherches de ce types, est-ce qu'il y a plusieurs listes, plusieurs index pour accélérer les recherches... tout des petits trucs du style qui nous permettrait de mieux gérer les ressources, des infos au niveaux des processus me plairaient également, cout du lancement d'un script par exemple(est-ce que ça pourrait correspondre à un thread o_0, j'en doute, peut-etre une liste de script à executer qui sait?).
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 20/01/2006 01:10:58 Sujet du message :

Ca pourait se révéler interessant en effet. Cela dit, les grosses économies se font surtout sur des modules de très grande envergure.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Semcatala
Grand Sage du Conseil
Inscrit le: 20 Jan 2004
Messages: 951
Répondre en citant
Posté le : 20/01/2006 07:53:55 Sujet du message :

Anthraxcite> Pas bête ton idée , je vais modifier le systéme pour contrôler la zone ou se trouve chaque pj , et si elle a le même tag que celle d'ou vient de sortir le joueur , alors on le detecte , faudra juste penser a exclure de la boucle le joueur qui aura déclenché le " onexit"
_________________
" La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG
" La véritable école du Commandement est la culture générale. " CdG
" Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F
" La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG
" La fin de l'espoir est le commencement de la mort. " CdG
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 20/01/2006 10:06:17 Sujet du message :

A priori, il me semble qu'un compteur suffirait sur le OnEnter et le OnExit.
Parce que je crois bien que lorsqu'un PC se déconnecte, meurt, ou se téléporte, il est considéré comme ExitingObject.
Je n'ai pas testé avec tes scripts, mais je vois comment on pourait le faire. Il faudrait que sur le onExit de ta zone tu mettes un compteur test qui arrêterait le OHB s'il ne reste qu'un PC dans la zone, tu te connectes sur un démo avec un pote, tu lui demande de se déconnecter quand il est dans la zone, et tu vois si le OHB s'execute encore.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Semcatala
Grand Sage du Conseil
Inscrit le: 20 Jan 2004
Messages: 951
Répondre en citant
Posté le : 20/01/2006 14:16:03 Sujet du message :

Enki> Un compteur couterais naturelement moins cher en ressources , mais j'ai toujours la hantise de voir un mauvais compte de 5 joueurs arriver quand seuls 4 se trouvent dans la zone.

Bon , voici mon nouveau " onexit " :

NWScript :

void main()
{
object oPC = GetExitingObject();

////////////////////////////// ////////////////////////////// //////
////            Script d'economies de ressources
////////////////////////////// ////////////////////////////// //////
string nom_zone_actuelle = GetLocalString(oPC,"nom_zone_actuelle");
string tag_zone_actuelle = GetLocalString(oPC,"tag_zone_actuelle");
string tag_joueur = GetTag(OBJECT_SELF);
object zone = GetObjectByTag(tag_zone_actuelle);
SendMessageToPC(oPC,"Barre toi de la zone : "+nom_zone_actuelle+ " ! Faiblard !");

object joueur = GetFirstPC();
    while(GetIsObjectValid(joueur))
    {
    object zone_joueur = GetArea(joueur);
    string tag_zone_joueur = GetTag(zone_joueur);
    string tag_nom_joueur = GetTag(joueur);

        if( tag_nom_joueur != tag_joueur )
        if(tag_zone_joueur == tag_zone_actuelle)
        return;

    joueur = GetNextPC();
    }

SetLocalInt(zone,"variable_zone_presence_pc",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.

_________________
" La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG
" La véritable école du Commandement est la culture générale. " CdG
" Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F
" La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG
" La fin de l'espoir est le commencement de la mort. " CdG
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 20/01/2006 23:24:49 Sujet du message :

Heu..
Je pige pas ça :
NWScript :
string tag_joueur = GetTag(OBJECT_SELF);
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.


Car OBJECT_SELF, c'est la zone si c'est un OnExit.
Et je crois qu'un joueur n'a pas de Tag, vaut mieux un GetName ou GetPCPlayerName.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Semcatala
Grand Sage du Conseil
Inscrit le: 20 Jan 2004
Messages: 951
Répondre en citant
Posté le : 20/01/2006 23:47:49 Sujet du message :

En effet , c'est une erreur , j'aurais du mettre à la place :

NWScript :
string tag_joueur = GetTag(oPC);
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.


ou il faudrait plutôt faire un truc avec le nom et des strings comme tu l'a proposé , ça mùarcherais mieux !

Ca fera quelques trucs a degugger a ceux qui veulent s'entrainer aux scripts ! Laughing
_________________
" La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG
" La véritable école du Commandement est la culture générale. " CdG
" Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F
" La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG
" La fin de l'espoir est le commencement de la mort. " CdG
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 23/01/2006 13:26:43 Sujet du message :

je vous renvoie là pour mon système de OnHB.
http://www.system-tek.com/nwinter/phpbb2/viewtopic.php?p=99175&highlight=#p99175
Il y a quelques fonctions utiles et rapides que Bioware a mise à disposition genre celle que cherchait l'Erudit :
NWScript :
// * returns true if there is no player in the area
// * has to be ran from an object
// source bioware xp2 module modifie
int NoPlayerInArea(object oArea) {
    object oFirst = GetFirstObjectInArea(oArea) ;
    if( GetIsPC(oFirst) || GetIsDM(oFirst) || GetIsDMPossessed(oFirst) ) return FALSE ;
    // pour le cas ou le seul objet est un PC partant d'une zone vide
    if( !GetIsObjectValid(oFirst) ){
      SendMessageToAllDMs("Erreur : no valid object for GetFirstObjectInArea") ;
      return TRUE;
    }
    object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oFirst);
    return !GetIsObjectValid(oPC); // * no player in area
}
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é 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 60.224ms