Author Topic: Question on Burning Torches?  (Read 733 times)

Legacy_Herrlichkeit

  • Newbie
  • *
  • Posts: 10
  • Karma: +0/-0
Question on Burning Torches?
« on: May 31, 2011, 01:13:40 am »


               Hi, there. I'm very new to scripting and I've been sort of learning on my own while I build my module. At first I was just goofing off, but now I'm fairly serious about building the world.

Some of the things I've been trying to implement are a bit harder for me to comprehend, and I've only just started to get a handle on local integers.

With that being said, I'm trying to set up a script that uses local integers to handle a torch that burns for awhile, speaking a floating string to let you know how much longer it will last. When it reaches the integer demanded, it should unequip and destroy the torch.

It's nothing fancy, and I know that there are some burning torches scripts on the vault, but I'd really rather use my own scripts for as far as that can take me.

If there are any scriptors out there who have the time to take a look at my script and help me out, I'd really appreciate it, though I apologize that my scripting is a bit sloppy.

I can't seem to get the script to work at all and there are all sorts of problems with it.


A copy of my modified OnEquipItem script

--------------------------------

//::///////////////////////////////////////////////
//:: Example XP2 OnItemEquipped
//:: x2_mod_def_equ
//:: © 2003 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Put into: OnEquip Event
*/
//:://////////////////////////////////////////////
//:: Created By: Georg Zoeller
//:: Created On: 2003-07-16
//:://////////////////////////////////////////////
//:: Modified By: Deva Winblood
//:: Modified On: April 15th, 2008
//:: Added Support for Mounted Archery Feat penalties
//:://////////////////////////////////////////////

#include "x2_inc_switches"
#include "x2_inc_intweapon"
#include "x3_inc_horse"

void main()
{

    object oItem = GetPCItemLastEquipped();
    object oPC   = GetPCItemLastEquippedBy();
    // -------------------------------------------------------------------------
    // Intelligent Weapon System
    // -------------------------------------------------------------------------
    if (IPGetIsIntelligentWeapon(oItem))
    {
        IWSetIntelligentWeaponEquipped(oPC,oItem);
        // prevent players from reequipping their weapon in
        if (IWGetIsInIntelligentWeaponConversation(oPC))
        {
                object oConv =   GetLocalObject(oPC,"X2_O_INTWEAPON_SPIRIT");
                IWEndIntelligentWeaponConversation(oConv, oPC);
        }
        else
        {
            //------------------------------------------------------------------
            // Trigger Drain Health Event
            //------------------------------------------------------------------
            if (GetLocalInt(oPC,"X2_L_ENSERRIC_ASKED_Q3")==1)
            {
                ExecuteScript ("x2_ens_dodrain",oPC);
            }
            else
            {
                IWPlayRandomEquipComment(oPC,oItem);
            }
        }
    }

    // -------------------------------------------------------------------------
    // Mounted benefits control
    // -------------------------------------------------------------------------
    if (GetWeaponRanged(oItem))
    {
        SetLocalInt(oPC,"bX3_M_ARCHERY",TRUE);
        HORSE_SupportAdjustMountedArcheryPenalty(oPC);
    }

    // -------------------------------------------------------------------------
    // Generic Item Script Execution Code
    // If MODULE_SWITCH_EXECUTE_TAGBASED_SCRIPTS is set to TRUE on the module,
    // it will execute a script that has the same name as the item's tag
    // inside this script you can manage scripts for all events by checking against
    // GetUserDefinedItemEventNumber(). See x2_it_example.nss
    // -------------------------------------------------------------------------
    if (GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS) == TRUE)
    {
        SetUserDefinedItemEventNumber(X2_ITEM_EVENT_EQUIP);
        int nRet =   ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF);
        if (nRet == X2_EXECUTE_SCRIPT_END)
        {
            return;
        }
    }

    {
object oItem = GetPCItemLastEquipped();
      if (GetTag(oItem) == "NW_IT_TORCH001")

if (!GetIsPC(oPC)) return;

if (GetLocalInt(oPC, "burningtorch")== 6)
   {
   SetLocalInt(oPC, "burningtorch", 3);

   }

if (GetLocalInt(oPC, "burningtorch")== 5)
   {
   SetLocalInt(oPC, "burningtorch", 2);

   }

if (GetLocalInt(oPC, "burningtorch")== 4)
   {
   SetLocalInt(oPC, "burningtorch", 1);

   }

if (GetLocalInt(oPC, "burningtorch")== 3)
   {
   FloatingTextStringOnCreature("You light a torch.", oPC);
   }

if (GetLocalInt(oPC, "burningtorch")== 2)
   {
   FloatingTextStringOnCreature("Your torch dims a little.", oPC);
   }

if (GetLocalInt(oPC, "burningtorch")== 1)
   {
   FloatingTextStringOnCreature("Your torch is almost spent.", oPC);
   }

if (GetLocalInt(oPC, "burningtorch")== 7)
   {
   AssignCommand(oPC, ActionUnequipItem(GetItemPossessedBy(OBJECT_SELF, "nw_burning_torch")));
   }

if (GetLocalInt(oPC, "burningtorch")== 7)
   {
   oItem = GetItemPossessedBy(oPC, "nw_burning_torch");
   }

if (GetIsObjectValid(oItem))
   DestroyObject(oItem);

if (GetLocalInt(oPC, "burningtorch")== 7)
   {
   FloatingTextStringOnCreature("Your torch goes out.", oPC);
   }

if (GetLocalInt(oPC, "burningtorch")== 0)
   {
   SetLocalInt(oPC, "burningtorch", 3);

   }

DelayCommand(100.0, SetLocalInt(oPC, "burningtorch", 2));

DelayCommand(100.0, SetLocalInt(oPC, "burningtorch", 1));

DelayCommand(100.0, SetLocalInt(oPC, "burningtorch", 7));

}

}

