Author Topic: Can anyone point me to a script or utility that removes/merges items from players on log in?  (Read 2200 times)

Legacy_FunkySwerve

  • Hero Member
  • *****
  • Posts: 2325
  • Karma: +0/-0


               

Lazarus Magni wrote...

LOL Funky... I was just saying options are always good. Say in the future someone is using the standard nwn database, at least the alternatives presented here would give an option for them.

I most certainly am guilty of talking about things I don't understand, and believe me it is not by choice. It is pure necessity that I am having to confront these issues, and my lack of understanding is merely due to my inexperience along with the fact that other than these boards I am having to try to do this stuff on my own thus far.

That wasn't directed at you, but at some of the people offering you advice.

I most certainly would like to try the script you made Funky, but I would prolly require some guidance unfortunately. I can make a new script in the mod by cut and pasting what you posted, and attach it to the onclient enter script (by adding the execute script xyx line to the end I think), but I don't know what " In that script, just Get the entering object," means, or how to do that.

All you have to do is execute the onenter I provided from your onenter, as you described. I could tell you were having difficulty, so I kept it simple.

To elaborate, what I meant about getting the entering object, was to use the GetEnteringObject() function, as the onenter I provided does. In area onenter scripts like this one, it's a common way of getting the object we're usually interested in - the one that triggered the event. Feel free to ask whatever other questions you may have.

P.S. My comment toward you was not meant to agitate. I love you man, your PW is awsome, and your contribution to the NWN community in general is outstanding. I have just noticed you seem to feel adversarial towards others with differing opinions here sometimes (which I am sure in the context of past interactions with people on these boards in general is prolly justified), but all I was saying is we are just all friends here, just people, with different knowledge bases, and bound by a common interest (nwn).

Cheers!

I wasn't agitated, honestly. And I'm always open to differing opinions and the input of others, so long as they're based on something. You'll notice I basically used GoG's script wholesale, for example, since it was sound as a pound.When it comes to people offering incorrect information or mischaracterizations about systems they've never used, however, I'm considerably less tolerant, since they're wasting their time, mine, and yours. I was reminded of nothing so much as virgins talking about how sex is no big deal. '<img'>

Funky
               
               

               
            

Legacy_Lazarus Magni

  • Hero Member
  • *****
  • Posts: 1837
  • Karma: +0/-0


               I am glad I have not offended you Funky. Ok so I will give this a try as I described above in my last post. Just so I am clear, will this script then update all items (equiped, and in their inventory [including bags]) to the blueprints stored in the module (or hak, in my case as I had to move all items to the cep_custom.hak to get the mod size below the resource limit), the first time a player logs in, destroy any items it doesn't find a blueprint for, and then flag the PC so that it doesn't run again on subsequent loggins?
               
               

               
            

Legacy_Greyfort

  • Sr. Member
  • ****
  • Posts: 442
  • Karma: +0/-0


               // pc_update_v2
// created by: GhostOfGod
// altered by: Greyfort
//
/*
   This code can be used by a DM item or placed in a triger in the very first
   area a pc will enter mod.  This will insure that a PC wont run around a
   world with a +20 vorpal time stoping sword...
*/
// will destory items set for destruction by local variable
// if( GetLocalString(oItem,"Destroy")=="VALID" ){DestroyObject(oItem);}
// SetLocalString(oItem,"Destroy","VALID");
void Destory_Items(object oPC=OBJECT_SELF);

void Destory_Items(object oPC=OBJECT_SELF)
{
object oItem = GetFirstItemInInventory(oPC);
while ( GetIsObjectValid(oItem)==TRUE )
   {
   if( GetLocalString(oItem,"Destroy")=="TRUE" ){DestroyObject(oItem);}
   oItem = GetNextItemInInventory(oPC);
   }

}

// find resref matched weapon
void ResRefMatchReplace(object oItem, object oTarget);

