|
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
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")
/*:////////////////////////////////////////:*/ /*: 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 oContexte, string sNom, int 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 oContexte, string sNom, int iIndice, location 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 oContexte, string sNom, int 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 oContexte, string sNom, int 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 oContexte, string sNom, int 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 oContexte, string sNom, int 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 sTemplate, location lLoc, int bUseAppearAnimation=TRUE);
/****************************************************/ /* Construction des fonctions */ /****************************************************/
void SetTabString(object oContexte, string sNom, int iIndice,string sValue) { SetLocalString(oContexte,sNom+"["+IntToString(iIndice)+"]",sValue); }
void SetTabLocation(object oContexte, string sNom, int iIndice, location lValue) { SetLocalLocation(oContexte,sNom+"["+IntToString(iIndice)+"]",lValue); }
string GetTabString(object oContexte, string sNom, int iIndice) { return(GetLocalString(oContexte,sNom+"["+IntToString(iIndice)+"]")); }
location GetTabLocation(object oContexte, string sNom, int iIndice) { return(GetLocalLocation(oContexte,sNom+"["+IntToString(iIndice)+"]")); }
void DeleteTabLocation(object oContexte, string sNom, int iLength) { int i; for(i=0;i<iLength;i++) { DeleteLocalLocation(oContexte,sNom+"["+IntToString(i)+"]"); } }
void DeleteTabString(object oContexte, string sNom, int 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") == 1 && GetLocalInt(oArea,"SpawnArea") == 0) { int i; //On respawn tout les monstres de la zone for(i=1 ; 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")== 0 && 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(sTag, FindSubString(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 sTemplate, location lLoc, int 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_CREATURE, sTemplate,lLoc, bUseAppearAnimation); }
//void main(){}
Dans le OnEnter des maps :
#include "biblio_mmorpg"
void main() { object oPJ = GetEnteringObject();
RespawnMonstreEnter(OBJECT_SELF,oPJ); }
Dans le OnExit des maps :
#include "biblio_mmorpg"
void main() { object oPJ = GetExitingObject();
RespawnMonstreExitPJ(OBJECT_SELF,oPJ); }
Dans le OnSpawn des monstres :
//:://///////////////////////////////////////////// //:: 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(sTag, FindSubString(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") != 1 && 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_SELF, ActionEquipMostDamagingRanged()); AssignCommand(OBJECT_SELF, ActionEquipMostEffectiveArmor());
// On fait deplacer la creature pour un peu plus de realiste AssignCommand(OBJECT_SELF, ActionRandomWalk()); }
Et pour finir dans le OnDeath des monstres :
//::////////////////////////////////////////////////// //:: 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(sTag, FindSubString(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 > 0 && (nAlign == ALIGNMENT_GOOD || nAlign == ALIGNMENT_NEUTRAL)) { AdjustAlignment(oPC, ALIGNMENT_EVIL, 5); }
// 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_SELF, EventUserDefined(1007)); }
/*******************************************************************/ /* Personnalisation pour Syloan */ /*******************************************************************/ /* Systeme de respawn pour les monstres */ /*******************************************************************/ AssignCommand(oArea,DelayCommand(fSeconds,RespawnMonstre(sRef,lLoc)));
}
Voila. N'hésitez pas à critiquer
|