----------------------------------------------

A copy of my modified OnUnEquipItem script.

------------------------------------------------

//::///////////////////////////////////////////////
//:: Example XP2 OnItemEquipped
//:: x2_mod_def_unequ
//:: © 2003 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Put into: OnUnEquip Event
*/
//:://////////////////////////////////////////////
//:: Created By: Georg Zoeller
//:: Created On: 2003-07-16
//:://////////////////////////////////////////////
//:: Modified By: Deva Winblood
//:: Modified On: April 15th, 2008
//:: Added Support for Mounted Archery Feat penalties
//:://////////////////////////////////////////////

#include "x2_inc_switches"
#include "x2_inc_intweapon"
#include "x3_inc_horse"

void main()
{
     object oItem = GetPCItemLastUnequipped();
     object oPC   = GetPCItemLastUnequippedBy();

    // -------------------------------------------------------------------------
    //  Intelligent Weapon System
    // -------------------------------------------------------------------------
    if (IPGetIsIntelligentWeapon(oItem))
    {
            IWSetIntelligentWeaponEquipped(oPC,OBJECT_INVALID);
            IWPlayRandomUnequipComment(oPC,oItem);
    }

    // -------------------------------------------------------------------------
    // Mounted benefits control
    // -------------------------------------------------------------------------
    if (GetWeaponRanged(oItem))
    {
        DeleteLocalInt(oPC,"bX3_M_ARCHERY");
        HORSE_SupportAdjustMountedArcheryPenalty(oPC);
    }

    // -------------------------------------------------------------------------
    // Generic Item Script Execution Code
    // If MODULE_SWITCH_EXECUTE_TAGBASED_SCRIPTS is set to TRUE on the module,
    // it will execute a script that has the same name as the item's tag
    // inside this script you can manage scripts for all events by checking against
    // GetUserDefinedItemEventNumber(). See x2_it_example.nss
    // -------------------------------------------------------------------------
    if (GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS) == TRUE)
    {
        SetUserDefinedItemEventNumber(X2_ITEM_EVENT_UNEQUIP);
        int nRet =   ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oItem),OBJECT_SELF);
        if (nRet == X2_EXECUTE_SCRIPT_END)
        {
           return;
        }
    }

    {

object oItem = GetPCItemLastUnequipped();

oItem = GetPCItemLastUnequipped();
if (GetTag(oItem) == "nw_burning_torch")

if (!GetIsPC(oPC)) return;

if (GetLocalInt(oPC, "burningtorch")== 3)
   {
   SetLocalInt(oPC, "burningtorch", 6);
   }

if (GetLocalInt(oPC, "burningtorch")== 2)
   {
   SetLocalInt(oPC, "burningtorch", 5);
   }

if (GetLocalInt(oPC, "burningtorch")== 1)
   {
   SetLocalInt(oPC, "burningtorch", 4);
   }

FloatingTextStringOnCreature("You douse your torch.", oPC);

}

}
               
               

               


                     Modifié par Herrlichkeit, 31 mai 2011 - 12:15 .
                     
                  


            

