Système du sac étherer

Répondre
Partager Rechercher
bonjour a tous, voilà j'utilisie un systeme de mort qui inclut la perte d'objet qui copie/coller l'inventaire du pj dans un placable contendant...

tout fonctionne pour le mieux, mais a l'ordre du jour deux problemes majeurs apparaîssent :

- Le premiers, c'est que le joueur perd la totalité de ses items (sauf ce qu'il porte) lors de sa mort, normale me direz vous , mais très ennuyeux, il aurait fallu prévoir un petit sac étherée.. (autrement dit un petit sac qui persiste lui et son contenue dans l'inventaire du joueur pour pouvoir y garder certains objets précieux; clées, carte, item unique etc...)

- Le deuxième, bcp moins important, c'est que les contendants "portable" (genre sac et coffret) sont détruit lors du copier/coller vers le placable contendant... leur contenue et nés en moins copier dans le placables.

Je ne suis malheureusement pas capable de faire c'est ajouts moi meme, ca fait plusieur lune que je suis callé decu, un bon coup de pied ne serait pas de refus ..

voici l'include que j'utilise :

Code PHP:

void SetUnlootableobject oPCobject oCorpse);
void SetLootablePersoobject oPCfloat fDuration);
void SetUnlootableobject oPCobject oCorpse)
{
    if(
GetIsObjectValid(oCorpse) && GetIsPC(oPC) && GetLocalInt(oPC,"LOOTABLE") == 1)
    {
        
location lCorpseLoc GetLocation(oCorpse);
        
//:: Etape 1 - Vider le corps et rendre ses objets au joueur
        
object oItem GetFirstItemInInventory(oCorpse);

        while(
GetIsObjectValid(oItem))
        {
            
//..rendre au joueur..

            
CopyItem(oItem,oPC);
            
//..et vider le corps..
            
DestroyObject(oItem);
            
oItem GetNextItemInInventory(oCorpse);
        }
        
//:: Etape 2 - Detruire le corps vide
        
DestroyObject(oCorpse);
        
SetLocalInt(oPC,"LOOTABLE",0);
    }
    else
    {
        if(
GetIsObjectValid(oCorpse) != TRUE)
            
SendMessageToAllDMs("Erreur - Le corps du PJ loote est incorrect.");
        if(
GetIsPC(oPC) != TRUE)
            
SendMessageToAllDMs("Erreur - Le joueur a delooter n'est pas un joueur.");
        if(
GetLocalInt(oPC,"LOOTABLE") != 1)
            
SendMessageToAllDMs("Erreur - Le joueur a delooter n'est pas loote.");
    }
}
void SetLootablePerso(object oPCfloat fDuration)
{
    if(
GetIsPC(oPC) && GetIsDead(oPC))
    {
        
location lPCLoc GetLocation(oPC);
        
//:: Etape 1 - Stoper les actions du joueur
        
AssignCommand(oPC,ClearAllActions());
        
//:: Etape 2 - Creer le corps
        
vector vPCLoc GetPositionFromLocation(GetLocation(oPC));
        
vector vDecalage Vector(0.0f,1.0f,0.0f);
        
vector vCorpsePosition vPCLoc vDecalage;
        
location lCorpseLoc Location(GetArea(oPC),vCorpsePosition,GetFacing(oPC));

CreateObject(OBJECT_TYPE_PLACEABLE,"corpsallumer",lCorpseLoc,FALSE);
        
object oCorpse GetNearestObjectByTag("corpsallumer",oPC);
        
//:: Etape 3 - Remplir le corps et vider le joueur

        
object oItem GetFirstItemInInventory(oPC);

        while(
GetIsObjectValid(oItem))
        {
            
//..remplir le corps..

            
CopyItem(oItem,oCorpse);
            
//..et vider le joueur..
            
DestroyObject(oItem);
            
oItem GetNextItemInInventory(oPC);
        }
        
SetLocalInt(oPC,"LOOTABLE",1);
        
DelayCommand(fDuration,SetUnlootable(oPC,oCorpse));
    }
    else
    {
        
SendMessageToAllDMs("Erreur - Le corps a creer n'est pas mort ou n'est pas un joueur");
    }

merci de votre aide
__________________
"La raison est seule à justifier les sciences alors que la foi est seule à justifer la religion"
Alors pour ton premier pb, je pense qu'il suffit de creer un sac special et de tester son tag pour ne pas le traiter et ensuite peut etre rajouter une variable locale sur les objets que tu mets dedans ...
Tiens plus simple encore cree un sac 'Ethere' sur le quel tu mets une variable locale par ex un 'PASMETTREDANSLOOT' à 1 (tu peux le faire dans la creation de l'objet sur Aurora)
Tous les objets que tu mets dedans tu leur rajoutes la meme variable locale à 1 quand tu les enleves tu supprimes la variable locale. Et du coup dans ton code sur chaque item avant de copier tu verifie qu'ils n'ont pas cette variable de positionner ca devient un truc du style
Code PHP:

        while(GetIsObjectValid(oItem))
        {
            
// si variable PASMETTREDANSLOOT n'est pas positionne on copie
            
if (GetLocalInt(oItem,"PASMETTREDANSLOOT") ==0)
            {
                
//..remplir le corps..
                
CopyItem(oItem,oCorpse);
                
//..et vider le joueur..
                
DestroyObject(oItem);
            }
            
oItem GetNextItemInInventory(oCorpse);
        } 
Voila ca me semble pas mal

Bon maintenant ton 2nd pb c'est normal c'est la definition meme de la fonction CopyItem
Citation :
duplicates the item and returns a new object
returns the new item
returns OBJECT_INVALID for non-items.
can only copy empty item containers. will return OBJECT_INVALID if oItem contains other items.
if it is possible to merge this item with any others in the target location, then it will do so and return the merged object.
En gros il ne copie qe les sacs vide s'il y a qqchose dedans il copie pas le sac...
Essayes plutot avec CopyObject
ca donnerais un truc du style
Code PHP:

void SetLootablePerso(object oPCfloat fDuration)
{
    if(
GetIsPC(oPC) && GetIsDead(oPC))
    {
        
location lPCLoc GetLocation(oPC);
        
//:: Etape 1 - Stoper les actions du joueur
        
AssignCommand(oPC,ClearAllActions());
        
//:: Etape 2 - Creer le corps
        
vector vPCLoc GetPositionFromLocation(GetLocation(oPC));
        
vector vDecalage Vector(0.0f,1.0f,0.0f);
        
vector vCorpsePosition vPCLoc vDecalage;
        
location lCorpseLoc Location(GetArea(oPC),vCorpsePosition,GetFacing(oPC));

CreateObject(OBJECT_TYPE_PLACEABLE,"corpsallumer",lCorpseLoc,FALSE);
        
object oCorpse GetNearestObjectByTag("corpsallumer",oPC);
        
//:: Etape 3 - Remplir le corps et vider le joueur

        
object oItem GetFirstItemInInventory(oPC);

        while(
GetIsObjectValid(oItem))
        {
            
// si variable PASMETTREDANSLOOT n'est pas positionne on copie
            
if (GetLocalInt(oItem,"PASMETTREDANSLOOT") ==0)
            {
                
//..remplir le corps..
                
CopyObject(oItemlCorpseLocoCorpseGetTag(oItem));
                
//..et vider le joueur..
                
DestroyObject(oItem);
            }
            
oItem GetNextItemInInventory(oPC);
        }
        
SetLocalInt(oPC,"LOOTABLE",1);
        
DelayCommand(fDuration,SetUnlootable(oPC,oCorpse));
    }
    else
    {
        
SendMessageToAllDMs("Erreur - Le corps a creer n'est pas mort ou n'est pas un joueur");
    }

Pas sur que ca fonctionne essayes et dis moi
Par contre attention contrairement au CopyItem ou tu peux demander a ce que les variables locales de l'objet soient copié la je ne sais pas si c'est le cas... a tester si tu as des variables sur des objets que tu veux pas perdre.
salut, merci d'avoir répondu (ps j'ai été coupé d'internet pendant quelque temps) enfin me revoila..

est ce que tu pourrais me donner quelque éclaircissement, je me démerdouille coté script mais je n'ai aucune théorie..

je ne trouve meme pas comment mettre la variable sur un item..

ca va presque faire un mois que je suis bloqué sur ce probleme..

merci d'avance

Ahma

Pour fixer une variable:
- Tu édites les propriétés de l'objet.
- Tu vas sur l'onglet Description.
- Tu cliques sur le bouton Variables.

La fenêtre des variables s'ouvre.
* Nom: le nom de ta variable
* Type: le type de la variable
* Valeur: la valeur que tu veux lui donner.

Et voilà.
Comme tu aime pas les variables, tu peux aussi tester sur le TAG de l'objet.

Je te la poste ici:

Code PHP:

void SetLootablePerso(object oPCfloat fDuration)
{
    if(
GetIsPC(oPC) && GetIsDead(oPC))
    {
        
location lPCLoc GetLocation(oPC);
        
//:: Etape 1 - Stoper les actions du joueur
        
AssignCommand(oPC,ClearAllActions());
        
//:: Etape 2 - Creer le corps
        
vector vPCLoc GetPositionFromLocation(GetLocation(oPC));
        
vector vDecalage Vector(0.0f,1.0f,0.0f);
        
vector vCorpsePosition vPCLoc vDecalage;
        
location lCorpseLoc Location(GetArea(oPC),vCorpsePosition,GetFacing(oPC));

        
CreateObject(OBJECT_TYPE_PLACEABLE,"corpsallumer",lCorpseLoc,FALSE);
        
object oCorpse GetNearestObjectByTag("corpsallumer",oPC);
        
//:: Etape 3 - Remplir le corps et vider le joueur

        
object oItem GetFirstItemInInventory(oPC);
        
string sTagItem;

        while(
GetIsObjectValid(oItem))
        {
          
sTagItem GetTag(oItem);
          if (
sTagItem "SACETHER")  // Le tag de ton sac
            
{oItem GetNextItemInInventory(oPC);}
          else
            {
             
//..remplir le corps..
             
CopyItem(oItem,oCorpse);
             
//..et vider le joueur..
             
DestroyObject(oItem);
             
oItem GetNextItemInInventory(oPC);
            }
        }
        
SetLocalInt(oPC,"LOOTABLE",1);
        
DelayCommand(fDuration,SetUnlootable(oPC,oCorpse));
    }
    else
    {
        
SendMessageToAllDMs("Erreur - Le corps a creer n'est pas mort ou n'est pas un joueur");
    }

Par contre, je viens de me rendre compte d'un bug à venir. Tu ne copie pas l'objet, on est d'accord. Mais le contenu, lui, sera vraisemblablement copié dans le corps. Les objets qui se trouverons dans le sac seront dupliqués. Théoriquement. Faudrait tester.
ben c'est pour cela que je parlais d'une variable locale sur les objets qui sont dans le sac...
Mais par contre faut voir si on peut gerer l'entree et la sortie des objets dans un sacs ... j'ai pas encore essaye ca...
arg je crois que j'ai trouve...

Bon du coup t'as pas besoins de gerer des variables locales!
je reprends le code de Archamedes_Fr et je te commente l'endroit ou changer...

Code PHP:

void SetLootablePerso(object oPCfloat fDuration)
{
    if(
GetIsPC(oPC) && GetIsDead(oPC))
    {
        
location lPCLoc GetLocation(oPC);
        
//:: Etape 1 - Stoper les actions du joueur
        
AssignCommand(oPC,ClearAllActions());
        
//:: Etape 2 - Creer le corps
        
vector vPCLoc GetPositionFromLocation(GetLocation(oPC));
        
vector vDecalage Vector(0.0f,1.0f,0.0f);
        
vector vCorpsePosition vPCLoc vDecalage;
        
location lCorpseLoc Location(GetArea(oPC),vCorpsePosition,GetFacing(oPC));

        
CreateObject(OBJECT_TYPE_PLACEABLE,"corpsallumer",lCorpseLoc,FALSE);
        
object oCorpse GetNearestObjectByTag("corpsallumer",oPC);
        
//:: Etape 3 - Remplir le corps et vider le joueur

        
object oItem GetFirstItemInInventory(oPC);
        
string sTagItem;

        while(
GetIsObjectValid(oItem))
        {
          
sTagItem GetTag(oItem);
          if (
sTagItem "SACETHER")  // Le tag de ton sac
            
{
               
// c la que ca se complique ;)
               // si tu es ici c'est que tu es sur le sac.
               // un sac ca a aussi un inventaire
               // et comme le GetNextInInventory(oPC) va lui aussi scruter le sac
               // il suffit donc de scruter l'inventaire du sac en meme temps dans une boucle.
               // en sortant de la boucle on a fini de scruter l'inventaire du sac 
               // et comme on a avancer aussi dans l'inventaire du PC
               // on a alors pas traiter les objets qui sont dans le sac
               
object oBag oItem;
               
// ex dans les 2 lignes suivantes on a scrute l'objet suivant de l'inventaire du PJ
               // et le premier objet de l'inventaire du sac et c normalement les 2 memes etc...
               
oItem GetNextItemInInventory(oPC);
               
object oItemInBag GetFirstItemInInventory(oBag);
               
// et on sort quand il n'y a plus d'objet valide dans le sac et la 
               // on se retrouve sur l'objet suivant en dehors du sac avec le GetNextItemInventory(oPC)
               
while(GetIsObjectValid(oItemInBag))
                {
                     
oItem GetNextItemInInventory(oPC);
                     
oItemInBag GetNextItemInInventory(oBag);
                }

            }
          else
            {
             
//..remplir le corps..
             
CopyItem(oItem,oCorpse);
             
//..et vider le joueur..
             
DestroyObject(oItem);
             
oItem GetNextItemInInventory(oPC);
            }
        }
        
SetLocalInt(oPC,"LOOTABLE",1);
        
DelayCommand(fDuration,SetUnlootable(oPC,oCorpse));
    }
    else
    {
        
SendMessageToAllDMs("Erreur - Le corps a creer n'est pas mort ou n'est pas un joueur");
    }

J'ai parcouru rapidement les codes, Ahmadabdath, et j'utilise aussi le système de double boule pour identifier ce qui est dans un sac, donc cela doit fonctionner.

(tu m'a dit de venir aider mais il me semble qu'une solution est trouvée )
euh je crois qu'il faudra quand meme rajouter un test sur les sacs en general pour pouvoir les copier sinon on ne les copies pas mais on copie que leur inventaire...

Il faut rajouter une boucle de copie suivant le type...
et hop la total pour ne pas etre embeter avec les sacs dits normaux (c-a-d ceux qui sont pas etherés )

Code PHP:

void SetLootablePerso(object oPCfloat fDuration)
{
    if(
GetIsPC(oPC) && GetIsDead(oPC))
    {
        
location lPCLoc GetLocation(oPC);
        
//:: Etape 1 - Stoper les actions du joueur
        
AssignCommand(oPC,ClearAllActions());
        
//:: Etape 2 - Creer le corps
        
vector vPCLoc GetPositionFromLocation(GetLocation(oPC));
        
vector vDecalage Vector(0.0f,1.0f,0.0f);
        
vector vCorpsePosition vPCLoc vDecalage;
        
location lCorpseLoc Location(GetArea(oPC),vCorpsePosition,GetFacing(oPC));

        
CreateObject(OBJECT_TYPE_PLACEABLE,"corpsallumer",lCorpseLoc,FALSE);
        
object oCorpse GetNearestObjectByTag("corpsallumer",oPC);
        
//:: Etape 3 - Remplir le corps et vider le joueur

        
object oItem GetFirstItemInInventory(oPC);
        
string sTagItem;

        while(
GetIsObjectValid(oItem))
        {
          
sTagItem GetTag(oItem);
          if (
sTagItem "SACETHER")  // Le tag de ton sac
            
{
               
// c la que ca se complique 
               // si tu es ici c'est que tu es sur le sac.
               // un sac ca a aussi un inventaire
               // et comme le GetNextInInventory(oPC) va lui aussi scruter le sac
               // il suffit donc de scruter l'inventaire du sac en meme temps dans une boucle.
               // en sortant de la boucle on a fini de scruter l'inventaire du sac 
               // et comme on a avancer aussi dans l'inventaire du PC
               // on a alors pas traiter les objets qui sont dans le sac
               
object oBag oItem;
               
// ex dans les 2 lignes suivantes on a scrute l'objet suivant de l'inventaire du PJ
               // et le premier objet de l'inventaire du sac et c normalement les 2 memes etc...
               
oItem GetNextItemInInventory(oPC);
               
object oItemInBag GetFirstItemInInventory(oBag);
               
// et on sort quand il n'y a plus d'objet valide dans le sac et la 
               // on se retrouve sur l'objet suivant en dehors du sac avec le GetNextItemInventory(oPC)
               
while(GetIsObjectValid(oItemInBag))
                {
                     
oItem GetNextItemInInventory(oPC);
                     
oItemInBag GetNextItemInInventory(oBag);
                }

            }
          else
            {
                
//..remplir le corps..
                //CopyItem(oItem,OBJECT_SELF);
                // l'avantage du CopyObject c'est qu'il copie tous les objets comme le CopyItem
                // mais en plus quand il copie un sac, il le copie avec son contenue (en plus ca doit etre plus rapide ;) )
                
CopyObject(oItemlCaisseOBJECT_SELF);
                if (
GetBaseItemType(oItem) == BASE_ITEM_LARGEBOX)
                {
                    
// Du coup c pour cela qu'il faut pas copier les elements du sacs sinon on les creera en double
                    // d'ou le meme style de boucle qu'au dessus pour reprendre apres avoir avoir scruter les Items du sacs
                    
object oBag oItem;
                    
oItem GetNextItemInInventory(oPC);
                    
object oItemInBag GetFirstItemInInventory(oBag);
                    while(
GetIsObjectValid(oItemInBag))
                    {
                            
oItem GetNextItemInInventory(oPC);
                            
oItemInBag GetNextItemInInventory(oBag);
                    }
                    
//..et vider le joueur..
                    
DestroyObject(oBag);
                }
                else
                {
                    
//..et vider le joueur..
                    
DestroyObject(oItem);
                    
oItem GetNextItemInInventory(oPC);
                }
            }
        }
        
SetLocalInt(oPC,"LOOTABLE",1);
        
DelayCommand(fDuration,SetUnlootable(oPC,oCorpse));
    }
    else
    {
        
SendMessageToAllDMs("Erreur - Le corps a creer n'est pas mort ou n'est pas un joueur");
    }

Meric pour tout ces aides Garrath c'est vraiment géniale

Y a juste un petit choua de probleme c'est que j'arrive pas à terminer le script

Est-ce que sur ta bonté je pourrais te demander de donner le morceau de script complet stp..?

Code PHP:

 // c la que ca se complique 
               // si tu es ici c'est que tu es sur le sac.
               // un sac ca a aussi un inventaire
               // et comme le GetNextInInventory(oPC) va lui aussi scruter le sac
               // il suffit donc de scruter l'inventaire du sac en meme temps dans une boucle.
               // en sortant de la boucle on a fini de scruter l'inventaire du sac 
               // et comme on a avancer aussi dans l'inventaire du PC
               // on a alors pas traiter les objets qui sont dans le sac 
Bien enfaite le script est peut-etre complet, je ne parles pas vraiment en connaissance de cause, à vrai dire je patauge pas mal.. mais en tout cas il ne se compile pas... je refais le test et je post l'erreur..
oui c'est ce que je fais, le loot ce compile, mais une fois revenu sur mon scritp de mort, là ou j'ai placé l'include du loot; au moment de sauvegardé, il ouvre le script du loot et indique ceci :

loot.nss(57): ERREUR : NON INTEGER EXPRESSION WHERE INTEGER REQUIRED


ca correspond à la ligne :
Code PHP:

    if (sTagItem "SACETHER")  // Le tag de ton sac 

Je te copie les deux parties, tu remplaces la totalité du script.
Code PHP:

void SetUnlootableobject oPCobject oCorpse);
void SetLootablePersoobject oPCfloat fDuration);
void SetUnlootableobject oPCobject oCorpse)
{
    if(
GetIsObjectValid(oCorpse) && GetIsPC(oPC) && GetLocalInt(oPC,"LOOTABLE") == 1)
    {
        
location lCorpseLoc GetLocation(oCorpse);
        
//:: Etape 1 - Vider le corps et rendre ses objets au joueur
        
object oItem GetFirstItemInInventory(oCorpse);

        while(
GetIsObjectValid(oItem))
        {
            
//..rendre au joueur..

            
CopyItem(oItem,oPC);
            
//..et vider le corps..
            
DestroyObject(oItem);
            
oItem GetNextItemInInventory(oCorpse);
        }
        
//:: Etape 2 - Detruire le corps vide
        
DestroyObject(oCorpse);
        
SetLocalInt(oPC,"LOOTABLE",0);
    }
    else
    {
        if(
GetIsObjectValid(oCorpse) != TRUE)
            
SendMessageToAllDMs("Erreur - Le corps du PJ loote est incorrect.");
        if(
GetIsPC(oPC) != TRUE)
            
SendMessageToAllDMs("Erreur - Le joueur a delooter n'est pas un joueur.");
        if(
GetLocalInt(oPC,"LOOTABLE") != 1)
            
SendMessageToAllDMs("Erreur - Le joueur a delooter n'est pas loote.");
    }
}
void SetLootablePerso(object oPCfloat fDuration)
{
    if(
GetIsPC(oPC) && GetIsDead(oPC))
    {
        
location lPCLoc GetLocation(oPC);
        
//:: Etape 1 - Stoper les actions du joueur
        
AssignCommand(oPC,ClearAllActions());
        
//:: Etape 2 - Creer le corps
        
vector vPCLoc GetPositionFromLocation(GetLocation(oPC));
        
vector vDecalage Vector(0.0f,1.0f,0.0f);
        
vector vCorpsePosition vPCLoc vDecalage;
        
location lCorpseLoc Location(GetArea(oPC),vCorpsePosition,GetFacing(oPC));

        
CreateObject(OBJECT_TYPE_PLACEABLE,"corpsallumer",lCorpseLoc,FALSE);
        
object oCorpse GetNearestObjectByTag("corpsallumer",oPC);
        
//:: Etape 3 - Remplir le corps et vider le joueur

        
object oItem GetFirstItemInInventory(oPC);
        
string sTagItem;

        while(
GetIsObjectValid(oItem))
        {
          
sTagItem GetTag(oItem);
          if (
sTagItem "SACETHER")  // Le tag de ton sac
            
{
               
// c la que ca se complique
               // si tu es ici c'est que tu es sur le sac.
               // un sac ca a aussi un inventaire
               // et comme le GetNextInInventory(oPC) va lui aussi scruter le sac
               // il suffit donc de scruter l'inventaire du sac en meme temps dans une boucle.
               // en sortant de la boucle on a fini de scruter l'inventaire du sac
               // et comme on a avancer aussi dans l'inventaire du PC
               // on a alors pas traiter les objets qui sont dans le sac
               
object oBag oItem;
               
// ex dans les 2 lignes suivantes on a scrute l'objet suivant de l'inventaire du PJ
               // et le premier objet de l'inventaire du sac et c normalement les 2 memes etc...
               
oItem GetNextItemInInventory(oPC);
               
object oItemInBag GetFirstItemInInventory(oBag);
               
// et on sort quand il n'y a plus d'objet valide dans le sac et la
               // on se retrouve sur l'objet suivant en dehors du sac avec le GetNextItemInventory(oPC)
               
while(GetIsObjectValid(oItemInBag))
                {
                     
oItem GetNextItemInInventory(oPC);
                     
oItemInBag GetNextItemInInventory(oBag);
                }

            }
          else
            {
                
//..remplir le corps..
                //CopyItem(oItem,OBJECT_SELF);
                // l'avantage du CopyObject c'est qu'il copie tous les objets comme le CopyItem
                // mais en plus quand il copie un sac, il le copie avec son contenue (en plus ca doit etre plus rapide <img src="ubb/wink.gif" border="0" alt=""> )
                
CopyObject(oItemlCaisseOBJECT_SELF);
                if (
GetBaseItemType(oItem) == BASE_ITEM_LARGEBOX)
                {
                    
// Du coup c pour cela qu'il faut pas copier les elements du sacs sinon on les creera en double
                    // d'ou le meme style de boucle qu'au dessus pour reprendre apres avoir avoir scruter les Items du sacs
                    
object oBag oItem;
                    
oItem GetNextItemInInventory(oPC);
                    
object oItemInBag GetFirstItemInInventory(oBag);
                    while(
GetIsObjectValid(oItemInBag))
                    {
                            
oItem GetNextItemInInventory(oPC);
                            
oItemInBag GetNextItemInInventory(oBag);
                    }
                    
//..et vider le joueur..
                    
DestroyObject(oBag);
                }
                else
                {
                    
//..et vider le joueur..
                    
DestroyObject(oItem);
                    
oItem GetNextItemInInventory(oPC);
                }
            }
        }
        
SetLocalInt(oPC,"LOOTABLE",1);
        
DelayCommand(fDuration,SetUnlootable(oPC,oCorpse));
    }
    else
    {
        
SendMessageToAllDMs("Erreur - Le corps a creer n'est pas mort ou n'est pas un joueur");
    }

Citation :
Provient du message de Ahmadabdath
oui c'est ce que je fais, le loot ce compile, mais une fois revenu sur mon scritp de mort, là ou j'ai placé l'include du loot; au moment de sauvegardé, il ouvre le script du loot et indique ceci :

loot.nss(57): ERREUR : NON INTEGER EXPRESSION WHERE INTEGER REQUIRED


ca correspond à la ligne :
Code PHP:

    if (sTagItem "SACETHER")  // Le tag de ton sac 

oups dsl il manque un =
Il faut ecrire
Code PHP:

if (sTagItem == "SACETHER"
Sinon attention la fonction qui recopie les elements du lootable vers le PJ ne gere pas les sacs correctement...
Je te la refait comme la seconde fonction et je te reposte le tout...
maintenant il y en a une erreur à la ligne 87 :

Code PHP:

          CopyObject(oItemlCaisseOBJECT_SELF); 

Et l'erreur : lootsac.nss(87): ERREUR : VARIABLE DEFINED WITHOUT TYPE


merci de votre aide en tout cas ^^



Voila j'ai refait le code completement.
Ca me parait plus simple a lire et a comprendre comme cela.

J'ai creer une fonction TransfererInventaire qui comme son nom l'indique transfer l'inventaire d'un objet source vers un objet destinataire
J'ai un peu modifier l'ordre du test pour le sac non copiable, car je me suis dit que ca servait a rien de tester le tag sur tous les objets autant le faire que sur ceux qui sont des sacs

Code PHP:

void SetUnlootableobject oPCobject oCorpse);
void SetLootablePersoobject oPCfloat fDuration);

const 
string A_PAS_COPIER "SACETHER";

//::///////////////////////////////////////////////
//:: Name      TransfererInventaire
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Tranfere l'inventaire de l'objet oSource vers
l'inventaire de l'objet oDestinataire.
Cette procedure gere la copie des sacs qui se
trouve dans les inventaires.

A noter : ne copie pas l'objet dont le nom
est defini dans la constante A_PAS_COPIER
*/
//:://////////////////////////////////////////////
//:: Created By: Garrath
//:: Created On:
//:://////////////////////////////////////////////
void TransfererInventaire(object oSourceobject oDestinataire  OBJECT_SELF)
{
    
location lDestinataire GetLocation(oDestinataire);
    
string sTagItem;
    
// Verification si la source et le destinataire ont des inventaires
    
if (!GetHasInventory(oSource))
        return;
    if (!
GetHasInventory(oDestinataire))
        return;
        
    
object oItem GetFirstItemInInventory(oSource);
    while(
GetIsObjectValid(oItem))
    {
        if (
GetBaseItemType(oItem) == BASE_ITEM_LARGEBOX)
        {
            
// il faut pas copier les elements du sacs sinon on les creera en double
            
object oBag oItem;
            
oItem GetNextItemInInventory(oSource);
            
object oItemInBag GetFirstItemInInventory(oBag);
            while(
GetIsObjectValid(oItemInBag))
            {
                
oItem GetNextItemInInventory(oSource);
                
oItemInBag GetNextItemInInventory(oBag);
            }
            
sTagItem GetTag(oBag);
            if (
sTagItem != A_PAS_COPIER)
            {
                
//..Copier le sac..
                
CopyObject(oBaglDestinataireoDestinataire);
                
//..et vider le source..
                
DestroyObject(oBag);
            }
        }
        else
        {
            
//..remplir le destinataire...
            
CopyObject(oItemlDestinataireoDestinataire);
            
//..et vider le source..
            
DestroyObject(oItem);
            
oItem GetNextItemInInventory(oSource);
        }
    }
}


void SetUnlootableobject oPCobject oCorpse)
{
    if(
GetIsObjectValid(oCorpse) && GetIsPC(oPC) && GetLocalInt(oPC,"LOOTABLE") == 1)
    {

        
//:: Etape 1 - Vider le corps et rendre ses objets au joueur
        
TransfererInventaire(oCorpseoPC);
        
//:: Etape 2 - Detruire le corps vide
        
DestroyObject(oCorpse);
        
SetLocalInt(oPC,"LOOTABLE",0);
    }
    else
    {
        if(
GetIsObjectValid(oCorpse) != TRUE)
            
SendMessageToAllDMs("Erreur - Le corps du PJ loote est incorrect.");
        if(
GetIsPC(oPC) != TRUE)
            
SendMessageToAllDMs("Erreur - Le joueur a delooter n'est pas un joueur.");
        if(
GetLocalInt(oPC,"LOOTABLE") != 1)
            
SendMessageToAllDMs("Erreur - Le joueur a delooter n'est pas loote.");
    }
}


void SetLootablePerso(object oPCfloat fDuration)
{
    if(
GetIsPC(oPC) && GetIsDead(oPC))
    {
        
location lPCLoc GetLocation(oPC);
        
//:: Etape 1 - Stoper les actions du joueur
        
AssignCommand(oPC,ClearAllActions());
        
//:: Etape 2 - Creer le corps
        
vector vPCLoc GetPositionFromLocation(GetLocation(oPC));
        
vector vDecalage Vector(0.0f,1.0f,0.0f);
           
vector vCorpsePosition vPCLoc vDecalage;
           
location lCorpseLoc Location(GetArea(oPC),vCorpsePosition,GetFacing(oPC));
        
object oCorpse CreateObject(OBJECT_TYPE_PLACEABLE,"corpsallumer",lCorpseLoc,FALSE);
    
        
//:: Etape 3 - Remplir le corps et vider le joueur
        
TransfererInventaire(oPCoCorpse);
        
SetLocalInt(oPC,"LOOTABLE",1);
        
DelayCommand(fDuration,SetUnlootable(oPC,oCorpse));
    }
    else
    {
        
SendMessageToAllDMs("Erreur - Le corps a creer n'est pas mort ou n'est pas un joueur");
    }

Bon normalement ca compile... (j'ai teste )
Répondre

Connectés sur ce fil

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