void ResRefMatchReplace(object oItem, object oTarget)
{
   string sResRef = GetResRef(oItem);
if ( GetLocalString(oItem,"Updated")!="Updated")
   {
   // debug
   SendMessageToPC( oTarget,"@@@...Item ResRef="+ sResRef +"...@@@");
   object oReplacement = CreateItemOnObject(sResRef, oTarget,1);

   if (GetIsObjectValid(oReplacement)==FALSE)
       {
       //do stuff if there is no item with matching res ref.
       // if item doesn't have resref dont destroy, flag PC for DM intervention
       // debug
       SendMessageToPC( oTarget,"!!!...InValid Item...!!!");

       SetLocalString(oItem,"Destroy","InValid");
       SetLocalInt(oTarget,"DM_intrvn",TRUE);
       }
   else
       {
       // debug
       SendMessageToPC( oTarget,"***...Valid Item...UPDATED***");
       SetLocalString(oReplacement,"Updated","Updated");
       SetLocalString(oItem,"Updated","Updated");
       SetLocalString(oItem,"Destroy","TRUE");
       }
   }
}
//////////////////////////////[ END OF FUNCTIONS ]////////////////////////////


#include "x2_inc_switches"
void main()
{
// NOTE: this is code for a tool by GhostOfGod
/*
   int iEvent = GetUserDefinedItemEventNumber();
   if (iEvent != X2_ITEM_EVENT_ACTIVATE) return;
   object oActivator = GetItemActivator();
   if (!GetIsDM(oActivator)) return;

   object oTarget = GetItemActivatedTarget();
   object oItem = GetFirstItemInInventory(oTarget);
*/
// NOTE: this is code for trigger, trigers work better at clearing equiped gear.
// so I have found, then area event/scripts Greyfort
// here you will have to decide what DB you are using nwn_db or nwnx_db
// example useing nwn_db
string sDM_Name = "Help_Script_MOD";//""+GetModuleName()+"_"+"SaVE_LOC";

object oTarget = GetEnteringObject();

// resets vars for testing
SetCampaignInt(sDM_Name,"Gear_updtd",0,oTarget);

// custom player effect
effect ePlyr_update =EffectPetrify();

// save location invalid set
object oBadArea = GetObjectByTag("");
vector vBadVec = Vector(0.0,0.0,0.0);
location lbadloc = Location(oBadArea,vBadVec,0.0);

location lSave_Loc = GetCampaignLocation( sDM_Name,"Save_Loc",oTarget );
object oDflt_Start = GetObjectByTag("WP_oDflt_Start");
object oDM_Thrpy = GetNearestObjectByTag( "WP_oDM_Thrpy",oTarget );

int iSlot;
//------------------------------------------------------------------------------
// added check for update variable if false update if true jump to loc
// if update false update
if( GetCampaignInt(sDM_Name,"Gear_updtd",oTarget)==0 )
   {
   //Get items in inventory and replace if needed
   // debug
   SendMessageToPC( oTarget,"1)...Inventory check...");
   object oItem = GetFirstItemInInventory(oTarget);
   while (GetIsObjectValid(oItem)==TRUE )
   {
       //if item is a container, loop through items inside
       if (GetHasInventory(oItem)==TRUE)
       {
       // debug
       SendMessageToPC( oTarget,"2)...Container check...");
           object oConItem = GetFirstItemInInventory(oItem);
           while (GetIsObjectValid(oConItem)==TRUE)
           {

               ResRefMatchReplace(oConItem, oTarget);
               oConItem = GetNextItemInInventory(oItem);
           }
       }
       else
       {
           ResRefMatchReplace(oItem, oTarget);
       }
   oItem = GetNextItemInInventory(oTarget);
   }

   //Get equipped items and replace if necessary
   // debug
   SendMessageToPC( oTarget,"equipped items check...");
   for (iSlot=0; iSlot< 13; iSlot++)
   {
       oItem = GetItemInSlot(iSlot, oTarget);
       if (GetIsObjectValid(oItem))
       {
           ResRefMatchReplace(oItem, oTarget);
       }
   }


//-----------------------[jump player to apropriate loc]----------------
// now if player flagged for DM intervention jump play to DM Therepy...
if ( GetLocalInt(oTarget,"DM_intrvn")==TRUE)
   {
   // flag player not updated here:
   SetCampaignInt(sDM_Name,"Gear_updtd",0,oTarget);
   // jump to DM_area
   //AssignCommand(oTarget,ClearAllActions(TRUE));
   AssignCommand(oTarget,ActionJumpToObject( oDM_Thrpy ));
   }

// now if player not flagged for DM intervention jump player to default start,
// or saved loc
if ( GetLocalInt(oTarget,"DM_intrvn")==FALSE)
   {

//jump to save loc if valid else jump to default start
if (lSave_Loc != lbadloc)
   {
   // flag player updated here:
   SetCampaignInt(sDM_Name,"Gear_updtd",1);
   // jump to save_lov
   //AssignCommand(oTarget,ClearAllActions(TRUE));
   AssignCommand(oTarget,JumpToLocation( lSave_Loc ));
   }
   else
   {
   // flag player updated here:
   SetCampaignInt(sDM_Name,"Gear_updtd",1,oTarget);
   // jump to default start
   //AssignCommand(oTarget,ClearAllActions(TRUE));
   AssignCommand(oTarget,ActionJumpToObject( oDflt_Start ));
   }
   }
}//ENDO OF if( SetCampaignInt(sDM_Name,"Gear_updtd")==FALSE )

//------------------------------------------------------------------------------
// if update TRUE DONT update
if( GetCampaignInt(sDM_Name,"Gear_updtd",oTarget)==1 )
{

//jump to save loc if valid else jump to default start
if (lSave_Loc != lbadloc)
   {
   // flag player updated here:
   SetCampaignInt(sDM_Name,"Gear_updtd",1,oTarget);
   // jump to save_lov
   //AssignCommand(oTarget,ClearAllActions(TRUE));
   AssignCommand(oTarget,JumpToLocation( lSave_Loc ));
   }
   else
   {
   // flag player updated here:
   SetCampaignInt(sDM_Name,"Gear_updtd",1,oTarget);
   // jump to default start
   //AssignCommand(oTarget,ClearAllActions(TRUE));
   AssignCommand(oTarget,ActionJumpToObject( oDflt_Start ));
   }

}//END if( SetCampaignInt(sDM_Name,"Gear_updtd")==TRUE )


//---!!!!!!!!!!--
// destroy items
//
// debug
SendMessageToPC( oTarget,"3)...DESTORYING Updated ITEMS...");
Destory_Items(oTarget);

//[END OF SCRIPT//]
}

