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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

pour les areas Onenter et Onexit!

Par RAT le 14/12/2002 à 4:14:57 (#2783437)

J'avais lu un post de eM disant qu'il faisait détruire tous ses NPC quand personne était connecté et de les recréer quand un PC rentrait dans l'area, pour libèrer de la ressource. Est-ce toujours la meilleur solution???

Car j'ai voulu tester aussi, mais je dois avouer que cela faisait planter mon serveur test.

Je mettais dans le onmoduleload :

Toutes les sauvegardes des NPC par différentes boucles, et je les détruisais dans toutes les area.

puis avec deux script dans le onenter et le onexit des area:
je scriptais pour faire à peu près le même effet que eM.

Mais là, la plupart du temps , je tombais sur un plantage de serveur.

Bon bien sûr à 90% , je suis presque sûr que cela vient des boucles, et qu'en faisant charger les zones plus le calcul des boucles cela doit prendre trop de ressources. Vous n'êtes pas d'accord???

Enfin, si vous pourriez m'aider à trouver une solution, car si c'est vrai que cela libére autant de ressource que cela, j'aimerai bien m'amuser à essayer de faire le script :).

Enfin merci d'avance :D:ange:

Par coolstar le 14/12/2002 à 5:35:23 (#2783573)

A mon avis, si tous les NPCs sont retirés dans le même temps c sûr que le CPU va saturer! :D

Par Azrael07 le 14/12/2002 à 8:24:35 (#2783768)

ben ca, ca dépend de beaucoup de choses : d'une part, la taille de la taille de ton module

supprimer tout tes npc est, selon moi, d'une part une tache frolant l'impossible, sachant que pour les recréer(CreatureObject) tu ne pourras pas forcement leurs redonner toutes leurs caratéristiques.

Si tu veux mon avis, applique ca pour les monstres mais laisse les pnj comme ils sont dans ton module.

après sur ton erreur dans ton script je peux pas te dire grand chose vu le manque d'infos que tu donne ;)

Par eMRaistlin le 14/12/2002 à 12:54:42 (#2784928)

Non, ce que je fais, en general, c'est que je tue tout les NPC en sortie d'area, mais les Personnages reelement importants, je les met en Plot, et je demande dans le script de destruction que les plot ne soient pas detruits.

Je suis toutefois surpris que ca fasse planter ton serveur, vu que le serveur NwNro tourne sur un PIII 800, et que grace a ce systeme, je peut faire spawner plus de 50 personne par area sans que il n'y ait vraiment de surcharge.

L'essentiel etant de faire des script le plus leger possible, le plus generic possible pour chaque area.


Mais je suis d'accord avec Jeadi : ne tue pas tes NPC importants (ceux qui conservent les variables, par exemple...), et ne gere avc ca que la population (monstres et NPC non indispensables (clients d'auberges/guardes de la ville...etc etc...))

Par Etienne le 15/12/2002 à 9:36:36 (#2791255)

Les personnages que je souhaite créer à l'entrée et détruis a la sortie, je fais commencer leur tag par "al_" ce qui fais que je ne détruit que si le debut du tag commence par "al_"

je créer toujours un WayPoints : WP_CENTRE et c'est à partir de lui que je détruit toutes les créature commençant par "al_"
J'ai ainsi une fonction générique de destruction


void main()
{
object oPJ = GetExitingObject();
// Est-ce un PJ ?
if (GetIsPC(oPJ))
// Bon je l'enlve au total de l'AERA ?
SetLocalInt(OBJECT_SELF, "nbPJ", GetLocalInt(OBJECT_SELF, "nbPJ")-1);
// Etait-il le dernier PJ de l'AERA ?
if (GetLocalInt(OBJECT_SELF, "nbPJ") == 0) {
object oTAG = GetObjectByTag("WP_CENTRE");
object oPNJ = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC, oTAG);
int i = 1;
string Prefixe;
while (GetIsObjectValid(oPNJ)) {
AssignCommand(oPNJ, ClearAllActions());
Prefixe = GetStringLeft(GetTag(oPNJ), 2) ;
if (TestStringAgainstPattern(Prefixe, "al")) DestroyObject(oPNJ);
oPNJ = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC, oTAG, i++);
}
}
}

Par Jedaï le 15/12/2002 à 12:30:47 (#2792147)

Note qu'utiliser une simple égalité de string au lieu d'une fonction accélérerait sans doute ton script :


if (Prefixe == "al") DestroyObject(oPNJ);

au lieu de :

if (TestStringAgainstPattern(Prefixe, "al")) DestroyObject(oPNJ);



Je pense qu'il est toujours bon d'optimiser les scripts récurrents !:)

Par RAT le 15/12/2002 à 13:37:49 (#2792732)

Oui Mais ce que je ne comprends, c'est que quand vous chargez le module, toutes les zones se chargent aussi. Cela veut donc dire que si vous ne mettez pas un script dans le onmoduleload qui détruit tous les npc non important, tous les npc seront présent tant qu'un joueur ne sera pas rentré puis sortie de la zone, c'est ça????

car moi j'avais rajouter un script dans le onmoduleload justement pour ca!


Mais je vous mettrai le code dans la journée, cela vous aidera mieux pour comprendre d'où vient mon problème:).

PS: Etienne! pourquoi tu ne fais pas l'inverse, les npc importants , il y en a moins que les non importants. Cela serait pas plus simple à la base??

JOL Archives 1.0.1
@ JOL / JeuxOnLine