persistance journal de quete

Répondre
Partager Rechercher
Salut a tous.

EN preambule je doit avouer que j ecris ce post par faineantise

Es ce que quelqu un connait des scripts qui permettent de stocker et de recuperer les journaux de quete via la base de donnée bioware ( je n utilise pas nwn4X et je n ai vraimment pas l intention de l utiliser

J eleverai un temple a la gloire de celui ou celle qui me donnera la reponse ou a defaut je serai obligé de me programmer ca tout seul
Il suffit de stocker une variable de campagne pour chaque quête en cours/terminée, puis d'y faire appel lors de la connexion du joueur. En théorie, les quêtes sont conservées tant que le module n'a pas redémarré. Donc il ne faut y faire appel qu'une seule fois.

Tu peux mettre la variable à 1 si la quête est juste prise, et à 2 si elle est finie.

Genre "SetCampaignInt("BDD_quêtes", "variable_quête_brubidule", #, oJoueur)"
__________________
Citation :
Publié par Ariok
J eleverai un temple a la gloire de celui ou celle qui me donnera la reponse ou a defaut je serai obligé de me programmer ca tout seul
Code:
// Module OnClientEnter Script


void main()
{
	string sDBase;
	string sQuestTag;
	int nEntryID;
	int nII;
	object oPC=GetEnteringObject();	
		
	nII = 0;
	while (nII < 100)
	{	
		nII ++;
		sQuestTag = "q" + IntToString(nII);
		nEntryID = GetCampaignInt("Quest", sQuestTag, oPC);
		if (nEntryID!= 0)
		{	
		AddJournalQuestEntry(sQuestTag, nEntryID, oPC, FALSE, FALSE, FALSE);
		}	
	}	
}
Ici les quêtes sont nommées q01... à q100

Pour le temple de la gloire, merci de me préciser ton adresse que je t'envoie les plans sur cdrom.
merci
Il vas te falloir en plus dans le dialogue de la quête rajouter deux petit scripts, Le premier qui vas stocker de façon persistante la valeur de la variable de quête et un deuxième qui vas crée la variable de façon persistante qui rattache a l'entrée de journal.

Je sais pas si je suis clair, je pourrais écrire le script mais comme je suis pas scripteur vas falloir que je cherche un peu
Oui en effet, dans ma précipitation de gagner un temple de la gloire j'ai oublié un morceau de code :

La commande SetCampaignInt va effectuer les 2 opérations nécessaires évoquées par Elynehil.

Duplique le script ga_journal en pa_journal et rajoute un paramètre:
Code:
void main(string sQuestTag, int nEntryID, int bAllPartyMembers, int bStockInDatabase, int bAllPlayers, int bAllowOverrideHigher)
{
	object oPC = (GetPCSpeaker()==OBJECT_INVALID?OBJECT_SELF:GetPCSpeaker());
	AddJournalQuestEntry(sQuestTag, nEntryID, oPC, bAllPartyMembers, bAllPlayers, bAllowOverrideHigher);
	
	if  (bStockInDatabase = 1)
	{
	SetCampaignInt("Quest", sQuestTag, nEntryID, oPC);
	}		
}
A partir de là tu n'as plus qu'a utiliser pa_journal en lieu et place de ga_journal.
La variable bStockInDatabase a été rajoutée, ce qui permet de choisir au nomment de l'appel de ce script si la quête doit être persistante ou pas.
Ce dernier point est important car toutes les quêtes n'ont pas a être persistantes, faire un mix des deux c'est pas mal aussi.

Ces 2 scripts sont très simples a implémenter, par contre juste un petit défaut, autant te prévenir, chaque joueur va avoir un méchant "bip" lors de son entrée dans le module. Cela correspond à la mise à jour du journal de quête.

Citation :
Publié par Lilo Yapudbier
Oui en effet, dans ma précipitation de gagner un temple de la gloire j'ai oublié un morceau de code :

La commande SetCampaignInt va effectuer les 2 opérations nécessaires évoquées par Elynehil.

Duplique le script ga_journal en pa_journal et rajoute un paramètre:
Code:
void main(string sQuestTag, int nEntryID, int bAllPartyMembers, int bStockInDatabase, int bAllPlayers, int bAllowOverrideHigher)
{
	object oPC = (GetPCSpeaker()==OBJECT_INVALID?OBJECT_SELF:GetPCSpeaker());
	AddJournalQuestEntry(sQuestTag, nEntryID, oPC, bAllPartyMembers, bAllPlayers, bAllowOverrideHigher);
	
	if  (bStockInDatabase = 1)
	{
	SetCampaignInt("Quest", sQuestTag, nEntryID, oPC);
	}		
}
A partir de là tu n'as plus qu'a utiliser pa_journal en lieu et place de ga_journal.
La variable bStockInDatabase a été rajoutée, ce qui permet de choisir au nomment de l'appel de ce script si la quête doit être persistante ou pas.
Ce dernier point est important car toutes les quêtes n'ont pas a être persistantes, faire un mix des deux c'est pas mal aussi.

Ces 2 scripts sont très simples a implémenter, par contre juste un petit défaut, autant te prévenir, chaque joueur va avoir un méchant "bip" lors de son entrée dans le module. Cela correspond à la mise à jour du journal de quête.


Merci je vais etudier tout ca et si ca marche, j eleverai ton temple a ta gloire et tous les ecoliers de france devront declamer tes louanges chaque matin
Je voudrai une précision sur ce que vous avez échangé.

Quand vous parlez de la base Bioware, cela signifie qu'il y a dans le jeu lui-même une sorte de base de données qui puisse stocker des données sans passer par une base MySql par exemple ?

Et donc, le script défini plus haut permet d'écrire "dans" le module ?

Merci
Citation :
Publié par Eduen
Quand vous parlez de la base Bioware, cela signifie qu'il y a dans le jeu lui-même une sorte de base de données qui puisse stocker des données sans passer par une base MySql par exemple ?
Tout à fait. Les fonctions SetCampaign* permettent d'écrire dans une base de donnée externe, et GetCampaign* permettent d'y faire appel.

Cette base de donnée est créée, si elle n'existe pas au moment où SetCampaign* est appelé.


Je ferai prochainement un mini-article traitant de la base de données Obsidian, afin de la présenter dans la Tour des Arcanes.
__________________
Oui de plus si tu regardes bien les lignes proposées, il y a en tout une dizaine de lignes de script rajoutées pour gérer la persistance de quête.
C'est donc un système très économique.

Concernant les systèmes économique justement je cherche à mettre au point actuellement un système de spawn/despawn conditionnel le plus simple possible, si vous avez des idées je suis preneur.
Merci pour ces précisions

Je m'aperçois que plus j'en apprends sur l'éditeur et la création de module et contenu et moins j'en sais... bon, si Bioware ne sors pas NwN3 avant 5 ans je compte bien pouvoir finir de comprendre le 2.
Personnellement je vous conseillerais de laisser tomber la BDD Bioware et d'utiliser plutôt un item NoDrop dans l'inventaire du PJ. C'est quand même beaucoup plus simple.

Pour le système de spawns conditionnels je te conseille celui là :

http://nwvault.ign.com/View.php?view...s.Detail&id=20

Il est clair et bien documenté. Et il est extremment simple de conditionner tout tes spawns.
Citation :
Publié par Kétil Dimzad
Personnellement je vous conseillerais de laisser tomber la BDD Bioware et d'utiliser plutôt un item NoDrop dans l'inventaire du PJ. C'est quand même beaucoup plus simple.
Mais en procédant ainsi, on ne finit pas avec 25 items NoDrop dans l'inventaire ? Car si un item ne peut pas correspondre avec plusieurs quêtes, il faut alors multiplier les items ? Non?
Citation :
Publié par Eduen
Mais en procédant ainsi, on ne finit pas avec 25 items NoDrop dans l'inventaire ? Car si un item ne peut pas correspondre avec plusieurs quêtes, il faut alors multiplier les items ? Non?

je pense qu'il parlait d'un seul et même item de persistance, sur lequel toutes les variables persistantes sont sauvegardées


Le NoDrop fonctionne ? (j'ai pas testé depuis les premières versions où c'était buggé )
Sur module persistant multi oui, on a des items dont on ne peut pas se débarrasser. Quoi que les lâcher... vais vérifier, en tout cas, on ne peut ni vendre, ni donner ni même déposer dans un fourre-tout... que dans l'inventaire.
Citation :
Publié par KorTeX
je pense qu'il parlait d'un seul et même item de persistance, sur lequel toutes les variables persistantes sont sauvegardées
Ce n'est pas clair dans mon esprit. Peut-on, via un seul item NoDrop, rattacher X quêtes ? Ce qui implique un item neutre au déroulement des quêtes, sans rapport avec le background.
Citation :
Publié par Eduen
Ce n'est pas clair dans mon esprit. Peut-on, via un seul item NoDrop, rattacher X quêtes ? Ce qui implique un item neutre au déroulement des quêtes, sans rapport avec le background.
En fait, si j'ai bien compris, l'item fait juste office de support pour enregistrer les varaiables nécessaire à toutes les quêtes : en effet, on peut enregistrer plein de variables différentes sur un même item.
Cet item n'a donc aucun sens Role-play, et doit être donné à la création du perso et ne doit pas pouvoir être enlever (d'où le NoDrop) pour ne pas remettre les quêtes à 0.
Citation :
En fait, si j'ai bien compris, l'item fait juste office de support pour enregistrer les varaiables nécessaire à toutes les quêtes : en effet, on peut enregistrer plein de variables différentes sur un même item.
Cet item n'a donc aucun sens Role-play, et doit être donné à la création du perso et ne doit pas pouvoir être enlever (d'où le NoDrop) pour ne pas remettre les quêtes à 0.
C'est exactement ça. C'est d'ailleurs le système persistant le plus rapide. C'est aussi pourquoi les variables locales sur un item sont préférées aux variables dans la BDD Obsidian.