This script placed on a triggers on enter event/script will check players gear update anything that is in the module palate even nwn default items, and if player has items that are not palate they will be flagged and sent to DM help area.

If your interested I can send you a mod ware all you will have to do is import dm area, start area, and script and your problem is solved.

EDIT: I forgot to add the DM area has a player option to not wait for a dm, just update items, destroy all invalid ones and start playing.  Otherwise player can wait if thats an option.  I tried to give every option I could in the example.
               
               

               


                     Modifié par Greyfort, 19 juin 2011 - 09:55 .
                     
                  


            

Legacy_Greyfort

  • Sr. Member
  • ****
  • Posts: 442
  • Karma: +0/-0


               // pc_update_v1
// created by: GhostOfGod
// altered by: Greyfort
//
// pc_update_v2
// created by: GhostOfGod
// altered by: Greyfort
//
/*
    this is one script with oput include file all functions needed are here for
    script.

    This code can be used by a DM item or placed in a triger in the very first
    area a pc will enter mod.  This will insure that a PC wont run around a
    world with a +20 vorpal time stoping sword...
*/
//////////////[ Adjust only these variables ]//////////////////////
const int nDM_Therapy=FALSE;//DEFAULT FALSE;
const int nUPDate_Msgs=FALSE;//DEFAULT FALSE;
//===============================================================//

//////////////////////////////[ START OF FUNCTIONS ]////////////////////////////
//////////[ !!! Don not change functions unless quality scripter !!! ]//////////

// checks if location valid
int GetIsLocationValid(location lLocation);

int GetIsLocationValid(location lLocation)
{
// note you need to create a hidden creature wuth resref "Loctstr"
object oLoctstr = CreateObject (OBJECT_TYPE_CREATURE,"Loctstr",lLocation);
if (GetIsObjectValid(oLoctstr)==TRUE){DestroyObject(oLoctstr);return TRUE;}
return FALSE;
}

// destroys all items with var invalid
void Destory_InValidItems(object oPC=OBJECT_SELF);

void Destory_InValidItems(object oPC=OBJECT_SELF)
{
int iSlot;
object oItem = GetFirstItemInInventory(oPC);
while ( GetIsObjectValid(oItem)==TRUE )
    {    //SetLocalString(oItem,"Destroy","InValid");
    if( GetLocalString(oItem,"Destroy")=="InValid" ){DestroyObject(oItem);}
    oItem = GetNextItemInInventory(oPC);
    }

    for (iSlot=0; iSlot< 13; iSlot++)
    {
        oItem = GetItemInSlot(iSlot, oPC);
        if (GetIsObjectValid(oItem))
        {
        if( GetLocalString(oItem,"Destroy")=="InValid" ){DestroyObject(oItem);}
        }
    }
}

