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

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

[Script] Script de gestion de monste de mon monde semi-persistant.

Par eMRaistlin le 19/10/2002 à 10:37:10 (#2362223)

A qui s'adresse ce post ?
- Ceux qui desirent realiser un monde semi-persistant ou persistant dont les monstres ne sont pas geres par Encounters


Je me doute bien que tout le monde se fiche de savoir comment je gere mes monstres sur mon monde semi-persistant, mais si ca peut inspirer des futurs builder, alors pourquoi pas...

Je vais vous presenter les quelques script que j'utilise pour la creation de monstre et la gestion de ces derniers pour mon univers (a decouvrir ici )

Qu'y a t'il de particulier a attendre dans cet univers...

- Le server gere en permanence les monstre.
Il n'y a pas d'encounters (sauf quelques rares boss).
Quel interet ? : Tous les monstres de mon monde ne sont pas aggressifs. Les joueurs peuvent donc se balader dans le monde et voir se promener des porings et autres bestiole diverses et variées se ballader.

- Le server gere en permanence plus de 40 area
J'ai testé d'utiliser les 40 maps avec chacune les 30aine de monstres permanent en jeu, mais c'etait vraiment un peu dur. J'ai donc opté pour un systeme qui me permette de generer les monstres lorsque les joueurs entre dans une area et que lors du depart du dernier joueur de l'area, celle ci soit nettoyée, afin d'alleger les tempsmachine.

- La mise a jour des monstres.
En effet, travaillant en permanence sur l'equilibrage des monstres, nous avions le pb de faire des mises a jour sur les instances des monstres deja in-game (avec au minimum 1/4 heure d'update par Creature), a cause des 1200 monstres present a updater.
Maintenant, les monstres etant tirés directement de la palette des monstres, plus de pb, ils seront updateé en un tournemain.

Voila en gros de quoi il retourne :

OnEnter des area.


//Script d'area_enter qui cree des monstres
#include "ro_createmonster"

void main()
{
//Declaration des variables
object oPCentering = GetEnteringObject();
object oAreaEntered = OBJECT_SELF;
int nNBdePC = GetLocalInt(oAreaEntered,"nNBdePC");

//Incrementation du compteur de PC dans l'area
if (GetIsPC(oPCentering))
{
nNBdePC = nNBdePC+1;
SetLocalInt(oAreaEntered, "nNBdePC",nNBdePC);


//Si c'est le premier PC a entrer, generation des monstres en fonction de l'area
if (nNBdePC==1)
{
CreateMonsters(oAreaEntered);
}
else
{
WriteTimestampedLogEntry(GetName(oPCentering)+GetTag(oAreaEntered)+"enter correct");
}
//LOG~DEBUG
}
}


OnExit des area :

void main()
{
//DECLARATION DES VARIABLES
object oPCexiting=GetExitingObject();
object oAreaLeaved = OBJECT_SELF;
object oObjetaDetruire = GetFirstObjectInArea(oAreaLeaved);
object oFirstPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
int nNBdePC = GetLocalInt(oAreaLeaved,"nNBdePC");

//Mise a jour du Compteur
if (GetIsPC(oPCexiting))
{
nNBdePC = nNBdePC-1;
SetLocalInt(oAreaLeaved,"nNBdePC",nNBdePC);
}

//TEST POUR VERIFIER SI IL RESTE DES PC DANS L'Area

if (nNBdePC == 0)
{

//BOUCLE DE DESTRUCTION DES CREATURES/ITEM
while (GetIsObjectValid(oObjetaDetruire))
{
if (
(GetObjectType(oObjetaDetruire)== OBJECT_TYPE_CREATURE)||
(GetObjectType(oObjetaDetruire)== OBJECT_TYPE_ITEM)
)
{
DestroyObject (oObjetaDetruire);
}
oObjetaDetruire=GetNextObjectInArea();
}
}

//LOG~DEBUG
}


ro_createmonster : Script de creation des monstres - library

#include "ro_listmonster"
#include "ro_list_area"