Legacy_Fester Pot

  • Hero Member
  • *****
  • Posts: 1698
  • Karma: +0/-0
Question on Burning Torches?
« Reply #1 on: May 31, 2011, 01:20:29 am »


               Not sure if you'd be interested but this is the one I used to do exactly what you're currently putting together.

And below is my modified version of the same script.

//::///////////////////////////////////////////////
//:: torch_OnEquip Rev. 2
//:: Copyright © 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    this script is a customized OnPlayerEquipItem
    script which will manage the lifetimes of torches
    so that they do not last forever.

    useful for low-magic or "real world" settings.
    developed for single-player modules; some
    modification might be necessary for use in multi-
    player.

    this script is different from the other 3 or 4
    torch management scripts out there in that it does
    NOT rely on the module heartbeat event! some people
    hate using heartbeat events. however, this script
    uses a "pseudo" heartbeat function (recursive
    DelayCommand). also, this script (and its accompanying
    pseudo-Heartbeat) only runs when they NEED to be run
    while a regular heartbeat always runs every 6 seconds
    no matter what!

    Usage: Include "torch_onequip", "torch_onunequip"
    and "torch_dimmer" with your module. Put torch_onequip
    into Module, Properties, Events, "OnPlayerEquipItem".
    Put torch_onunequip into the "OnPlayerUnEquipItem"
    of the same dialog box. Do a full build and then
    save your module.

    Change TORCH_LIFESPAN (line 65) to suit
    your needs. Default torch lifespan is 20 realtime min.

    Change WANT_DIMMING (line 66) if you don't like the
    dimming effect when the clock is at 60 seconds remaining.
    I think its kinda cool. It basically changes the torch's
    light property to a Dim Red light and makes it "flicker".

    If you already have an OnPlayerEquipItem event, you have
    to merge it with this one. This only works with the
    standard torches from the Toolset palette unless you
    modify accordingly. This script WILL keep track of
    the lifespan of each individual torch by saving state.
    This script will also continue to work when you pass
    through area transitions. And, this script will
    keep track of torch lifespans through savegames.

    One issue I have found is that when you unequip/re-equip
    the same torch repeatedly you may lose some life from it
    depending on how close to the next pseudo-HB you
    unequipped it.

    Credits: Rev. 2 was mostly done by myself. I got the pseudo-HB
    idea from a script by DenOfAssassins and of course thanks
    to BioWare for including that nifty new "OnEquipItem" event
    handler in HotU 1.59.
*/

//:://////////////////////////////////////////////
//:: Created By: LoCash (LoCash@sympatico.ca)
//:: Created On: 12/15/03
//:: Rev.2 created on: 12/19/03
//:://////////////////////////////////////////////

const int TORCH_LIFESPAN = 25;  // change this value to [(desired torch lifespan in realtime minutes * 3) + 1]
const int WANT_DIMMING = 1;  // change to 0 if you don't want dimming effect @ 60 sec. remaining

