[Beta Test] BD Bioware

Répondre
Partager Rechercher
Bon on commence les hostilités, on va commencer par la liste des fonctions disponibles dans cette BD. Je viens seulement de l'avoir donc c'est pas encore testé mais je m'y met à la première heure demain
Voilà ce qui nous attends

SetCampaignFloat
SetCampaignInt
SetCampaignVector
SetCampaignLocation
SetCampaignString
DestroyCampaignDatabase
GetCampaignFloat
GetCampaignInt
GetCampaignVector
GetCampaignLocation
GetCampaignString
DeleteCampaignVariable
StoreCampaignObject
RetrieveCampaignObject

Voilà pour ce soir

Jaha Effect
Allez quelques indices sur ces fonctions

Code PHP:

// Campaign variable table database control.
// Use the set functions to add/change a variable to a campaign database.
// Use the get functions to retrieve the variable from a campaign database
// Use the delete functions to remove the variable from a campaign database.
// The database name must be the same for both set and get functions. It IS case sensitive.
// The var name must be unique acrossed the entire database.
// If you want a variable to pertain to a specific player in the game, provide a player object.
void SetCampaignFloat   (string sCampaignNamestring sVarNamefloat flFloat,    object oPlayer=OBJECT_INVALID);
void SetCampaignInt     (string sCampaignNamestring sVarNameint nInt,         object oPlayer=OBJECT_INVALID);
void SetCampaignVector  (string sCampaignNamestring sVarNamevector vVector,   object oPlayer=OBJECT_INVALID);
void SetCampaignLocation(string sCampaignNamestring sVarNamelocation locLocationobject oPlayer=OBJECT_INVALID);
void SetCampaignString  (string sCampaignNamestring sVarNamestring sString,   object oPlayer=OBJECT_INVALID);

// This will destroy the entire campaign database if it exists.
void DestroyCampaignDatabase(string sCampaignName);

float    GetCampaignFloat   (string sCampaignNamestring sVarNameobject oPlayer=OBJECT_INVALID);
int      GetCampaignInt     (string sCampaignNamestring sVarNameobject oPlayer=OBJECT_INVALID);
vector   GetCampaignVector  (string sCampaignNamestring sVarNameobject oPlayer=OBJECT_INVALID);
location GetCampaignLocation(string sCampaignNamestring sVarNameobject oPlayer=OBJECT_INVALID);
string   GetCampaignString  (string sCampaignNamestring sVarNameobject oPlayer=OBJECT_INVALID);

// This will remove ANY campaign variable. Regardless of type.
void DeleteCampaignVariable(string sCampaignNamestring sVarNameobject oPlayer=OBJECT_INVALID);

// Stores an object with the given id.
// Returns 0 if it failed, 1 if it worked.
int StoreCampaignObject(string sCampaignNamestring sVarNameobject oObjectobject oPlayer=OBJECT_INVALID);

// Use RetrieveCampaign with the given id to restore it.
// If you specify an owner, the object will try to be created in their repository
// If the owner can't handle the item (or if it's a creature) it will be created on the ground.
object RetrieveCampaignObject(string sCampaignNamestring sVarNamelocation locLocationobject oOwner OBJECT_INVALIDobject oPlayer=OBJECT_INVALID); 
Jaha Effect
Bon ben j'ai pas pu résister, il a fallu que je fasse un petit test vite fait.
Déjà l'installe, il s'avère que Bioware voulait bien faire en proposant dans leur fichier de dl, un nwserver_database.exe et un nwmain_database.exe. Mais pas de bol ces deux exe ne marchent pas avec la BD, par contre la 1.29 que tout le monde a chez soi supporte très bien la BD.
Un nouveau nwscript.nss avec les nouvelles fonctions à placer dans l'override.
Un joli répertoire Database qui ne sert strictement à rien car la BD crée directement sous la racine de NWN les fichiers de base de donnée.
Et une modif du fichier NWN.ini qui indique l'emplacement du repertoire Database qui ne sert à rien puisque la BD ne met rien dans ce répertoire.
Enfin bon, on s'en fout puisque ça marche avec nwmain.exe et nwserver.exe et c'est le principal.

