[Script] Spawn MMORPG

Répondre
Partager Rechercher
Alors voila sachant que ce système ne peu etre plus economique que le systeme de bioware. Mais qui est quand meme pas trop mal pour les fan de respawn a la MMORPG comme moi

Alors pour ceux qui veulent un module de demo avec petit packtage erf : Systeme MMORPG en version rar

Pour ceux qui veulent juste voir les codes :

Commencons pas le plus inutile mais utile quand meme

Le read me

Citation :
Afin que le systeme marche correctment,

Placement des scripts :
Sur les zones ou vous voulez que les creatures soient respawner
OnEnter : onenter_zone
OnExit : onexit_zone

Sur les monstres, laissez les script par defaut sauf :
OnSpawn : onspawn_mob ou nw_c2_default9
OnDeath : ondeath_mob ou nw_c2_default7

ATTENTION !!! Vous pouvez aussi remplacer le script par defaut de bioware
nw_c2default7 et 9. Mais attention car si un MD creer des monstres avec
les scripts de respawn mmorpg suis lui, le monstre n'aparaitra pas pour
une raison : La creature fera sont premier spawn, sera enregistree et
recreer lorsqu'un joueur entrera en zone, je cherche un moyen pour parer
a ceci car ca eviterai de se taper tout les creature quoi que depuis
les Set de Scripts c'est assez rapide ^^

Ensuite il vous faut creer vos creatures :

Les creatures doivent avoir pour Tag xxx_CeQueVousVoulez
Avec xxx temps en secondes avant sont respawn

Exemple : 120_RatDegout
Se monstre respawnera toute les 2 minutes

Si vous avez ds PNJ dans une zone ou vous avz mis les scripts sur
le onenter et onexit des zones, il vous fodra faire attention il faut
qu'ils aient pour tag PNJ_CeQueVousVoulez

Exemple : PNJ_Eleanor
Le pnj ne sera ni detruit ni recreer

PS : A l'heure ou j'ecrit cesligne une id me vien de met dans la boucle
de destruction de la zone un SetIsDestroyable(TRUE,FALSE,FALSE);
et de supprimer les testes dans le spawn des monstres teste ou il y a
sTagRecup = " PNJ". Donc si vous voulez essayer n'hesitez pas mais j'ai
pas teste en theorie ca devrait fonctionner.

Pour tout bug merci de me contacter soit par :
- http://www.syloan.fr.st
- http://www.nwn-fr.org
- https://forums.jeuxonline.info (Forum Masquado)
- MSN : tyriontroy@hotmail.com
La bibliotheque : ( à enregistrer sous le nom "biblio_mmorpg")
Code PHP:

 /*:////////////////////////////////////////:*/
/*:      Bibliotheque de Syloan du         :*/
/*:      Respawn MMORPG economique         :*/
/*:////////////////////////////////////////:*/
/*: Ecrit par : Tyrion                     :*/
/*: Pour le module : Syloan                :*/
/*: Le 25/11/2003                          :*/
/*:////////////////////////////////////////:*/

// Temps avant destruction des monstres de la zone
// et empechement de respawn des autres
// ATTENTION : Ne mettez pas trop petit sinon le joueur a juste
// a sortir et rerentrer et les monstre respawneront plus vite
const float TEMPS_VIDAGE_ZONE 300.0;

/****************************************************/
/*          Declaration des fonctions               */
/****************************************************/