void CreateMonsters(object oArea)
{
//Declaration des variables
int nRandom ;
int nRandomLoc ;
string sAreaName = GetTag(oArea);
location lRespawnLoc;
int nNBMonstres = 60; //A MODIFIER en fonction du nombre de monstre souhaite
int nNumeroArea=0;
string sMonstre;
string sRandLoc;

//affectation d'un numero d'area
nNumeroArea = GetAreaNumber(oArea);

//Boucle de creation du monstre

while (nNBMonstres > 1)
{
nRandom = Random(100)+1;
nRandomLoc = Random(40)+1;
sRandLoc = IntToString(nRandomLoc);
if (nRandomLoc < 10)
{
sRandLoc = "0"+sRandLoc;
}

// Determination de la location de creation du monstre
lRespawnLoc = GetLocation(GetObjectByTag("RSPWN_"+IntToString(nNumeroArea)+"_"+sRandLoc));

//Appel du monstre en fonction de l'Area
sMonstre = GetMonsterByArea(nNumeroArea,nRandom);
CreateObject(OBJECT_TYPE_CREATURE,sMonstre,lRespawnLoc,FALSE);
nNBMonstres = nNBMonstres-1;
}
//DEBUG
//}void main(){
}


ro_list_area : script de listing des area - library

int GetAreaNumber(object oArea)
{
int nNumero;
string sAreaName = GetTag(oArea);

nNumero = StringToInt(GetStringRight(sAreaName,3));
return nNumero;
//DEBUG
}


ro_listmonster : le plus *** a faire : la library des monstres/area