void TorchPseudoHB(object oObject, int hbSessionID)
{
    int hbTorchInHands = GetLocalInt(oObject, "TorchInHands");
    int hbTorchLife = GetLocalInt(oObject, "TorchLife");
    int objSessionID = GetLocalInt(oObject, "SessionID");
    object oPC = GetItemPossessor(oObject);
    object oTorch = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
    if ((oTorch == oObject) && (hbTorchInHands != 0) && (objSessionID == hbSessionID))
    {
        if (hbTorchLife > 1)
        {
            if ((hbTorchLife == 10) && (WANT_DIMMING == 1))
            {
                ExecuteScript("torch_dimmer1", oObject);
                //SendMessageToPC(oPC,"Your torch begins to fade away...");
                FloatingTextStringOnCreature("Your torch sputters. . .", oPC);
            }
            if ((hbTorchLife == 4) && (WANT_DIMMING == 1))
            {
                ExecuteScript("torch_dimmer", oObject);
                //SendMessageToPC(oPC,"Your torch begins to fade away...");
                FloatingTextStringOnCreature("Your torch is fading. . .", oPC);
            }
            hbTorchLife--;
            SetLocalInt(oObject, "TorchLife", hbTorchLife);
            DelayCommand(20.0, AssignCommand(oObject, TorchPseudoHB(oObject, hbSessionID)));
            return;
        }
        if (hbTorchLife <= 1)
        {
            DestroyObject(oObject, 0.4f);
            //SendMessageToPC(oPC,"Your torch sputters out and dies.");
            FloatingTextStringOnCreature("Your torch sputters out and dies. . .", oPC);
            return;
        }
    }
}

void main()
{

object oItem = GetPCItemLastEquipped();
string sItemTag = GetTag(oItem);

if (GetLocalInt(GetModule(), "introended") == 0) return;

    if (sItemTag == "NW_IT_TORCH001")   // check if a torch was just equipped
    {
        int iTorchLife = GetLocalInt(oItem, "TorchLife");  // get life value from torch
        int iTorchInHands = GetLocalInt(oItem, "TorchInHands");
        if (iTorchLife == 0)
        {
            iTorchLife = TORCH_LIFESPAN; // brand-new torches get lifespan set
        }
        SetLocalInt(oItem, "TorchLife", iTorchLife); // pass torchlife back to object
        if (iTorchInHands != 1)
        {
            SetLocalInt(oItem, "TorchInHands", 1);  // flag torch is "in PC's hands" now
            int iSessionID = (Random(999) + 1);     // create almost-unique session ID
            SetLocalInt(oItem, "SessionID", iSessionID);    // store it on torch
            TorchPseudoHB(oItem, iSessionID);       // run pseudoHB function
        }
    }

}


Cut from x2_mod_def_equ as required.

FP!
               
               

               


                     Modifié par Fester Pot, 31 mai 2011 - 12:23 .
                     
                  


            

Legacy_Herrlichkeit

  • Newbie
  • *
  • Posts: 10
  • Karma: +0/-0
Question on Burning Torches?
« Reply #2 on: May 31, 2011, 03:31:58 am »


               Thank you very much for responding, Fester Pot. I gave the script you showed me a shot to see if I could figure it out. For some reason, it's as though nothing changes. The light doesn't dim at sixty seconds and the torch never goes out. Is there a chance I made a mistake when implementing the script?
               
               

               
            

Legacy_henesua

  • Hero Member
  • *****
  • Posts: 6519
  • Karma: +0/-0
Question on Burning Torches?
« Reply #3 on: May 31, 2011, 03:40:09 am »


                I prefer "Lanterns and Torches" by KMdS.

Its working well for me.
               
               

               
            

Legacy_Fester Pot

  • Hero Member
  • *****
  • Posts: 1698
  • Karma: +0/-0
Question on Burning Torches?
« Reply #4 on: May 31, 2011, 03:46:31 am »


               Herrlichkeit - the TAG of any TORCH must be the default NWN one - NW_IT_TORCH001. I also suggest you use the main package provided in the LINK and modify it to your desire, rather than using the one I posted, as I quickly removed what I thought was relevant to what you're attempting to do and may have missed a paste of something in the process.

FP!
               
               

               


                     Modifié par Fester Pot, 31 mai 2011 - 03:07 .
                     
                  


            

Legacy_GhostOfGod

  • Hero Member
  • *****
  • Posts: 1490
  • Karma: +0/-0
Question on Burning Torches?
« Reply #5 on: May 31, 2011, 05:21:37 am »


               If you don't want to mess with your module equip script you can do a tag based version. Just made this(tested and seems to be working fine):


#include "x2_inc_switches"

const int TORCH_LIFE_SPAN = 20;//minutes the torch will last