//Ecrire la table des strings
//oContexte est l'objet concerne
//sNom est le nopm de la variable
//iLength est la valeurint GetTabInt(object oContexte, string sNom, int iIndice);
void SetTabString(object oContextestring sNomint iIndice,string sValue);
//Ecrire la table des locations
//oContexte est l'objet concerne
//sNom est le nopm de la variable
//iLength est la valeurint GetTabInt(object oContexte, string sNom, int iIndice);
void SetTabLocation(object oContextestring sNomint iIndicelocation lValue);
//Recuperer la table des strings
//oContexte est l'objet concerne
//sNom est le nopm de la variable
//iLength est la valeurint GetTabInt(object oContexte, string sNom, int iIndice);
string GetTabString(object oContextestring sNomint iIndice);
//Recuperer la table des locations
//oContexte est l'objet concerne
//sNom est le nopm de la variable
//iLength est la valeurint GetTabInt(object oContexte, string sNom, int iIndice);
location GetTabLocation(object oContextestring sNomint iIndice);
//Effacer la table des locations
//oContexte est l'objet concerne
//sNom est le nopm de la variable
//iLength est la valeur
void DeleteTabLocation(object oContextestring sNomint iLength);
//Effacer la table des strings
//oContexte est l'objet concerne
//sNom est le nopm de la variable
//iLength est la valeur
void DeleteTabString(object oContextestring sNomint iLength);
//Fonction de Respawn des monstres
//oArea est la map concerne
//oPJ est le joueur entrent
void RespawnMonstreEnter(object oArea,object oPJ);
//Fonction de Respawn des monstres
//oArea est la map concerne
//oPJ est le joueur sortant
void RespawnMonstreExitPJ(object oArea,object oPJ);
// Fonction de destruction des monstres
// oArea est la zone concerne
void VidageZone(object oArea);
//Fonction de recreation brut de la creature
//sTemplate est le Resref de la creature
//lLoc est la location de la creature
void RespawnMonstre(string sTemplatelocation lLocint bUseAppearAnimation=TRUE);


/****************************************************/
/*         Construction des fonctions               */
/****************************************************/

void SetTabString(object oContextestring sNomint iIndice,string sValue)
{
    
SetLocalString(oContexte,sNom+"["+IntToString(iIndice)+"]",sValue);
}

void SetTabLocation(object oContextestring sNomint iIndicelocation lValue)
{
    
SetLocalLocation(oContexte,sNom+"["+IntToString(iIndice)+"]",lValue);
}

string GetTabString(object oContextestring sNomint iIndice)
{
    return(
GetLocalString(oContexte,sNom+"["+IntToString(iIndice)+"]"));
}

location GetTabLocation(object oContextestring sNomint iIndice)
{
    return(
GetLocalLocation(oContexte,sNom+"["+IntToString(iIndice)+"]"));
}

void DeleteTabLocation(object oContextestring sNomint iLength)
{
    
int i;
    for(
i=0;i<iLength;i++)
    {
        
DeleteLocalLocation(oContexte,sNom+"["+IntToString(i)+"]");
    }
}

void DeleteTabString(object oContextestring sNomint iLength)
{
    
int i;
    for(
i=0;i<iLength;i++)
    {
        
DeleteLocalString(oContexte,sNom+"["+IntToString(i)+"]");
    }
}

void RespawnMonstreEnter(object oArea,object oPJ)
{
    
// Teste si c'est bien un joueur et pas un DM ou un monstres ...
    
if (GetIsPC(oPJ)&& !GetIsDM(oPJ))
    {
        
// On incremente le compteur de +1 du nombre de joueur
        
SetLocalInt(oArea,"enteringPC",GetLocalInt(oArea,"enteringPC")+1);

        
// Si il y a un joueur dans la zone et Que les monstres sont present
        
if(GetLocalInt(oArea,"enteringPC") == && GetLocalInt(oArea,"SpawnArea") == 0)
        {
            
int i;
            
//On respawn tout les monstres de la zone
            
for(i=<= GetLocalInt(oArea,"nbmonster") ; i++)
            {
                
string sTemplate GetTabString(oArea,"ResrefMob",i);
                
location lLoc GetTabLocation(oArea,"LocMob",i);
                
RespawnMonstre(sTemplate,lLoc);
            }
            
// Si les monstres sont spawner pour la premiere fois alors on bloque
            // l'enregistrement du spawn des monstres
            // Au debut je mettais ceci sur le onLoad du module mais tout les
            // monstres d'une zone sont spawne a la premiere entre d'un joueur
            
if(GetLocalInt(oArea,"SpawnLoaded")== 0)
            {
                
// Alors on ne sauvera plus la position des monstres puisque c'est deja fait
                
SetLocalInt(oArea,"SpawnLoaded",1);
            }
            
// On Signal que les monstres sont present
            
SetLocalInt(oArea,"SpawnArea",1);
        }
    }
}

void RespawnMonstreExitPJ(object oArea,object oPJ)
{
    
// Teste si c'est bien un joueur et pas un DM ou un monstres ...
    
if(GetIsPC(oPJ)&& !GetIsDM(oPJ))
    {
        
// On decremente le compteur de -1 du nombre de joueur
        
SetLocalInt(oArea,"enteringPC",GetLocalInt(oArea,"enteringPC")-1);
    }

    
// Si plus de joueur declenchement du timing avant suppression
    
if(GetLocalInt(oArea,"enteringPC")==0)
    {
        
DelayCommand(TEMPS_VIDAGE_ZONE,VidageZone(oArea));
    }
}