// will destory items set for destruction by local variable
// if( GetLocalString(oItem,"Destroy")=="VALID" ){DestroyObject(oItem);}
// SetLocalString(oItem,"Destroy","VALID");
void Destory_Items(object oPC=OBJECT_SELF);

void Destory_Items(object oPC=OBJECT_SELF)
{
object oItem = GetFirstItemInInventory(oPC);
while ( GetIsObjectValid(oItem)==TRUE )
    {
    if( GetLocalString(oItem,"Destroy")=="TRUE" ){DestroyObject(oItem);}
    oItem = GetNextItemInInventory(oPC);
    }

}

// find resref matched weapon
void ResRefMatchReplace(object oItem, object oTarget);

void ResRefMatchReplace(object oItem, object oTarget)
{
    string sResRef = GetResRef(oItem);
if ( GetLocalString(oItem,"Updated")!="Updated")
    {
    // debug
    if( nUPDate_Msgs==TRUE){SendMessageToPC( oTarget,"@@@...Item name & ResRef="+GetName(oItem)+" & "+sResRef +"...@@@");}
    object oReplacement = CreateItemOnObject(sResRef, oTarget,1);

    if (GetIsObjectValid(oReplacement)==FALSE)
        {
        //do stuff if there is no item with matching res ref.
        // if item doesn't have resref dont destroy, flag PC for DM intervention
        // debug
        if( nUPDate_Msgs==TRUE){SendMessageToPC( oTarget,"!!!...InValid Item...!!!");}

        SetLocalString(oItem,"Destroy","InValid");
        if ( nDM_Therapy==TRUE){
        SetLocalInt(oTarget,"DM_intrvn",TRUE);}
        }
    else if (GetIsObjectValid(oReplacement)==TRUE)
        {
        // debug
        if( nUPDate_Msgs==TRUE){SendMessageToPC( oTarget,"***...Valid Item...UPDATED***");}
        //SetLocalInt(oTarget,"DM_intrvn",FALSE);
        SetLocalString(oReplacement,"Updated","Updated");
        SetLocalString(oItem,"Updated","Updated");
        SetLocalString(oItem,"Destroy","TRUE");
        }
    }
}
//////////////////////////////[ END OF FUNCTIONS ]////////////////////////////