J'ai fais des petits tests rapide, Get/SetCampaignInt et String marche très très bien, on coupe le serveur, on redémarre et on récupère ces variables sans aucun prob.
Par contre j'ai un petit doute sur les float, je sais pas si c'est le Set ou le GetCampaignFloat qui merde mais visiblement, il ne m'a pas renvoyé la float que je lui avait assigné dans le script.
Je vérifierais si c'est un cas particulier ou pas après avoir dormi un peu

Voilà pour cette nuit
....
[Edit]
Raté, j'arrive pas à dormir.
Alors le truc du Set/GetCampaignFloat. J'ai fait un petit dialogue avec ce script dedans
Code PHP:

void main()
{
    
object oPC GetPCSpeaker ();
    
SetCampaignFloat("test""float"18.075oPC);
    
SetLocalFloat(oPC"float2"18.075);

et je verifie avec
Code PHP:

void main()
{
    
object oPC GetPCSpeaker();
    
float fFloat GetCampaignFloat("test""float",oPC);
    
float fFloat2 GetLocalFloat(oPC,"float2");
    
SpeakString(FloatToString(fFloat));
    
SpeakString(FloatToString(fFloat2));

Seulement le prob c'est que le SpeakString me renvoit 18.074998856 au lieu de 18.075, les deux tests me renvois ça, que ce soit avec les float persistants ou les float locaux.
C'est un bug connu ? J'avais jamais remarqué. Je me demande si c'est pas le FloatToString qui m'arrondit ça de manière un peu louche ?
En ce qui concerne les locations, ça marche très bien aussi, on va pouvoir passer à plus sérieux

Jaha Effect
Bon, bien c'est grosso modo ce dont on s'attendait, enfin, en ce qui me conserne, ca m'a l'air interessant, je pense que je vais opter pour ce système.

Citation :
Seulement le prob c'est que le SpeakString me renvoit 18.074998856 au lieu de 18.075, les deux tests me renvois ça, que ce soit avec les float persistants ou les float locaux.
bien....... étrange en effet ^_^' j'avais jamais vu.

Essaye d'afficher la valeur en la multipliant avant le FloatToString pour essayer de cibler le problème (c'est vrai que c'est le genre de salle blague qui peut fouttre en l'air une aprem de debugging ca :/ )

La question que je me pose (je pense que la réponce est oui, mais on ne sais jamais) : quand on enregistre un objet dans la database par un StoreCampainObject, les variables locales sont enregistrées aussi ?
Citation :
Provient du message de Azrael07
La question que je me pose (je pense que la réponce est oui, mais on ne sais jamais) : quand on enregistre un objet dans la database par un StoreCampainObject, les variables locales sont enregistrées aussi ?
Il semble malheureusement que celà ne soit pas le cas, aucun objet n'a ces variables locales de sauvées pour le moment quand on enregistre un objet dans la BD.
Je dis pour le moment parce que ça peut très bien évoluer

Jaha Effect
bah... de toutes facon ca se bidouille... c'est pas un problème trop gravissime ^^, mais c'est quand même un gros point négatif du système.
Tu veux pas aller crier un peu ?
Bon pour le problème des float, vous prenez pas la tête, c'est tout à fait normal, quel que soit le langage de programmation, du moins si on fonctionne en précision 'double' : En réalité les float sont des 'double' qui ne peuvent prendre qu'un nombre de valeur donné, dont 18.075 ne fait pas partie, donc on arrondit à la valeur 'possible' la plus proche, ici 18.0745..

Donc aucune erreur de Bioware ici, c'est une limitation commune au mode de stockage des nombres en virgule flottante (les autres solutions, plus précises, sont trop gourmande en espace sur le disque et sans intérêt pour un usage courant, par contre pour des mathématiciens....).

Je signale d'ailleurs que si tu essaie avec un float constant (c'est à dire que tu fait directement FloatToString( 18.075 ) ) tu obtiendras normalement le même résultat.