void VidageZone(object oArea)
{
    
// Si plus de joueur a la fin du timing et que les monstre sont presents
    
if(GetLocalInt(oArea,"enteringPC")== && GetLocalInt(oArea,"SpawnArea") == 1)
    {
        
object oItem GetFirstObjectInArea(oArea);
        
string sTag,sRecupTag;

        
// Destruction de toute creature dont le tag ne commence pas par PNJ
        
while(GetIsObjectValid(oItem))
        {
            
sTag GetTag(oItem);
            
sRecupTag GetStringLeft(sTagFindSubString(sTag,"_"));

            if(
GetObjectType(oItem) == OBJECT_TYPE_CREATURE
            
&& sRecupTag != "PNJ")
                
DestroyObject(oItem);

            
oItem GetNextObjectInArea(oArea);
        }
        
// On indique que les monstres n'occupe plus la zone
        
SetLocalInt(oArea,"SpawnArea",0);
    }
}

void RespawnMonstre(string sTemplatelocation lLocint bUseAppearAnimation=TRUE)
{
    
object oArea GetArea(OBJECT_SELF);

    
// Teste si il y a bien au moin un joueur dans la zone
    
if(GetLocalInt(oArea,"enteringPC") >= 1)
        
CreateObject(OBJECT_TYPE_CREATUREsTemplate,lLocbUseAppearAnimation);
}

//void main(){} 
Dans le OnEnter des maps :
Code PHP:

 #include "biblio_mmorpg"