void TorchFade(object oTorch, object oPlayer)
{
    if (GetLocalInt(oTorch, "WAIT_MODE") == TRUE) return;
    SetLocalInt(oTorch, "WAIT_MODE", TRUE);
    int iBurnt = GetLocalInt(oTorch, "BURNT");
    object oCheck = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPlayer);

    if (iBurnt == TORCH_LIFE_SPAN)
    {
        DestroyObject(oTorch);
        SendMessageToPC(oPlayer, "Your torch has burnt out.");
    }
    else
    {
        int iTimeLeft = TORCH_LIFE_SPAN - iBurnt;
        string sMessage;
        if (iTimeLeft == 1) sMessage = "Your torch will burn out in 1 minute.";
        else sMessage = "Your torch will burn out in " + IntToString(iTimeLeft) + " minutes.";

        SendMessageToPC(oPlayer, sMessage);
        SetLocalInt(oTorch, "BURNT", iBurnt + 1);
    }

    DelayCommand(59.9, SetLocalInt(oTorch, "WAIT_MODE", FALSE));

    if (oCheck == oTorch)
    DelayCommand(60.0, TorchFade(oTorch, oPlayer));
}

void main()
{
    int nEvent =GetUserDefinedItemEventNumber();
    if (nEvent !=  X2_ITEM_EVENT_EQUIP) return;
    object oTorch = GetPCItemLastEquipped();
    object oPC = GetPCItemLastEquippedBy();

    TorchFade(oTorch, oPC);
}


Just another option. Kept is simple and it does what you asked for. '=]'
               
               

               
            

Legacy_Herrlichkeit

  • Newbie
  • *
  • Posts: 10
  • Karma: +0/-0
Question on Burning Torches?
« Reply #6 on: May 31, 2011, 11:47:25 pm »


               @Henesua-- Thanks for the suggestion. I gave it a shot, but this one also doesn't seem to function correctly on my module. There has to be something that I'm not doing right when implementing both scripts.

@Fester Pot-- I tried the script with both yours and the main version and made sure that the tag was correct. Neither of the versions seemed to be working for me. The torch acts as though it's ignoring the timer and never burns out.

@GhostOfGod-- I like the idea of using a tag based script, actually. It worked well at first when I tested it, but unfortunately the script continues to run after you unequip the torch, so the torch keeps burning out even when you're not holding it. =O Did I miss putting in a command for unequiping it?

I'm hoping to add realism to some of the areas of my module to contrast with other areas. For example, the Underdark is /dark/. Those with low light vision will be really uncomfortable, while those that live underground, such as the Dark Elves, will have Darkvision and be able to see. Those that have normal eyesight, such as the humans, won't be able to navigate without torches.

I'm not too keen on having torches that last forever, though. There has to be some sort of risk to venturing belowground.
               
               

               
            

Legacy_henesua

  • Hero Member
  • *****
  • Posts: 6519
  • Karma: +0/-0
Question on Burning Torches?
« Reply #7 on: June 01, 2011, 12:05:53 am »


               Thats odd that it didn't work for you. The system doesn't integrate with anything else. As long as you put the hooks into your module's event scripts, it should function. Perhaps you didn't completely merge the scripts into your own. Have you tried the system in a test module in which the light system is the only thing you implement? I find it a good way to learn how a system works.
               
               

               
            

Legacy_Herrlichkeit

  • Newbie
  • *
  • Posts: 10
  • Karma: +0/-0
Question on Burning Torches?
« Reply #8 on: June 01, 2011, 01:00:55 am »


               Well, after some patience and effort I figured out how to implement the script Fester Pot showed to me and it's working well. Thank you all so much for your help! ^__^
               
               

               
            

Legacy_GhostOfGod

  • Hero Member
  • *****
  • Posts: 1490
  • Karma: +0/-0
Question on Burning Torches?
« Reply #9 on: June 01, 2011, 01:15:01 am »


               Updated tag based version. Sorry bout that last one. My logic is pretty fuzzy a lot. This one works better:


#include "x2_inc_switches"

const int TORCH_LIFE_SPAN = 2;//minutes the torch will last