Par contre le système semble se conformer à ce qui était prévu et pour l'instant c'est plein de bonnes nouvelles, même le StoreObject() est récupérable, avec les nouvelles fonctions on pourra facilement faire une bidouille (faudra juste penser à stocker quelque part la liste des variables locales à sauver sur un objet, donc modifier les SetLocal...() pour qu'ils enregistrent le nom de leur variable dans une local string au nom bien définie 'list_pvar' par exemple).
Une question me vient à l'esprit : Peut-on accéder aux variables, lorsque le serveur est offline, par le biais d'un fichier (ou autre)?
(comme par exemple avec MySQL, lorsque l'on visionne les enregistrements)
Pour info, on peut accéder aux tables de la BD via Access avec les derniers drivers Microsoft ODBC (6.1.8629.1) pour FoxPro mais on peu les lire avec n'importe quoi qui gère les DBase/xBase.

Jaha Effect
En effet, Jedaï a raison

J'ai eu ce même problème mais pô avec des variables de scripts mais plutôt avec le positionnement d'objets plaçables.

J'ai essayé de positionner une dalle (walkable héhé) exactement au milieu d'une tuile, du genre x=35 & y=45.
Le résultat est que quoi je fasse, en vérifiant avec Leto j'avais toujours des 44.9985441 ou 35.0000001.

Le principe est le même
Citation :
Provient du message de Jaha Effect
Pour info, on peut accéder aux tables de la BD via Access avec les derniers drivers Microsoft ODBC (6.1.8629.1) pour FoxPro mais on peu les lire avec n'importe quoi qui gère les DBase/xBase.

Jaha Effect
je suppose donc, qu'il est possible d'utiliser ces flags sur des sites web. Coup de maître si cela est possible, car Bioware met ainsi hors-jeu tous les systèmes de persistance.

Autre question : As-tu testé, si lors de la deco d'un joueur, un serveur peut enfin enregistrer proprement avec cette db la dernière position? (puis ramener le joueur à cet endroit lors de sa reco)
Le problème de la déco du joueur ne tien pas au système de persistance mais à l'événement OnclientExit car quand cet événement est activé, le PC renvoi une location invalide donc ce que l'on pourra rappeler c'est la dernière location du PC.
Par contre l'utilisation de la BD permet des sauvegarde de location plus fréquente sans faire gonfler démesurément le log et pour cause

Jaha Effect
Code PHP:

// The var name must be unique acrossed the entire database.
// If you want a variable to pertain to a specific player in the game, provide a player object.
void SetCampaignInt     (string sCampaignNamestring sVarNameint nInt,         object oPlayer=OBJECT_INVALID); 
euh ca veut dire quoi unique pour la varname..
ca veut dire unique dans le style si un pj a la variable "reputation" un deuxieme pj devra avoir la variable "reputation2" ?
ou alors ca veut dire unique pour le couple variable/Player..

merci de tester ca mon petit Jaha
si c'est le premier cas je suis triste , si c'est le deuxieme chuis content...

rah et désolé pour l'autre thread bdd , mais de voir tout le monde faire des plans sur la comètes , jai pas pu m'empecher de faire l'avocat du diable...

Sinon le fichier db , t'as essayé de l'ouvrir ? en hexa , en text , appremment on peut l'ouvrir avec Access ?
J'aime bien savoir ce qui y'a dans les entrailles de la bete
bon pdt qu'on y est.. d'autres questions

si l'on replace dans le contexte bdd.. on peut dire que une campagne correspond a une table..

donc a priori pas de liaisons intertable ..

ensuite si une campagne = une table , ben on peut pas modifier ma structure (ajouter les colonnes)

imaginons une table qui servirait pour l'artisanat alchimie
pour 3 ingredients dans une marmitte , on construit une potion avec le blueprint BP.. mais bien sur nous faut aussi une DD pour faire la potion...

ce qui voudrait dire que si on peut pas modifié la structure , on aurait une variable du type = TagIngredient1+TagIngredient2+TagIngredient3 qui donne pour valeur BP+DD
le "+" c'est pour la concatenation..

oue mais le nom de la variable est limité à cb de cars ?

*continue à reflechir aux besoins à la con*

Qui n'a pas eu envie de faire un pnj poseur d'enigme ...
ou il aurait piocher aleatoirement une enigme dans une table...
Est-ce qu'on sais deja combien de ligne contient une table , ou est-ce qu'il va falloir stocker le nb de ligne , dans la premier ligne de la table disons...

*s'en va en vous laissant sur ces bonnes pensées..*
D'après notre testeur officiel, l'excellentissime Jaha, il n'y a pô de limite à la taille de la BD.

Le nombre de caractère doit je pense être limité à 16 mais c'est à vérifier.

Et oui, en effet, la variable doit être unique. Si on utilise StoreCampaignObject et que l'on ajoute deux objets différents au contenaire mais avec le même nom de variable, un des deux objets sera alors perdu.

Ce qui a l'air géant est que l'objet stocké n'a pô besoin d'avoir une entrée dans la palette, c'est à dire qu'un item totalement inconnu du module pourra continuer à vivre sa paisible vie d'objet (magique ou pô) sans être dérangé
MouHAhaAHAaa

J'adore ce truc!

Code PHP:

void main() {
    if (
GetLocalIntGetModule(), "Ready")) {
        
int i 1;
        
object oItem GetFirstItemInInventoryOBJECT_SELF);

        while (
GetIsObjectValidoItem)) {
             
StoreCampaignObject"BaseDeDonnee""Item" IntToStringi), oItem);
             