Bien sûr, il y a toujours une solution pour donner un sens Role-play à l'item en question. ^^
Il y a un autre avantage au stockage des infos quêtes sur un item d'inventaire : c'est que si on migre les bic personnages vers une autre machine et bien la base de données quêtes migre avec. Pas besoin de déplacer autre chose, je pense là aux semi persistants avec server tournant (un coup le server est chez l'un, un coup chez l'autre).
Par contre je vois au moins 2 points négatifs : on a déjà vu sur nwn1 des persos perdre l'intégralité de leur inventaire, nodrop ou pas nodrop cela ne change rien de plus il faut rajouter un système de save auto des persos à intervalle très fréquent à cause des crachs server et le risque de perte des dernières quêtes validées (problème qui n'existe pas avec la BDD).

Personnellement, à choisir entre l'une ou l'autre de ces solutions, je préfère la solution BDD sans hésiter.
en plus du fait que les BDD sont accessibles extérieurement donc on peut tout voir et tout modifier dessus les effacer aussi

C'est pour moi assez important
Lilo j ai appliqué une legere variante de ta proposition et ca marche nickel !

Je vais donc immediatement faire fouetter mes orcs pour qu ils commencent l edification de ton temple !

Encore merci

PS et merci aux autres aussi pour les soluces par item, mais je prefere la soluce BDD
teu teu teu ..
Le fait que tu ai douté quelques secondes de la pertinence de mon script me vexe au plus haut point !!!
Ordonne à tes orcs d'enfouir 15 vierges vivantes dans les soubassements du temple, pour le dédommagement.... (une vierge par ligne de script).