string GetMonsterByArea(int nAreaNB=0, int nPourcent=0)
{
switch (nAreaNB)
{
case 1: //Area = Votre 1ere area
if ((0<=nPourcent)&&(nPourcent<=30))
{
return "monstre_x";
}
if ((31<=nPourcent)&&(nPourcent<=50))
{
return "monstre_m";
}
if ((51<=nPourcent)&&(nPourcent<=60))
{
return "monstre_k";
}
if ((61<=nPourcent)&&(nPourcent<=70))
{
return "monstre_j";
}
if ((71<=nPourcent)&&(nPourcent<=80))
{
return "monstre_e";
}
if ((81<=nPourcent)&&(nPourcent<=86))
{
return "monstre_c";
}
if ((87<=nPourcent)&&(nPourcent<=94))
{
return "monstre_b";
}
if ((95<=nPourcent)&&(nPourcent<=100))
{
return "monstre_a";
}

case 2: //Area =Votre 2eme area
if ((0<=nPourcent)&&(nPourcent<=40))
{
return "monstre_f";
}
if ((41<=nPourcent)&&(nPourcent<=80))
{
return "monstre_e";
}
if ((81<=nPourcent)&&(nPourcent<=90))
{
return "montre_d";
}
if ((91<=nPourcent)&&(nPourcent> case 1:


Voila... en esperant que cela puisse servir a qqu'un.

Re: Script de gestion de monste de mon monde semi-persistant.

Par miriandel le 19/10/2002 à 15:55:36 (#2364005)

Provient du message de eMRaistlin

Quel interet ? : Tous les monstres de mon monde ne sont pas aggressifs. Les joueurs peuvent donc se balader dans le monde et voir se promener des porings™ et autres bestiole diverses et variées se ballader.


Les rencontres du jeu peuvent produire des "monstres" non agressifs, il suffit de construire ses rencontres avec des monstres non-agressifs.

Des américains ont publié un système de spawn complet il y a un petit temps, mais je ne sais pas vraiment pourquoi.

Qu'est-ce qui te dérange au juste dans le système intégré au jeu ?

Par eMRaistlin le 19/10/2002 à 16:28:52 (#2364174)

Qu'est-ce qui te dérange au juste dans le système intégré au jeu ?


Ben, ce qui m'ennui le plus dans le systeme actuel, c'est que si je fais une encounter sur toute l'area, le respawn aura plusieur pb :

- Il est calculé en fonction de CR du groupe, et cela ne m'interesse pas. et je ne souhaitait pas avoir une encounter par monstre dans la map (surtout avec 40area * 40aine de monstres/area).

- Le respawn infini n'est pas vraiment infini tant que tu ne sors pas de la zone de trigger, donc tu es obligé de faire de multiple zone de trigger qui declencheront l'apparition de 1 à 8 monstres... de plus, un pj qui ne bouge pas de l'area ne fera pas se respawn les monstres de la map.

Donc, en fait, tu ne peut pas avoir constamment des monstres autour de toi, meme sans bouger.

Tandis que la, chaque monstre est crée, puis vit tant que personne ne sors de l'area.

de plus, (et je le rajoute pasque je l'avais oublié) chaque monste a ceci sur son OnDeath :

OnDeath

#include "ro_listmonster"
#include "ro_list_area"

void Respawn(object oArea)
{
//Declaration des variables
int nRandom ;
int nRandomLoc ;
string sAreaName = GetTag(oArea);
location lRespawnLoc;
int nNBMonstres = 2;
int nNumeroArea=0;
string sMonstre;
string sRandLoc;

//affectation d'un numero d'area
nNumeroArea = GetAreaNumber(oArea);

//Boucle de creation du monstre

while (nNBMonstres > 1)
{
nRandom = Random(100)+1;
nRandomLoc = Random(40)+1;
sRandLoc = IntToString(nRandomLoc);
if (nRandomLoc < 10)
{
sRandLoc = "0"+sRandLoc;
}

// Determination de la location de creation du monstre
lRespawnLoc = GetLocation(GetObjectByTag("RSPWN_"+IntToString(nNumeroArea)+"_"+sRandLoc));

//Appel du monstre en fonction de l'Area
sMonstre = GetMonsterByArea(nNumeroArea,nRandom);
CreateObject(OBJECT_TYPE_CREATURE,sMonstre,lRespawnLoc,FALSE);
nNBMonstres = nNBMonstres-1;
}
//DEBUG
//}void main(){
}

void main()
{
string sTAG=";
int nTentatives=0;
object oMonster=OBJECT_SELF;
object oKiller=GetLastKiller();
object oAreaMonster = GetArea(oMonster);

Respawn(oAreaMonster);

////////////////////////////////////////////////////////////////
//Gere les factions
////////////////////////////////////////////////////////////////

int nReput=GetReputation(oMonster,oKiller);
AdjustReputation(oKiller, oMonster, 50-nReput);
}

avec la pertie "Gere les factions" a commenter si il s'agit d'un monstre aggressif. (a noter : faire un copie de ce script sans la fin pour etre tranquille, et affecter l'un ou l'autre, suivant le type de monstres.)


Ainsi, chaque monstre qui meur declenche la generation spontannée d'un autre monstre en fonction de la map sur laquelle il se trouve. ce qui fait que la map est toujours peuplée.

En resumé, le systeme classique a plus un style d'encoutner a la Final et celui-ci est plutot genre SecretOfMana... enfin, en gros, pour schematiser...

Par miriandel le 19/10/2002 à 17:29:37 (#2364424)

Le spawn est calculé en fonction du CR du groupe, et c'est bien là son intérêt. Si tu veux toujours le même spawn, tu mets un nombre de créatures fixes, et toutes du même CR.
Donc ça, tu sais le faire avec le système Bioware.

Respawn infini... si tu mets des rencontres qui englobent toutes la zone, forcément les PJs ne sauront pas activer les événements OnExit et OnEnter de ta rencontre, et elle ne respawnera pas.
Rester au milieu d'une zone en attendant que ça respawne fait très "Asheron's Call" comme concept.
Une rencontre D&D, c'est, comment dire.... une rencontre :)
L'intérêts des rencontres Bioware est de proposer de la diversité dans les spawns, et de ne rien devoir coder du tout.

M'enfin, je vais rien dire vu les zillions de monstres que j'ai aussi abattus dans d'autres jeux :)

Par eMRaistlin le 19/10/2002 à 17:52:16 (#2364514)

L'intérêts des rencontres Bioware est de proposer de la diversité dans les spawns, et de ne rien devoir coder du tout.


C'est exact... et j'apprecie les spawn de Bioware..

Je propose juste des scripts pour ceux qui preferent une approche un peu plus... console du jeu. C'est tout. Ca permet d'avoir le choix de la facon dont on veut gerer ca...
et de ne rien devoir coder du tout.

Vi, ben du coup, c'est plus obligé non plus, je l'ai fait pour vous...

Remarque, quand je dis console, faut pas misinterpreter... encore une fois, ceux qui veulent voir le resultat peuvent venir sur mon mod (pub perso ^^ ) pour venir voir ce que ca peut donner...

Par Amaranthe le 19/10/2002 à 20:07:44 (#2365207)

J'avoue que pour ma part je me suis aussi tourné vers un systeme de spawn différent de celui des encounters.

Cela me permet de maitriser completement le processus. Mes monstres spawnent quand je le veux, et ceci, qu'il y ai ou non présences de joueurs.

Ce que j'essaye de faire, un monde qui pourrait se passer des joueurs. Avec ses propres interractions, sa propre économie. Quand j'aurai réussi a faire ca, alors il ne restera plus qu'a introduire des joueurs... et cela devrait tourner sans trop de soucis...

Mais ce n'est pas la premiere fois que l'on s'apercoit de la richesse de nwn, qui permet, ici encore a chacun de trouver SA solution.

Par miriandel le 20/10/2002 à 1:04:55 (#2366637)

Hah, ça me rappelle de bons souvenirs ça, Amaranthe !

En 1995, les designers d'UO (dont l'excellent Designer Dragon) avaient imaginé une économie de monstres.
Idée magnifique s'il en est.
Imagine les animaux qui se reproduisent plus ou moins selon qu'on les chasse, etc...

Puis quand les serveurs ont ouvert, les joueurs ont tout tué en cinq sec, et ils n'ont pas insisté :)

Le principal problème d'un système qui spawne les monstres avec ou sans présence de joueurs, c'est la charge CPU du serveur.
M'enfin, l'idée est à creuser, à condition d'avoir un serveur quadriproc cadencé à plus-vite-que-ça, et un univers totalement persistant, bien sûr.

Par eMRaistlin le 20/10/2002 à 1:17:38 (#2366705)

M'enfin, l'idée est à creuser, à condition d'avoir un serveur quadriproc cadencé à plus-vite-que-ça, et un univers totalement persistant, bien sûr.


non, justement, c'est pour ca que je me permet de vous faire profiter de mon travail...

en fait, j'avais commencé avec des monstres persistants, mais au bout de la 40eme area, j'en arrivait a plus de 1200 monstres gérés... Je pouvais lancer le serveur, mais je pouvais plus jouer en local (oO) et meme, ca ramait a mort durant le lancement du serveur.

L'interet des qq script ci-dessus, c'est de ne generer des monstres que sur les maps ou il y a des PC, puis de tout effacer lors de leur depart...
Mais l'avantage par rapport aux encounters, c'est que si le PC squatte l'area, alors les monstres seront gérés comme dans tout les autres sytemes de monstres persistant : avec un Auto-respawn qui recrée le monstre a une position aleatoire, et apres avoir (le cas echeant), effacé sa rancoeur...

Par miriandel le 20/10/2002 à 14:51:46 (#2368923)

Tu sais Raist, j'utilise le système de Bioware, qui offre bien d'autres avantages d'ailleurs, comme la présence d'événements de type OnEnter, OnExit, UserDefined ou encore OnExhauted, et je n'ai jamais de monstre qui traîne dans une zone vide de joueurs, c'est 3 lignes de code dans l'event OnExit...

...les monstres seront gérés comme dans tout les autres sytemes de monstres persistant : avec un Auto-respawn qui recrée le monstre a une position aleatoire... Je peux pas te laisser dire ça, car tu mets dans le même panier les jeux de baston et les univers persistants.
Dans Althea, il ne sera pas question de faire du XP à la pelle, il existe de très bon jeu hack'n slash pour ça dans le panel des MMORPGs, je ne vois aucun intérêt d'un ré-écrire un.
Quant au respawn à des endroits différents, je fais ça aussi avec l'outil Bioware, il suffit de placer plusieurs points de spawn, ce qui permet de répartir les spawns judicieusement.

Par eMRaistlin le 20/10/2002 à 20:20:56 (#2370908)

Je peux pas te laisser dire ça, car tu mets dans le même panier les jeux de baston et les univers persistants.



Y'a un truc recurrent ici (enfin, plutot sur le forum de la tour effondre, mais ici aussi a priori...)


Pourquoi diantre un module qui propose des monstres persistant comme celui d'un module action ne pourrait il pas en plus avoir autant d'aspect "RolePlay"* que sur un mode role play ???

ca me semble un peu reducteur comme vision.. enfin...

Encore une fois, je met ca a dispo au cas ou, et je pretend pas remplacer le boulot de Bioware (sic!)

*et je parle pas ici des modules qui propose le formidable roleplay de pouvoir creer sa propre maison en echange des sous et ingredients qui vont bien... ou des forgeron et autre boulangers... Je te parle d'integrer une storylign et des NPC connu dans le monde, avec backgroiund et tout, et faire des interaction... Ca empeche vraiment d'avoir une gestion des monstres "a la SecretOf" ?? Paske moi, ca me semble pas incompatible... mais je suis peut etre le seul... oO

Par miriandel le 21/10/2002 à 12:13:38 (#2373984)

Ben tu poses une question intéréssante.

Moi j'aime bien l'action, et le roleplay forcé me gonfle un peu, donc, à priori, je n'ai rien contre le combat. Beaucoup de combat même.

Et pourtant...
Ce qui me pousse à dire que l'intérêt de casser du monstre à la tonne n'a pas sa place dans NWN, c'est que d'une part ça existe déjà, et que d'autre part, ça induit le comportement puéril de "faire du pex".

Et faire du pex, c'est mal.
Franchement, les "hey, c'est mon monstre" ou "encore 247 dragons pour le level 20 !" et autres "DING", ça commence à bien faire.

Mais soit, les goûts et les couleurs, ça se discute pas, je suppose que tu as un public, et si tout le monde prend son pied, c'est le principal.

Moi je voulais juste comprendre pourquoi certains sentaient le besoin de refaire un système déjà existant et efficace.

Maintenant j'ai compris :)

Par eMRaistlin le 21/10/2002 à 12:25:17 (#2374079)

Maintenant j'ai compris


^^

Franchement, les "hey, c'est mon monstre" ou "encore 247 dragons pour le level 20 !" et autres "DING", ça commence à bien faire.


La dessus, je suis d'accord... bon, c'est vrai que pour mon module persistant, en ce moment, a part le forgeron, y'a pas enormement de quetes, mais c'est parceque justement, le plus dur a faire dans un module, c'est bien de mettre une ambiance. Donc, maintenant que les probleme technique de mon module sont tous (ou presque... saletés de syteme de Faction a la c** :)) resolu, je vais enfin pouvoir me concentrer pour apporter toute la saveur des Quetes a mon monde persistant, même si de toute facon, rien ne remplacera un Mj competent (ou competente, en l'occurence... best regards to Nylou ^^). Mais bon, je suis en train de reflechir a toutes les quetes possibles et imaginables qui puissent etre reutilisables et reproductible (vu que le monde est semi-persistant.).

Mais pour le XP powa, jsutement, on a géré ca avec des donjons TRES TRES diffficiles d'acces sans equipe et des "boss" encore pire... Donc, le GrosBill de base ne s'aventurera guere plus loin que le niveau 2 de chaque donjon si il ne fait pas un peu de social avec les autres joueurs... apres, c'est au joueur d'etre roleplay ou non... Ca, j'ai pas encore reussi a les contraindre (quoique... un ch'tit script qui sanctionne les joueurs qui parlent avec des mots trop recent (PC/Video et autres termes 20eme siecle et plus...^^), mais ca me semble un chouilla trop despotique... A voir ^^;

Par coolstar le 21/10/2002 à 13:06:14 (#2374368)

Propositions de MJ non virtuel...


Lorsque tes joueurs déraillent dans une vraie partie tu les rappelles gentillement à l'ordre en hors-jeu... et pis s'ils font rien que de continuer tu les sanctionnes via les PNJ... et dans le cas extrème tu les invites à quitter la partie non ? Moi c ce que je fais en tout cas (pour les plus relouds... anti-roleplay... anti-jeu...) ! :ange:


Ce que je veux dire, c que plutôt qu'un script despotique, du moment que tu es présent durant un évènement-joueur... et ben tu as le pouvoir d'intervenir... et pas petit le pouvoir de Master... :D

Donc... en application... lorsqu'un joueur déraille tu l'averti d'abord et le sanctionne ensuite directement s'il insiste... c très dissuadant ça pour le mauvais joueur... et pour pas faire trop despotique... tu appliques aussi l'inverse... c à dire que tu favorises le roleplay, en offrant directement des récompenses bonus (non prévu par les scripts) au joueurs les plus investis... genre plus d'Xp ou des objets/renseignements/aides... enfin des récompenses qui collent avec le gameplay de l'histoire quoi ! ;)

...

Par eMRaistlin le 21/10/2002 à 13:45:00 (#2374673)

(quoique... un ch'tit script qui sanctionne les joueurs qui parlent avec des mots trop recent (PC/Video et autres termes 20eme siecle et plus...^^),

it was a joke ^^

Par coolstar le 21/10/2002 à 13:52:01 (#2374737)

Je suis loin de saisir langue-laid... tu voulais signifier quoi là ? c'était une blague ?? :confus:

Nan parce que moi là j'étais sérieux... il y a des principes rôlistiques à respecter si l'on préserver le roleplay... :D

...

JOL Archives 1.0.1
@ JOL / JeuxOnLine