[PUMA] Placards persistants.

Répondre
Partager Rechercher
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) :
Code PHP:

#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(sInvFindSubString(sInv"@"));
      
sInv GetStringRight(sInvGetStringLength(sInv) - FindSubString(sInv"@") - 1);
      
iStack StringToInt(GetStringLeft(sInvFindSubString(sInv"~")));
      
sInv GetStringRight(sInvGetStringLength(sInv) - FindSubString(sInv"~") - 1);
      
CreateItemOnObject(sResRefoBoxiStack);
    }
    
iNbStringInv++;
    
sInv GetPWUMString(sBox "~" IntToString(iNbStringInv));
    
DeletePWUMString(sBox "~" IntToString(iNbStringInv));
  }

box_close.nss, à placer sur le onClose de l'objet
Code PHP:

#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.
__________________

Serveur francophone Faltazia,
serveur 100% roleplay.
Gadgio, je sais pas si tu te rappel, RAT avait fait une petite modif parceque la banque ne pouvais pas stoquer plus de 500000 Po. La modif créé donc un nouveau tas de pièces d'or dans ce cas

Juste pour te prévenir, je sais pas si tu en a tenu compte.

Jaha Effect
Code PHP:

void bank_Create_inv(object oPC,object oCoffre)
{

            
int icompt=GetFlagInt(oPC,"BANQUE_COMPTEUR_INV");
                 
int i=0;
                 
string sauto;

                 
string snom,sit,sitem,sTemp;
                 
int itest=0;
                 
int nTemp=0;

                 
int n=0;

      
// on va recreer l'or que possede le PC dans sa banque.
      
if (GetFlagOr(oPC,"BANQUE_OR_PC")<=50000)
      
CreateItemOnObject("nw_it_gold001",oCoffre,GetFlagOr(oPC,"BANQUE_OR_PC"));
      else
      {   
int ig=GetFlagOr(oPC,"BANQUE_OR_PC");
          for(;
ig>=0;ig=ig-50000)
         
CreateItemOnObject("nw_it_gold001",oCoffre,ig);

      }
      
// grace au compteur on va deconcatener toute la chaine pour recreer tout
         // l'inventaire du coffre quand le pc va ouvrir le coffre.
                 
for (;i<=icompt;i++)
                  {

           
sitem=GetFlagInv (oPC,"BANQUE_ITEMNOM_PC_" IntToString(i));

                   
itest=GetStringLength(sitem);
                    while ((
nTemp=FindSubString(sitem,"$"))>=0)
                      {
                      
sTemp GetStringLeft(sitemnTemp);
                      
int irech=FindSubString(sTemp,"°");
                     
int ilen=GetStringLength(sTemp);
                     
int iStack=StringToInt(GetStringRight(sTemp,ilen-irech-1));
                     
sTemp=GetStringLeft(sTempirech);
                    
CreateItemOnObject(sTemp,oCoffre,iStack);

                     
sitem GetStringRight(sitemitest nTemp);
                     
itest=GetStringLength(sitem);
                     }

                }



En gros c'est toute ma fonction de création d'inventaire que j'avais légèrement remodifier pour que si cela dépasse 50000 po, il gère le fait de recréer un item pièce d'or
voilouu
Tiens, je savais pas qu'il y avait une limite à 50000. L'or est un cas particulier ou on peut aussi empiler plus de 50000 unités d'un autre objet ? (Les flèches sont limitées à 100, les potions à 10, je crois... ya d'autres trucs qui s'empilent ?) Sinon je rajouterai un cas particulier quand le iStack dépasse 50k, mais ça doit vraiment être exceptionnel (à part sur des modules avec des gens très riches ? j'ai pas le cas sur Faltazia, mais on peut rajouter les quelques lignes pour blinder, ce sera plus propre ). *Verra ça taleur*
Sisi tu as une limite pour l'or, je ne le savais pas non plus. Et c'est quand une personne me disait qu'ill y avait un bug sur mon script de banque et que j'ai montré que c'était pas un bug du script mais une limitation de bioware. Alors je suis passé outre comme j'aime si faire *a déjà contourné plusieurs fois les limitations biowares*

Donc en clair, pour les autres items , ce n'est pas grave par le fait que toi même tu ne peux pas dépasser le stack.

Le soucie de l'or, c'est que dans ton inventaire, ce n'est qu'un integer et pas dans un coffre, donc voilà, normalement cela n'arrivera pas sur les autres.


Vi y a plusieurs items qui s'empilent d'ou le fait que j'ai du gérer les stacks. C'est ce qu'i ma pris le plus la tête et le fait d'être limité à 512 strings aussi.

Enfin voila, avec ma fonction, plus rien ne t'es limité . Et là ou je suis le plus fier, c'est que c'est l'un des seuls systèmes de banques qui gèrent les stacks .

Mais pour l'or, non ce n'est pas rare de dépasser les 50000, surtout quant tu es haut level. Mais même si pour ton module c'est rare, je pense qu'il vaudrait mieux que tu penses à cette sécurité pour éviter les gueulantes de tes joueurs mais ce n'est que mon avis
le jour ou on aura 50000 piece d'or à faltazya .. on a le temps

bon boulot au fait pour faltazya , l'idée de base est géniale , j'adore l'ambiance politique du mod et ce mystère qui plane ( le fléau)
Répondre

Connectés sur ce fil

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