#include "x2_inc_switches"
void main()
{
// NOTE: this is code for a tool by GhostOfGod
/*
    int iEvent = GetUserDefinedItemEventNumber();
    if (iEvent != X2_ITEM_EVENT_ACTIVATE) return;
    object oActivator = GetItemActivator();
    if (!GetIsDM(oActivator)) return;

    object oTarget = GetItemActivatedTarget();
    object oItem = GetFirstItemInInventory(oTarget);
*/
// NOTE: this is code for trigger, trigers work better at clearing equiped gear.
// so I have found, then area event/scripts Greyfort
// here you will have to decide what DB you are using nwn_db or nwnx_db
// example useing nwn_db

// !!! CHANGE VARIABLES HERE !!!
// TO your DB var, your waypoints Tags, Save_loc var
string sDM_Name = "Help_Script_MOD";
object oDflt_Start = GetObjectByTag("WP_oDflt_Start");
object oDM_Thrpy = GetObjectByTag( "WP_oDM_Thrpy" );

object oTarget = GetEnteringObject();
location lSave_Loc = GetCampaignLocation( sDM_Name,"Save_Loc",oTarget );

// resets vars for testing  other wise uncoment // it out
//SetCampaignInt(sDM_Name,"Gear_updtd",0,oTarget);

int iSlot;
//------------------------------------------------------------------------------
// added check for update variable if false update if true jump to loc
// if update false update
if( GetCampaignInt(sDM_Name,"Gear_updtd",oTarget)==0 )
    {
    //Get items in inventory and replace if needed
    // debug
    if( nUPDate_Msgs==TRUE){SendMessageToPC( oTarget,"1)...Inventory check...");}
    object oItem = GetFirstItemInInventory(oTarget);
    while (GetIsObjectValid(oItem)==TRUE )
    {
        //if item is a container, loop through items inside
        if (GetHasInventory(oItem)==TRUE)
        {
        // debug
        if( nUPDate_Msgs==TRUE){SendMessageToPC( oTarget,"2)...Container check...");}
            object oConItem = GetFirstItemInInventory(oItem);
            while (GetIsObjectValid(oConItem)==TRUE)
            {
                ResRefMatchReplace(oConItem, oTarget);
                oConItem = GetNextItemInInventory(oItem);
            }
        }
        else
        {
            ResRefMatchReplace(oItem, oTarget);
        }
    oItem = GetNextItemInInventory(oTarget);
    }
    //Get equipped items and replace if necessary
    // debug
    if( nUPDate_Msgs==TRUE){SendMessageToPC( oTarget,"equipped items check...");}
    for (iSlot=0; iSlot< 13; iSlot++)
    {
        oItem = GetItemInSlot(iSlot, oTarget);
        if (GetIsObjectValid(oItem))
        {
            ResRefMatchReplace(oItem, oTarget);
        }
    }
//-----------------------[jump player to apropriate loc]----------------
// now if player flagged for DM intervention jump play to DM Therepy...
if ( nDM_Therapy==TRUE)
    {
    if ( GetLocalInt(oTarget,"DM_intrvn")==TRUE)
        {
        // flag player not updated here:
        SetCampaignInt(sDM_Name,"Gear_updtd",0,oTarget);
        // jump to DM_area
        AssignCommand(oTarget,ClearAllActions(TRUE));
        AssignCommand(oTarget,ActionJumpToObject( oDM_Thrpy ));
        }
    // now if player not flagged for DM intervention jump player to default start,
    // or saved loc
    if ( GetLocalInt(oTarget,"DM_intrvn")==FALSE)
        {
        //jump to save loc if valid else jump to default start
        if (GetIsLocationValid(lSave_Loc)==TRUE)
            {
            // flag player updated here:
            SetCampaignInt(sDM_Name,"Gear_updtd",1,oTarget);
            // jump to save_lov
            //AssignCommand(oTarget,ClearAllActions(TRUE));
            AssignCommand(oTarget,JumpToLocation( lSave_Loc ));
            }
            else
            {
            // flag player updated here:
            SetCampaignInt(sDM_Name,"Gear_updtd",1,oTarget);
            // jump to default start
            //AssignCommand(oTarget,ClearAllActions(TRUE));
            AssignCommand(oTarget,ActionJumpToObject( oDflt_Start ));
            }
        }
    }//END OF if ( nDM_Therapy=TRUE)
//////////////////////////////////
// not use dm_option
if ( nDM_Therapy==FALSE)
    {
    //jump to save loc if valid else jump to default start
    if (GetIsLocationValid(lSave_Loc)==TRUE)
        {
        // flag player updated here:
        SetCampaignInt(sDM_Name,"Gear_updtd",1,oTarget);
        // jump to save_lov
        //AssignCommand(oTarget,ClearAllActions(TRUE));
        AssignCommand(oTarget,JumpToLocation( lSave_Loc ));
        }
        else
        {
        // flag player updated here:
        SetCampaignInt(sDM_Name,"Gear_updtd",1,oTarget);
        // jump to default start
        //AssignCommand(oTarget,ClearAllActions(TRUE));
        AssignCommand(oTarget,ActionJumpToObject( oDflt_Start ));
        }
    }//END OF if ( nDM_Therapy=FALSE)
}//END OF if( SetCampaignInt(sDM_Name,"Gear_updtd")==FALSE )



//------------------------------------------------------------------------------
// if update TRUE DONT update this is dependant on data base
if( GetCampaignInt(sDM_Name,"Gear_updtd",oTarget)==1 )
{

//jump to save loc if valid else jump to default start
if (GetIsLocationValid(lSave_Loc)==TRUE)
    {
    // flag player updated here:
    SetCampaignInt(sDM_Name,"Gear_updtd",1,oTarget);
    // jump to save_lov
    //AssignCommand(oTarget,ClearAllActions(TRUE));
    AssignCommand(oTarget,JumpToLocation( lSave_Loc ));
    }
    else
    {
    // flag player updated here:
    SetCampaignInt(sDM_Name,"Gear_updtd",1,oTarget);
    // jump to default start
    //AssignCommand(oTarget,ClearAllActions(TRUE));
    AssignCommand(oTarget,ActionJumpToObject( oDflt_Start ));
    }

}//END if( SetCampaignInt(sDM_Name,"Gear_updtd")==TRUE )


//---!!!!!!!!!!--
// destroy items
//
// debug
if( nUPDate_Msgs==TRUE){SendMessageToPC( oTarget,"3)...DESTORYING Updated ITEMS...");}
Destory_Items(oTarget);
if ( nDM_Therapy==FALSE){Destory_InValidItems(oTarget);}
//[END OF SCRIPT//]
}