ps) Et t'as rajouté quoi sans indiscrétion ?
Citation :
Publié par Lilo Yapudbier
teu teu teu ..
Le fait que tu ai douté quelques secondes de la pertinence de mon script me vexe au plus haut point !!!
Ordonne à tes orcs d'enfouir 15 vierges vivantes dans les soubassements du temple, pour le dédommagement.... (une vierge par ligne de script).


ps) Et t'as rajouté quoi sans indiscrétion ?
Monsieur est dur en affaires, surtout que je n en ai pas 15 sous la main la.... Allez 10 vieges +5 ayant pas beaucoup servies. Ca te vas.

Sinon j ai simplement ajouté le fait qu une quete peut etre donnée a tout le groupe. Donc, j ai modifé le pa_journal comme ca :

Code PHP:

 if (bAllPartyMembers)
    {
        
oPJ=GetFirstFactionMember(oPC);
        while (
GetIsObjectValid(oPJ))
        {
            
SetCampaignInt("Quest"sCategoryTagnEntryIDoPJ);
            
oPJ=GetNextFactionMember(oPC);
        }
     } 
Je suis tomber sur ce post parce-que je cherchais la même chose pour les quêtes, sauf que je n'arrive pas à faire fonctionner la chose (faut dire en passant que j'ai aucune connaissance en script, mais y'a rien de dur à faire du copier-coller).