void TorchFade(object oTorch, object oPlayer)
{
    if (GetLocalInt(oTorch, "WAIT_MODE") == TRUE) return;
    SetLocalInt(oTorch, "WAIT_MODE", TRUE);
    DelayCommand(59.9, SetLocalInt(oTorch, "WAIT_MODE", FALSE));
    object oCheck = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPlayer);

    if (oCheck == oTorch)
    {
        int iBurnt = GetLocalInt(oTorch, "BURNT");

        if (iBurnt == TORCH_LIFE_SPAN)
        {
            DelayCommand(1.0, AssignCommand(oPlayer, ActionUnequipItem(oTorch)));
            DestroyObject(oTorch, 2.0);
            SendMessageToPC(oPlayer, "Your torch has burnt out.");
        }
        else
        {
            int iTimeLeft = TORCH_LIFE_SPAN - iBurnt;
            string sMessage;
            if (iTimeLeft == 1) sMessage = "Your torch will burn out in 1 minute.";
            else sMessage = "Your torch will burn out in " + IntToString(iTimeLeft) + " minutes.";

            SendMessageToPC(oPlayer, sMessage);
            SetLocalInt(oTorch, "BURNT", iBurnt + 1);
        }
        DelayCommand(60.0, TorchFade(oTorch, oPlayer));
    }
}

void main()
{
    int nEvent =GetUserDefinedItemEventNumber();
    if (nEvent !=  X2_ITEM_EVENT_EQUIP) return;
    object oTorch = GetPCItemLastEquipped();
    object oPC = GetPCItemLastEquippedBy();

    TorchFade(oTorch, oPC);
}


This uses a 1 minute pseudo HB. The way it works as is, when you equip the torch the one minute HB will start. If the player only has the torch equipped for 10 seconds and the player puts the torch away, that one minute HB is still running. The player will be able to equip or unequip that torch as much or as little as they want within that one minute but one minute of burn time will still be taken from the torch. So if the torch has one minute left when they equip the torch and only have the torch equipped for 10 seconds and then they unequip it, if a minute has passed by the next time they equip the torch, the torch will be destroyed right away. Hope that makes sense.

There are other ways to go about doing this via a tag based solution. Could make the pseudo HB to be more like a few seconds but that probably wouldn't help much with module efficiency. This is just the way I thought to do it off the top of my head.

EDIT: Oops. I posted before I read that you got it working. Glad to hear you got a solution.
               
               

               


                     Modifié par GhostOfGod, 01 juin 2011 - 12:18 .
                     
                  


            

Legacy_Herrlichkeit

  • Newbie
  • *
  • Posts: 10
  • Karma: +0/-0
Question on Burning Torches?
« Reply #10 on: June 01, 2011, 04:04:23 am »


               Not a problem. Thanks for helping out, GhostofGod. I really appreciate it.

On another note, I'm doing some work on an underwater environment. I plan on allowing a race of Water Elves that can breathe underwater. Otherwise, it's possible to get your hands on a helmet that aides in breathing underwater.

I have everything working just fine. I just don't like how moving around underwater looks like walking. Can any of you tell me how to change the phenotype to flying for certain areas? I'm having a hard time find information on this.

I tried to implement one of the underwater hak packs, but I kept getting an access violation code, whether I was using a new module set or not.

Thanks again for all of your help!
               
               

               
            

Legacy_GhostOfGod

  • Hero Member
  • *****
  • Posts: 1490
  • Karma: +0/-0
Question on Burning Torches?
« Reply #11 on: June 01, 2011, 05:38:31 am »


               If you are using CEP you will want to use the function "SetPhenoType" and set it to either 25 for characters who used the "fat" phenotype(2) or 16 for normal phenotype. Which means that you have to GetPhenoType first to determine which one to use. Furthermore you will also need to store the players current phenotype before going into the current water area so that you can put it back to normal when they leave that area.
You will also probably want to forbid any horse mounting in your underwater areas as that will open up a whole other can of worms with the phenotypes.

These are the reasons I never implemented the flying phenotype in my underwater system on the vault. That and not everyone uses CEP. It can get a bit messy. I do have it set up to use the flying phenotype for myself though. And I use a database item for all players to store things like their current phenotype and what not.

Good luck.
               
               

               


                     Modifié par GhostOfGod, 01 juin 2011 - 04:43 .
                     
                  


            

Legacy_Artistmonk

  • Jr. Member
  • **
  • Posts: 54
  • Karma: +0/-0
Question on Burning Torches?
« Reply #12 on: June 02, 2011, 02:28:33 am »


               Useful indeed.