void main()
{
    
object oPJ GetEnteringObject();

    
RespawnMonstreEnter(OBJECT_SELF,oPJ);

Dans le OnExit des maps :
Code PHP:

 #include "biblio_mmorpg"

void main()
{
    
object oPJ GetExitingObject();

    
RespawnMonstreExitPJ(OBJECT_SELF,oPJ);

Dans le OnSpawn des monstres :
Code PHP:

 //::///////////////////////////////////////////////
//:: NW_C2_DEFAULT9
//:: Original de bioware
//:: Modifie pour Syloan
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    OnSpawn des monstres
*/
//:://////////////////////////////////////////////
//:: Created By: Tyrion
//:: Created On: 25/11/2003
//:://////////////////////////////////////////////
#include "biblio_mmorpg"
#include "nw_i0_generic"

void main()
{
    
object oArea GetArea(OBJECT_SELF);
    
string sTag GetTag(OBJECT_SELF);
    
string sTagRecup GetStringLeft(sTagFindSubString(sTag,"_"));
    
string sResRef;
    
string sRef GetResRef(OBJECT_SELF);
    
location lLoc GetLocation(OBJECT_SELF);
    
// On increment le compteur de creature a respawn de +1
    
int j GetLocalInt(oArea,"nbmonster")+1;

    
// Si premier spawn du monstre et Creation non immunise
    
if(GetLocalInt(oArea,"SpawnLoaded") != && sTagRecup != "PNJ")
    {
        
// On save la nouvelle valeur du compteur
        
SetLocalInt(oArea,"nbmonster",j);
        
// Save du resref de la creature
        
SetTabString(oArea,"ResrefMob",j,sRef);
        
// Save de la location de la creature
        
SetTabLocation(oArea,"LocMob",j,lLoc);
        
// On Detruit la creature
        
DestroyObject(OBJECT_SELF);
    }
    
// On save la location en local pour le respawn continuel du monstre
    
SetLocalLocation(OBJECT_SELF,"lLoc",lLoc);

    
// On equipe la creature
    
AssignCommand(OBJECT_SELFActionEquipMostDamagingRanged());
    
AssignCommand(OBJECT_SELFActionEquipMostEffectiveArmor());

    
// On fait deplacer la creature pour un peu plus de realiste
    
AssignCommand(OBJECT_SELFActionRandomWalk());

Et pour finir dans le OnDeath des monstres :
Code PHP:

 //:://////////////////////////////////////////////////
//:: NW_C2_DEFAULT7
//::
//:: Script de defaut de Bioware a mettre dans le OnDeath
//:: Ajuste l'alignement
//::
//:://////////////////////////////////////////////////
//:: Copyright (c) 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Modifie par : Tyrion
//:: Le 25/11/2003
//:://////////////////////////////////////////////////

#include "x0_i0_spawncond"
#include "biblio_mmorpg"

void main()
{
    
object oPC GetLastKiller();
    
object oArea GetArea(OBJECT_SELF);
    
string sRef GetResRef(OBJECT_SELF);
    
string sTag GetTag(OBJECT_SELF);
    
int nClass GetLevelByClass(CLASS_TYPE_COMMONER);
    
int nAlign GetAlignmentGoodEvil(OBJECT_SELF);
    
string sRecupTag GetStringLeft(sTagFindSubString(sTag,"_"));
    
float fSeconds StringToFloat(sRecupTag);
    
location lLoc GetLocalLocation(OBJECT_SELF,"lLoc");

    
// Si oSelf est un PNJ (Bon/Neutre) et pas un monstre, appliquer les penalitees
    
if(nClass && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL))
    {
        
AdjustAlignment(oPCALIGNMENT_EVIL5);
    }

    
// Call to allies to let them know we're dead
    //SpeakString("NW_I_AM_DEAD", TALKVOLUME_SILENT_TALK);
    //Shout Attack my target, only works with the On Spawn In setup
    //SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);

    // NOTE: the OnDeath user-defined event does not
    // trigger reliably and should probably be removed
    
if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
    {
         
SignalEvent(OBJECT_SELFEventUserDefined(1007));
    }

    
/*******************************************************************/
    /*                  Personnalisation pour Syloan                   */
    /*******************************************************************/
    /*             Systeme de respawn pour les monstres                */
    /*******************************************************************/
    
AssignCommand(oArea,DelayCommand(fSeconds,RespawnMonstre(sRef,lLoc)));


Voila. N'hésitez pas à critiquer
Vraiment sympa comme systeme pr les creatures

Petites questions :
1- il détruit les creatures aprés 5min qd un joueur quitte la zone, mais est-ce que c'est valable aussi pour les items laissés au sol (genre les drop des bestioles : petit sac, etc.) ?

2- sinon si j'ai bien compris, il est preferable pr les MJs de pas rajouter manuellement des creatures utilisant ce systeme pr le moment ? *pas trop sur d'avoir compris*
EDIT : ah en fait c'est seulement si on ne remplace pas les scripts par defaut ?

3- c'est quoi les set de scripts ? *newbie*

4- Pour les PNJs, le fait qu'ils ne soient pas détruit c'est pr une raison spéciale ? (genre si on les détruit, risque qu'ils perdent des infos de quete ou un truc comme ça ?) - Je pose la question car je pensais qu'il etait justement important de les détruire pr faire des economies ds les zones de villes...

Et encore merci de partager ton systeme de Spawn
Citation :
Vraiment sympa comme systeme pr les creatures

Petites questions :
1- il détruit les creatures aprés 5min qd un joueur quitte la zone, mais est-ce que c'est valable aussi pour les items laissés au sol (genre les drop des bestioles : petit sac, etc.) ?
Nom mais c'est tout bete a rajouter juste un || OBJECT_TYPE_ITEM dans le if de la fonction VidageZone

Citation :
2- sinon si j'ai bien compris, il est preferable pr les MJs de pas rajouter manuellement des creatures utilisant ce systeme pr le moment ? *pas trop sur d'avoir compris*
EDIT : ah en fait c'est seulement si on ne remplace pas les scripts par defaut ?
Oui seulement si tu remplace les code par default

Citation :

3- c'est quoi les set de scripts ? *newbie*
Regarde tes pnj dans script en bas tu as save et chargr script

Citation :
4- Pour les PNJs, le fait qu'ils ne soient pas détruit c'est pr une raison spéciale ? (genre si on les détruit, risque qu'ils perdent des infos de quete ou un truc comme ça ?) - Je pose la question car je pensais qu'il etait justement important de les détruire pr faire des economies ds les zones de villes...
Oui si il on des variable local sur eu elles seront detruite

Citation :
Et encore merci de partager ton systeme de Spawn
C'est normal j'aime bien voir les script des autre aussi moi
Je ne suis pas sur du tout, on lui rajoute ds le if si c'est un item ?

Code PHP:

 if(GetObjectType(oItem) == OBJECT_TYPE_CREATURE
            
&& OBJECT_TYPE_ITEM 
            
&& sRecupTag != "PNJ"
Code PHP:

void VidageZone(object oArea)
{
    
// Si plus de joueur a la fin du timing et que les monstre sont presents
    
if(GetLocalInt(oArea,"enteringPC")== && GetLocalInt(oArea,"SpawnArea") == 1)
    {
        
object oItem GetFirstObjectInArea(oArea);
        
string sTag,sRecupTag;

        
// Destruction de toute creature dont le tag ne commence pas par PNJ
        
while(GetIsObjectValid(oItem))
        {
            
sTag GetTag(oItem);
            
sRecupTag GetStringLeft(sTagFindSubString(sTag,"_"));

            
// C'est bien ICI ?
            
if((GetObjectType(oItem) == OBJECT_TYPE_CREATURE
            
&& sRecupTag != "PNJ")||GetObjectType(oItem) == OBJECT_TYPE_ITEM)
                
DestroyObject(oItem);

            
oItem GetNextObjectInArea(oArea);
        }
        
// On indique que les monstres n'occupe plus la zone
        
SetLocalInt(oArea,"SpawnArea",0);
    }

La y aura effacement de toute creaturte dont le tag ne commence pas par PNJ_
Et tout les items au sol
Je me demandais s'il etait possible avec ce systeme de gerer les effets jours/nuits ? Et si oui comment please ?

Genre définir une extension au TAG dans le meme genre que vu un peu plus haut :
Citation :
0 : respawn le jour et la nuit
1 : que la nuit
2 : que le jour
Faut modifier le script de "onenter" de la zone ?
Non il faudrait modifier la fonction de respawn du monstre c'est a dire ce qui se trouve dans le onSpawn. La je n'es pas le temps d'y reflechir trop de chose faire desole

Mais ca doit pas etre dure avc un GetIsDay() GetIsNight() et un recherche dans le tagca doit etre bon
J'ai mis des //?// pr mettre en valeur les élements que j'ai essayé d'ajouter ...

Si qq1 pouvait me dire si c'est bon et m'expliquer si c'est un break ou un return qu'on place pr que rien se passe mais qu'on saute au if suivant ça serait cool

Merci de votre indulgence

Code PHP:

//::///////////////////////////////////////////////
//:: NW_C2_DEFAULT9
//:: Original de bioware
//:: Modifie pour Syloan
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    OnSpawn des monstres
*/
//:://////////////////////////////////////////////
//:: Created By: Tyrion
//:: Created On: 25/11/2003
//:://////////////////////////////////////////////
#include "biblio_mmorpg"
#include "nw_i0_generic"

void main()
{
    
object oArea GetArea(OBJECT_SELF);
    
string sTag GetTag(OBJECT_SELF);
    
string sTagRecup GetStringLeft(sTagFindSubString(sTag,"_"));
    
//?//
    //?// TAG de Fin : 0 = Jour ou Nuit ; 1 = que le Jour ; 2 = que la Nuit
    //?//
    //?// ça va recup la valeur a droite dans sTag
    
string sCycle GetStringRight(sTag1);
    
//?// Transform la variable string en int (?)
    
int nCycle StringToInt(sCycle);
    
//?//
    
string sResRef;
    
string sRef GetResRef(OBJECT_SELF);
    
location lLoc GetLocation(OBJECT_SELF);
    
// On increment le compteur de creature a respawn de +1
    
int j GetLocalInt(oArea,"nbmonster")+1;

    
// Si premier spawn du monstre et Creation non immunise
    
if(GetLocalInt(oArea,"SpawnLoaded") != && sTagRecup != "PNJ")
    {
        
// On save la nouvelle valeur du compteur
        
SetLocalInt(oArea,"nbmonster",j);
        
// Save du resref de la creature
        
SetTabString(oArea,"ResrefMob",j,sRef);
        
// Save de la location de la creature
        
SetTabLocation(oArea,"LocMob",j,lLoc);
        
// On Detruit la creature
        
DestroyObject(OBJECT_SELF);
    }

    
//?// On vérifie le cycle (si c'est le jour ok)
    
if(GetIsDay() && nCycle == || nCycle == || !GetIsDay() && nCycle == 2)
    {
        
// On save la location en local pour le respawn continuel du monstre
        
SetLocalLocation(OBJECT_SELF,"lLoc",lLoc);

        
// On equipe la creature
        
AssignCommand(OBJECT_SELFActionEquipMostDamagingRanged());
        
AssignCommand(OBJECT_SELFActionEquipMostEffectiveArmor());

        
// On fait deplacer la creature pour un peu plus de realiste
        
AssignCommand(OBJECT_SELFActionRandomWalk());
    }
    else
    {
      
//?// doute sur return ou break?
      
return;
    }

    
//?// On vérifie le cycle (si c'est la nuit ok)
    
if(GetIsNight() && nCycle == || nCycle == || !GetIsDay() && nCycle == 1)
    {
        
// On save la location en local pour le respawn continuel du monstre
        
SetLocalLocation(OBJECT_SELF,"lLoc",lLoc);

        
// On equipe la creature
        
AssignCommand(OBJECT_SELFActionEquipMostDamagingRanged());
        
AssignCommand(OBJECT_SELFActionEquipMostEffectiveArmor());

        
// On fait deplacer la creature pour un peu plus de realiste
        
AssignCommand(OBJECT_SELFActionRandomWalk());
    }
    else
    {
      
//?// doute return ou break?
      
return;
    }

Tout d'abord, pour utiliser un if ... else, on fait comme suit :
Code PHP:

//ici le code a executer tout le temps
if (condition)
{
  
//condition vraie
  //ici le code a n'executer que si c'est vrai
}
else
{
  
//condition fausse
  //ici le code a n'executer que si c'est faux
}
//ici le code a executer tout le temps 
Il se peux que tu n'aie pas de condition fausse. Dans ce cas, tu peux mettre :
Code PHP:

if (condition)
{
  
//condition vraie
  //ici le code a n'executer que si c'est vrai
}
//ici le code a executer tout le temps 
Tu peux aussi avoir plusieurs suite de conditions :
Code PHP:

if (condition1)
{
  
//condition1 vraie
}
else if (
condition2)
{
  
//condition1 fausse et condition2 vraie
}
else
{
  
//condition 1 fausse et condition 2 fausse

On peut mettre autant de else if () que nécessaire. (je ne vais pas ajouter ici le switch .... case en plus)

Dans les conditions, tu peux mettre des tests binaires (a deux elements) tels que :
  • == égalité des membres
  • < l'élément de gauche inférieur a l'élément de droite
  • > l'élément de gauche supérieur a l'élément de droite
  • <= l'élément de gauche inférieur ou égal a l'élément de droite
  • >= l'élément de gauche supérieur ou égal a l'élément de droite
  • != inégalité des membres
Chacun de ces tests renvoi vrai ou faux. On peut dont faire des conditions d'entrée dans un if. Les combinaisons de conditions permettent d'utiliser plusieurs conditions pour en faire un seule.
  • && si les membres renvoient vrai, alors renvoi vrai
  • || si l'un des membres renvoi vrai (ou les deux), alors vrai
Enfin, une bonne imbrication des parentheses permet de faire des conditions assez complexes (voir plus haut).

En espérant avoir tout éclairé.
Merci, je l'ai imprimé pr l'avoir sous la main *pratique ce résumé*

Pr le script, je laisse tomber car au final, ce que je souhaitais, c'etait surtout que mes pnjs ne soient pas là la nuit dans les rues et vu que là le script est lancé au onspawn, j'y arriverai pas. Je vais essayé de chercher une autre piste pr les faire rentrer a la maison ou les détruire qd c'est la nuit (en evitant un script sur le onheartbeat).
Dans le on Enter des zones

Comme ca a l'entre d'un pj ca les destroy

tu rajoute
Code PHP:

if(GetIsNight())

        
object oItem GetFirstObjectInArea(oArea);
        
string sTag,sRecupTag;

        while(
GetIsObjectValid(oItem))
        {
            
sTag GetTag(oItem);
            
sRecupTag GetStringLeft(sTagFindSubString(sTag,"_"));

            if((
GetObjectType(oItem) == OBJECT_TYPE_CREATURE)
            && 
sRecupTag == "PNJ")
                
DestroyObject(oItem);
            
oItem GetNextObjectInArea(oArea);
        }

Mais attention ceci les detruiera tous enfin tous ceux dont l tag commence par PNJ

Si tu veu les recreer, il te faudras faire un autre condition dans le onSpawn pareil que pour les monstre mas avec le sRecupTag =="PNJ"
Pour ceux qui me prendrais pour un debile comme € parce que je n'es pas mis de DelayCommand pour enregistrer sur le onModuleLoad c'est tres simple : Bioware Spawn les creatures non pas au Chargement du module mais à la première entrer D'un joueur sur la zone.
Question à toi Tyrion ou à toute personne ayant adopté ce systeme de spawn : avez-vous observé des problemes éventuels de lag plus important que de coutume ?
Je demande ça car avec ce que j'avais fait (reprise des encounters de Bioware), je me retrouve avec quelques soucis de ce côté (+ les bugs des encounters Bioware, ça commence à faire beaucoup) et cherche donc à voir ailleurs. Or ton systeme Tyrion est très beau et très simple surtout. Reste juste à savoir si ça tient dans la longueur. (merci de spécifier la RAM de votre serveur ainsi que la cadence de son processeur).

Merci de vos réponses car elles en intéressent je pense plus d'un !

Prince Nexus.
Serveur 1 : P4 1,8GHz, 1Go DDR 266
Serveur 2 : P4 1,5GHz, 512 DDR 266

Sur mes deux serveurs, je dispose d'une connection ADSL 512/128

Sachand que j'ai 200 zones avec en moyennes 30/40 monstres (dont des pnjs quine se detruise jamais) aucun lag ne se presente sur le serveur 1

Sur le serveur 2 si trop de personne se deco sur des zones differents les variable n'etant pas detruite le serveur lag au bout de 35h environs... Je remedie a ce probleme en testant avec une boucle while qui se declencherais sur tout le serveur un fois par heure afin de remetre les variable a jour.

[Edit] C'est vrai que tu n'es pas le seul a me dire que les encounter de bioware consomme pas mal ^^
Merci Tyrion et oui, tu ne peux pas t'imaginer à quel point c'est de la merde leurs encounters. Dés que les monstres spawnent dans ton champ de vision, c'est la catastrophe...
Si d'autres ont des stats, je suis preneur .... Apparemment la RAM joue beaucoup.

PN
Sachand que NWServeur est basé sur la RAM. Sachand qu'il peu tourner meme sur un CPU de 800 MHz La RAM est la clef dans NWN.

Moi je les est jamais utiliser les encouters. Je trouve le systeme de sapwn... Extremement Nul et simpliste pour un jeu de ce genre. Enfin du moment qu'on peu scripter ce que l'on veux ^^
J'ai fais quelques petits tests et pour le moment le systeme tient vraiment bien la route

Par contre, je vais commencé a tester et mettre en place le systeme Jour/Nuit, et j'ai un probleme :

Quand j'ajoute le bout de Script, il me dit qu'il y a un probleme de type.

Citation :
onenter_zone.nss(19): ERREUR : VARIABLE DEFINED WITHOUT TYPE
La ligne 19 :
object oItem = GetFirstObjectInArea(oArea);


Je vois pas trop ce qui cloche là. Qqi aurait il une idée ou aurait tester le systeme jour/nuit ?
J'ai essayé d'ajouter un tag a la fin des monstres (_S_N et _S_J) pr faire la difference entre le fait qu'il spawn la nuit ou le jour (pr les monstres cette fois-ci), mais ça ne semble pas fonctionner alors que le code se compile.

Voic le code de Tyrion avec cette tentative Jour/Nuit...

Et de maniere a eviter un conflit sur la reconnaissance du Tag, j'ai "_T_" a la place de "_" dans les autres scripts qui gere le temps de respawn.

Ex de Tag pr une creature qui spawn que le jour ttes les 60s :
"60_T_NOM_S_J"

Si qq1 pouvait m'expliquer pourquoi ça fonctionne pas *s'arrache les cheveux pour faire un systeme jour/nuit pr les bestioles* lol

Code PHP:

/*:////////////////////////////////////////:*/
/*:  A mettre dans le OnEnter des zones    :*/
/*:////////////////////////////////////////:*/

#include "biblio_mmorpg"

void main()
{
    
object oPJ GetEnteringObject();
    
object oArea GetArea(OBJECT_SELF);
    
object oItem GetFirstObjectInArea(oArea);

// Détruit le PNJ si c'est la Nuit à l'entrée d'un joueur dans la zone
if(GetIsNight())
{
        
string sTag,sRecupTag2;

        while(
GetIsObjectValid(oItem))
        {
            
sTag GetTag(oItem);
            
sRecupTag2 GetStringRight(sTag4);
            
//// TEST - Recup ds log
            
PrintString(sRecupTag2);
            
////

            
if((GetObjectType(oItem) == OBJECT_TYPE_CREATURE)
            && 
sRecupTag2 == "_S_J")
                
DestroyObject(oItem);
            
oItem GetNextObjectInArea(oArea);
        }
}

// Idem mais ça détruit le PNJ si c'est le jour
if(GetIsDay())
{
        
string sTag,sRecupTag2;

        while(
GetIsObjectValid(oItem))
        {
            
sTag GetTag(oItem);
            
sRecupTag2 GetStringRight(sTag4);

            if((
GetObjectType(oItem) == OBJECT_TYPE_CREATURE)
            && 
sRecupTag2 == "_S_N")
                
DestroyObject(oItem);
            
oItem GetNextObjectInArea(oArea);
        }
}
   
// Active le Respawn des PNJs/Monstres
   
RespawnMonstreEnter(OBJECT_SELF,oPJ);

- ça me crée quel que soit le tag la creature (meme avec le tag nuit, elle est là le Jour).
- seul la creature ayant le tag de base respawn (pas celle a qui j'ai ajouté le tag de fin _S_J ou _S_N)
- la creature de tag normal (XXX_T_NOM) respawn auto dés sa mort sans temps d'attente.
Deja premier soucis... Tu spawn tes monstres apres avoir detruit les pnj... Ce qui fait que tu detruit rien et que tu recreer tout....

Donc il suffit de mettre RespawnMonstreEntrer avanbt tes fonctions de deletage des pnj de plus...

Rajoute ceci qui mettra les pnj en tuable si il etait en intrigue car sinon impossible de tuer de l'intreigue et donc de le deleter

Code PHP:

if((GetObjectType(oItem) == OBJECT_TYPE_CREATURE)

            && 
sRecupTag2 == "_S_N")
{
     
SetIsDestroyable(TRUE);               
     
DestroyObject(oItem);


A mettree dans tes deux testes

Bref je regarderais ca ce week end car deja la tu pourrais encore moin manger de ressources.... Mais comme je suis en cours pas le temps de faire plus désolé.
Voila le type de tag doit etre

300_cequetuveu__J ou N suivant jour ou nuit

attention a bien mettre 2_ avant le J ou N

J'ai pas tester mais ca devrais fonctionner et si c'est des pnj le tag ben PNJ_CequeTuVeu__J ou N

Code PHP:

/*:////////////////////////////////////////:*/
/*:  A mettre dans le OnEnter des zones    :*/
/*:////////////////////////////////////////:*/

#include "biblio_mmorpg"

void main()
{
    
object oPJ GetEnteringObject();
    
object oArea GetArea(OBJECT_SELF);
    
object oItem GetFirstObjectInArea(oArea);

   
// Active le Respawn des PNJs/Monstres
   
RespawnMonstreEnter(OBJECT_SELF,oPJ);
// Détruit le PNJ si c'est la Nuit à l'entrée d'un joueur dans la zone
if(GetIsNight())
{
        
string sTag,sRecupTag2;

        while(
GetIsObjectValid(oItem))
        {
            
sTag GetTag(oItem);
            
sRecupTag2 GetStringRight(sTagFindSubString(sTag,"__"));
            
//// TEST - Recup ds log
            
PrintString(sRecupTag2);
            
////

            
if((GetObjectType(oItem) == OBJECT_TYPE_CREATURE)
            && 
sRecupTag2 == "J")
            {
                
AssignCommand(oItem,SetIsDestroyable(TRUE));
                
DestroyObject(oItem);
            }
            
oItem GetNextObjectInArea(oArea);
        }
}

// Idem mais ça détruit le PNJ si c'est le jour
if(GetIsDay())
{
        
string sTag,sRecupTag2;

        while(
GetIsObjectValid(oItem))
        {
            
sTag GetTag(oItem);
            
sRecupTag2 GetStringRight(sTagFindSubString(sTag,"__"));

            if((
GetObjectType(oItem) == OBJECT_TYPE_CREATURE)
            && 
sRecupTag2 == "N")
            {
                
AssignCommand(oItem,SetIsDestroyable(TRUE));
                
DestroyObject(oItem);
            }
            
oItem GetNextObjectInArea(oArea);
        }
}


Répondre

Connectés sur ce fil

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