Citation :
// Module OnClientEnter Script


void main()
{
string sDBase;
string sQuestTag;
int nEntryID;
int nII;
object oPC=GetEnteringObject();

nII = 0;
while (nII < 100)
{
nII ++;
sQuestTag = "q" + IntToString(nII);
nEntryID = GetCampaignInt("Quest", sQuestTag, oPC);
if (nEntryID!= 0)
{
AddJournalQuestEntry(sQuestTag, nEntryID, oPC, FALSE, FALSE, FALSE);
}
}
}
Je mets d'abord ce script dans les propriétés du module, dans "Script à la connexion d'un client".

Ensuite j'ouvre ga_journal, je le vide et je mets donc ce script :



Citation :
void main(string sQuestTag, int nEntryID, int bAllPartyMembers, int bStockInDatabase, int bAllPlayers, int bAllowOverrideHigher)

{
object oPC = (GetPCSpeaker()==OBJECT_INVALID?OBJECT_SELF:GetPCSpeaker());
AddJournalQuestEntry(sQuestTag, nEntryID, oPC, bAllPartyMembers, bAllPlayers, bAllowOverrideHigher);

if (bStockInDatabase = 1)
{
SetCampaignInt("Quest", sQuestTag, nEntryID, oPC);
}
}


Puis je le renomme en pa_journal.
Je vais dans mes conversations de quête, remplace ga_journal par pa_journal
Je change les tags de mes quêtes en q01, q02... dans les propriétés du journal et dans les conversations.

Mais seulement après, ca ne marche pas, tout est comme avant.

Il semble que j'ai oublié quelque chose...

Citation :
La variable bStockInDatabase a été rajoutée, ce qui permet de choisir au nomment de l'appel de ce script si la quête doit être persistante ou pas.
Ce dernier point est important car toutes les quêtes n'ont pas a être persistantes, faire un mix des deux c'est pas mal aussi.
Je n'ai pas vraiment compris cette partie, ou et quand décide-t-on qu'une quête doit être persistante ou non ?


Citation :
Publié par LeNigen
Je n'ai pas vraiment compris cette partie, ou et quand décide-t-on qu'une quête doit être persistante ou non ?
En fait c'est très simple:
pour paramétrer une quête, tu dois :
1 - décrire ses différentes étapes (regarde les options de menus et trouve l'endroit ou se paramètre les quêtes).
2 - à différents endroits tu dois faire "progresser" ta quête. Cela peut se faire de multiples façons, par exemple: dans un script déclenché à la mort d'un pnj ou encore dans une option de dialogue.

C'est à ce niveau que tu décideras si ta quête est persistante ou pas, en appelant le ga_journal standard pour une quête non persistante ou bien le pa_journal pour une quête persistante.

Ce système de quête persistante basique s'utilise exactement comme le système habituel, il suffit de remplacer l'appel du script ga_journal par l'autre.

Remarque:
attention à la nomenclature de tes quêtes, elles doivent toutes s'appeler q01 à q99.
Répondre

Connectés sur ce fil

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