oItem GetNextItemInInventoryOBJECT_SELF);
             
SpeakString"Item" IntToStringi));
             
++;
             }

        
DeleteCampaignVariable"BaseDeDonnee""Item" IntToStringi));
        
SetCampaignInt"BaseDeDonnee""HowManyItem"1);
        }
    } 
Drak, avant de te lancer dans des plans sur la comète pour utiliser des BDD aussi primitives comme des tables d'ingrédients ou de trésors ou ce genre de truc, apprends qu'il sera bientôt possible de créer des nouveaux .2da et d'y accéder par script en fournissant (le nom du .2da, le numéro de la ligne, le nom de la colonne).... C'est y pas mieux pour faire des tables ça ? ^_^

Ces .2da seront en lecture seule, mais elles ne sont pas prévu pour faire de la persistance, elles sont là pour qu'on puisse enfin faire des tables de répliques pour les clients d'auberges, des tables de toutes sortes pour nous faciliter la vie !!

(En plus on pourra même accéder aux anciens .2da )

[EDIT] Vi moi aussi tout ça me plaît assez, surtout la fonction StockObject()....
L'idée de Drak est intéressante du moment qu'on utilise la BD pour créer non pas des potions ou des armes mais dans la mesure où le PJ souhaite créer ses propres recettes

Dans ce cas alors une table dynamique sera la bienvenue


À part ça, j'ai cru comprendre qu'un module pouvait utiliser un nombre incalculable de bases de donnée différentes.
Vu que les variables sont stockées sans être assignée à un object en particulier (sauf pour les PJ), j'en conclu qu'une bonne méthode pour faire plusieurs coffres (une banque), serait d'avoir autant de BD qu'il y a de coffre.

Une autre méthode, p'tet même préférable est de stocker les objets sous un nom de variable reprenant le TAG du coffre (les TAG des coffres étant tous différents) mais dans une seule BD, ouaip ça serait mieux je pense
Répondre

Connectés sur ce fil

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