Forgive me I posted the wrong script, this is the correct script.  You can place it on areas/triggers “on enter” event/script.  I can also send you a Module as an example if you like.

This script is adjustable use dm_therapy option True/false , show Update messaging
               
               

               


                     Modifié par Greyfort, 20 juin 2011 - 01:21 .
                     
                  


            

Legacy_Lazarus Magni

  • Hero Member
  • *****
  • Posts: 1837
  • Karma: +0/-0


               That's is fantastic Grey, thank you. Two questions though, will it then flag the character as having had this done, so it doesn't run everytime they log in? And Will it work if the items are stored in the cep2_custom.hak?
               
               

               
            

Legacy_FunkySwerve

  • Hero Member
  • *****
  • Posts: 2325
  • Karma: +0/-0


               

Lazarus Magni wrote...

I am glad I have not offended you Funky. Ok so I will give this a try as I described above in my last post. Just so I am clear, will this script then update all items (equiped, and in their inventory [including bags]) to the blueprints stored in the module (or hak, in my case as I had to move all items to the cep_custom.hak to get the mod size below the resource limit), the first time a player logs in, destroy any items it doesn't find a blueprint for, and then flag the PC so that it doesn't run again on subsequent loggins?


That's exactly what it will do, yes. As always, I would test it before it goes live, to make sure it works. It's possible, for example, that you no longer have a pwdata table, if your predecessors removed it in favor of another (though I don't think many people do that). In that case, it'd replace them every time, not just the first, which would be a fair amount of unneeded overhead.

Funky
               
               

               
            

Legacy_FunkySwerve

  • Hero Member
  • *****
  • Posts: 2325
  • Karma: +0/-0


               This:

// NOTE: this is code for trigger, trigers work better at clearing equiped gear.
// so I have found, then area event/scripts

Is just wrong. Triggers have no advantage over other events for this sort of thing. In fact, fast characters are able to miss them entirely, making it a good idea to place the trigger around the spot they're entering an area if you want to guarantee they hit it every time - at which point you might as well just use the onenter and save yourself an object. If you've had issues with onenter, it's likely because you were working from oncliententer and didn't check to make sure the pc was actually in an area first. That's why you see this check in the script I posted on page 1 of this thread:

    if (!GetIsObjectValid(oArea) || GetTag(oArea) == "voyage") {
        DelayCommand(5.0, main());
        return;
    }

Funky
               
               

               
            

Legacy_Lazarus Magni

  • Hero Member
  • *****
  • Posts: 1837
  • Karma: +0/-0


               I am still struggling to get the server up and functioning correctly, and furthermore past that getting the mod to the point where I even want to allow other players into it, but once I do I will certainly try some of these solutions to see how they work. Thank you everyone for all your input!
Cheers, Laz
               
               

               
            

Legacy_Greyfort

  • Sr. Member
  • ****
  • Posts: 442
  • Karma: +0/-0


               Thanks Funky I could not figure out why it was doing that [on client enter/area enter], I resorted to makeing an area 2x2 and trigger the size of the area.  A simple delay and area check that great to know.

--------------------------------------------------------------------------------------------------------------------------------------------------------------
That's is fantastic Grey, thank you. Two questions though, will it then
flag the character as having had this done, so it doesn't run everytime
they log in? And Will it work if the items are stored in the
cep2_custom.hak?
                       
--------------------------------------------------------------------------------------------------------------------------------------------------------------
yes to both questions, Q1) It stores var on data base [currently nwndb] Q2) It will update any module pallete item, so if its core nwn item or a hakitem if its in the pallete it will update it.
               
               

               


                     Modifié par Greyfort, 20 juin 2011 - 08:03 .