Un petit script pour le Puma, dont j'avais parlé il y a un moment, que j'ai testé quelques temps et oublié de publier. Peut-être quelque chose de similaire a déjà été proposé, je n'ai plus trop le temps de suivre le forum, et en fait c'est assez proche du système de Banque proposé par Rat.
Le but : sauvegarder le contenu des placards d'un module d'un reboot sur l'autre, par le biais du Puma, pour permettre aux joueurs de stocker leurs objets chez eux (notamment).
Le principe : deux scripts à placer sur les événements onClose et onOpen d'un placeable avec inventaire, l'un qui sauvegarde le contenu à la fermeture du coffre, l'autre qui le recrée si un reboot l'a vidé.
Remarques : j'ai essayé de ne pas faire un système trop gourmand en ressources, puisque mon objectif était de l'appliquer à une centaine de placeables différents sur mon module. Les variables sont donc concaténées autant que possible, les scripts appelés uniquement lorsqu'un joueur s'intéresse au contenu d'une armoire, et j'utilise les coordonnées du placard comme lien avec son inventaire, pour faciliter le mapping (les mappeurs n'ont pas à donner un tag spécifique à chaque placard, ce serait beaucoup trop contraignant). Désavantage à savoir : si un placeable est déplacé ou si son tag ou le tag de sa zone est modifié, son contenu est perdu (mais quand on le sait, ça ne pose pas de problème).
Les scripts :
box_create.nss, à placer sur le onOpen de l'objet (le mieux est de faire un objet personnalisé pour pouvoir en placer d'autres facilement) :
#include "PWUM_functions"
void main()
{
object oBox = OBJECT_SELF;
//On ne recree le contenu du placard qu'une fois par reboot, pour eviter les duplications
if (GetLocalInt(oBox, "Respawned") == TRUE)
return;
else
SetLocalInt(oBox, "Respawned", TRUE);
int iNbStringInv = 1; //Nombre de strings necessaires au stockage de l'inventaire
string sResRef;
int iStack;
//Identification 'unique' de la boite
vector vBox = GetPosition(oBox);
string sBox = GetTag(oBox) + "~" + GetTag(GetArea(oBox)) + "~" + FloatToString(vBox.x) + "~" + FloatToString(vBox.y) + "~" + FloatToString(vBox.z);
string sInv = GetPWUMString(sBox + "~" + IntToString(iNbStringInv));
DeletePWUMString(sBox + "~" + IntToString(iNbStringInv));
while (sInv != "")
{
while (sInv != "")
{
sResRef = GetStringLeft(sInv, FindSubString(sInv, "@"));
sInv = GetStringRight(sInv, GetStringLength(sInv) - FindSubString(sInv, "@") - 1);
iStack = StringToInt(GetStringLeft(sInv, FindSubString(sInv, "~")));
sInv = GetStringRight(sInv, GetStringLength(sInv) - FindSubString(sInv, "~") - 1);
CreateItemOnObject(sResRef, oBox, iStack);
}
iNbStringInv++;
sInv = GetPWUMString(sBox + "~" + IntToString(iNbStringInv));
DeletePWUMString(sBox + "~" + IntToString(iNbStringInv));
}
}
box_close.nss, à placer sur le onClose de l'objet
#include "PWUM_functions"
void main()
{
object oBox = OBJECT_SELF;
string sInv;
int iNbStringInv = 1; //Nombre de strings necessaires au stockage de l'inventaire
//Identification 'unique' de la boite
vector vBox = GetPosition(oBox);
string sBox = GetTag(oBox) + "~" + GetTag(GetArea(oBox)) + "~" + FloatToString(vBox.x) + "~" + FloatToString(vBox.y) + "~" + FloatToString(vBox.z);
object oItem = GetFirstItemInInventory();
//Boucle de stockage des objets en variable persistante
//Format du nom de variable : Tagduplacard~Tagdelazone~Coordonneesduplacard~Indicedelavariable
//--Les chaines de stockages etant limitees a 512 caracteres, elles sont decoupees et indicees par Indicedelavariable
//Format du contenu de variable : Resrefdelitem1@Nombred'item1empiles~Resrefdel'item2@Nombred'item2empiles~etc
while (GetIsObjectValid(oItem))
{
if (GetStringLength(sInv + GetResRef(oItem) + "@" + IntToString(GetNumStackedItems(oItem)) + "~") < 512)
{
sInv = sInv + GetResRef(oItem) + "@" + IntToString(GetNumStackedItems(oItem)) + "~";
}
else
{
SetPWUMString(sBox + "~" + IntToString(iNbStringInv), sInv);
sInv = GetResRef(oItem) + "@" + IntToString(GetNumStackedItems(oItem)) + "~";
iNbStringInv++;
}
oItem = GetNextItemInInventory();
}
if ((iNbStringInv == 1) && (sInv != ""))
SetPWUMString(sBox + "~1", sInv);
//On detruit les variables persistantes si l'armoire est vide, pour faire un peu de menage
if ((iNbStringInv == 1) && (sInv == ""))
DeletePWUMString(sBox + "~1");
}
Bien sûr, il faut un serveur utilisant le système Puma.
Encore merci à Iridan et Rat pour leur Puma qui me sert tous les jours, et j'espère que ce petit script pourra être utile à certains.