Tes4Mod:Cobl/Modding/Alchemical Sorter
The UESPWiki – Your source for The Elder Scrolls since 1995
COBL (Common Oblivion) contains an alchemical sorter by PhoenixAmon (nee Daleth) and updated by haama.
Contents |
[edit] Features
- Store all of your ingredients with the click of a button.
- Retrieve ingredients by effect - you'll be given a list of effects that you can make with your ingredients, select as many as you want and the ingredients that have that effect (corrected for Alchemy rank) will be moved to the player.
- With OBSE v12, will work with any ingredient from any mod and an expanded set of effects (v1.16).
- Also, two buttons have been added to make it easier to create potions on the fly. These allow the player to open the Alchemy menu while the Effects list is still open, create their potions, then reset the list of effects and see what other potions they can make (v1.48).
- With OBSE v11, will also work with potions and scrolls (v1.48).
- If the player is using a mod with COBL's dinner plate, this can also open a menu with only food items (v1.26).
[edit] Modder Basics
Simplest usage by modders is to drop one of the existing alchemical sorter containers in their mod. These are single containers that have the appearance of a shelf of containers (i.e., although the mesh looks like several different containers, it's actually just one.) You'll find these under containers -- their editors ids start with with cobAlsShelf (LC, MC and UC indicate Lower Class, Middle Class and Upper Class respectively).
If you want to use a different container mesh (standard chest, standard cabinet, etc.) just create the container object as desired, and set its script to cobAlsTriggerOS. (Note: Make sure that the container is not set to respawn.)
Most likely, that's all you'll need to do. However, if you want to do more (create portable sorters, use multiple containers, etc.), then read on...
Tip: If you would like the shelves to look like they're built into the wall, you might use cobAlsShelfMC and push it back into the wall until the backing is hidden. If the backing sticks out slightly to the side of a narrow wall, then try changing the scale of the reference to shrink it.
[edit] Remote Access
The Trigger script has been updated (v1.48) to allow remote access without the need for a new script - meaning your Alchemical Sorter will have all future features and updates. The new system can also work during MenuMode so you can use inventory items as "Alchemy Bags". Details:
- Create a remote cell.
- Create a new Activator with an appropriate EditorID (i.e., "ModNameAlsTriggerObj") and attach the trigger script (cobAlsTriggerFAS) to it.
- Create the Activator reference and give it a Reference Editor ID (i.e., "ModNameAlsTrigger") and check "Persistent Reference" and "Initially Disabled".
- Create a container reference - if you don't mind the normal chest open/close sound you can use cobGenChest. If you need to use a different opening/closing sound you can use cobGenChest as a base.
- Create your object or item and apply this script (note this will work for both inventory items in Journal mode and objects in the game mode)
scn MyModObjectScript
begin onActivate
if (IsActionRef player)
set MyModAlsTrigger.rUseContainer to MyModRemoteContainer
MyModAlsTrigger.Activate cobGenActRef, 1
endif
end
begin onEquip
if (GetContainer == player)
set MyModAlsTrigger.rUseContainer to MyModRemoteContainer
MyModAlsTrigger.Activate cobGenActRef, 1
endif
end
[edit] Pre-v1.48
By default, the sorter stores all ingredients in one container and all 3 of its functions are triggered by that container. If you want to use that default behavior, you only need to add your own storage container using whatever mesh you like, make sure it is not set to respawn, and attach the Trigger script.
You can set this up differently, and the trigger script is commented more heavily than you probably need. :) The main thing you need to know is if you want objects or actors other than the storage bin to trigger the effects, you needs your storage container to be a Persistent Reference with a unique name. You'll then need to clone the parts of the trigger script you want to use and replace "GetSelf" with the name of your container reference. Note that you must create a new script instead of editing COBL's, and that by doing so the script will not be updated when/if there is a COBL update (i.e., won't have v1.48's potion and scroll sorting).
[edit] Multiple Containers
If you want to use multiple containers to store your alchemy ingredients, you need to do a bit more work. I'll do my best to explain that here. First off, you still need a main storage container. This container should be placed in the gameworld somewhere outside of the player's sight (the way merchant containers are). Make sure it is not set to respawn. Once it's placed, make it a Persistent Reference and give it a unique name. In my samples, I'll call it "MyMainContainerRef".
You will need an object or actor to trigger the Storage part of the sorter, with a trimmed-down version of the trigger script mentioned above. If you look at the trigger script, it'll be easy to see what you need.
At this point you can choose to use a separate container for each ingredient name or a separate container for each potion effect.
[edit] Separate Containers by Ingredient
You need one container for every ingredient name. There are several sets you can download or you can make your own. You do not need to make these containers persistent references. Each container needs to have a script like the following:
scn AlchContAlkanetFlower ;Set the name to fit with your mod (i.e., "ModNameIngJarAlkanetFlowerOS")
short iCount
ref rIngredient
ref rMainCont
short ContOpened
Begin OnActivate
if (IsActionRef player)
;Change these two references to suit your script
set rIngredient to AlkanetFlower ;Set this to the base reference Editor ID of the ingredient
set rMainCont to MyMainContainerRef ;Set this to the Reference Editor ID of your container
set iCount to rMainCont.GetItemCount rIngredient
If iCount > 0
rMainCont.RemoveItem rIngredient iCount
AddItem rIngredient iCount
EndIf
set ContOpened to -1
Activate player ;Be sure that you leave out the 1 or RunOnActivate flag
Endif
End
Begin MenuMode 1008 ;Container menu - using this to avoid any complications if the container takes a few frames to open
If ContOpened
set ContOpened to 1
EndIf
End
Begin GameMode
If ContOpened
If (ContOpened == 1)
RemoveAllItems rMainCont ;Return all ingredients to the main container
EndIf
EndIf
End
Each script only needs 3 things changed: the script name, the ingredient reference and the container reference. Now after your trigger object or actor has put the ingredients away into the main storage container, the player can activate the small containers to take ingredients out by name.
[edit] Separate Containers by Effect
You need one container for every potion effect the player can make. I don't know of any downloadable sets for this. You do not need to make these containers persistent. Each container needs to have a script like the following:
scn AlchContBurdenOS
ref rSelf
short ContOpened
Begin OnActivate
if (IsActionRef player)
;Change these to suit your script
set cobAlsSorterFAR.inRContainer to MyMainContainerRef ;Set this to the Reference Editor ID of your container
set cobAlsSorter1.iBurden to 1 ;Set to the effect, see below for the list
set cobAlsSorterFAR.inItemType to 25 ;For Ingredients, set to 40 for Potions or 21 for Scrolls
cobAlsSorterFAR.Activate cobGenActRef, 1
set rSelf to GetSelf
cobAlsTempRef.RemoveAllItems rSelf
set ContOpened to -1
Activate player ;Be sure that you leave out the 1 or RunOnActivate flag
endif
End
Begin MenuMode 1008 ;Container menu - using this to avoid any complications if the container takes a few frames to open
If ContOpened
set ContOpened to 1
EndIf
End
Begin GameMode
If ContOpened
If (ContOpened == 1)
RemoveAllItems rMainCont ;Return all ingredients to the main container
EndIf
EndIf
End
Each script only needs 3 things changed: the script name, the container reference and the effect. If you'd like to use this for potions or scrolls, change the ItemType number and make sure to test for the proper OBSE version with
...
set cobAlsSorterFAR.inItemType to 25 ;For Ingredients, set to 40 for Potions or 21 for Scrolls
SetStage cobSigSE 0
if (cobSigSE.Version < 11)
messagebox "You need (at least) OBSE v11 to use this sorter."
return
endif
...
Also, be sure the player is using at least COBL v1.53 before using this. You can check in an init script or here with
...
SetStage cobSigSE 0
if (cobSigSE.VersionCOBL < 1.53)
messagebox "You need (at least) COBL v1.53 to use this sorter."
return
endif
...
[edit] Pre-v1.53 and Post-v1.47
scn AlchContBurdenOS
ref rMainCont
ref rSelf
short ItemType
short ContOpened
Begin OnActivate
if (IsActionRef player)
;Change these to suit your script
set rMainCont to MyMainContainerRef ;Set this to the Reference Editor ID of your container
set cobAlsSorter1.iBurden to 1 ;Set to the effect, see below for the list
set ItemType to 25 ;For Ingredients, set to 40 for Potions or 21 for Scrolls
SetStage cobSigSe 0
if (cobSigSe.version >= 11)
set cobAlsSorterSeFAR.inRContainer to rMainCont
set cobAlsSorterSeFAR.ItemType to ItemType
cobAlsSorterSeFAR.Activate cobGenActRef, 1
else
set cobAlsSorter1FAR.inRContainer to rMainCont
cobAlsSorter1FAR.Activate cobGenActRef, 1
set cobAlsSorter2FAR.inRContainer to rMainCont
cobAlsSorter2FAR.Activate cobGenActRef, 1
set cobAlsSorter3FAR.inRContainer to rMainCont
cobAlsSorter3FAR.Activate cobGenActRef, 1
set cobAlsSorter4FAR.inRContainer to rMainCont
cobAlsSorter4FAR.Activate cobGenActRef, 1
endif
set rSelf to GetSelf
cobAlsTempRef.RemoveAllItems rSelf
set ContOpened to -1
Activate player ;Be sure that you leave out the 1 or RunOnActivate flag
endif
End
Begin MenuMode 1008 ;Container menu - using this to avoid any complications if the container takes a few frames to open
If ContOpened
set ContOpened to 1
EndIf
End
Begin GameMode
If ContOpened
If (ContOpened == 1)
RemoveAllItems rMainCont ;Return all ingredients to the main container
EndIf
EndIf
End
Same instructions as with the Post-v1.52 system. The system is fully backwards compatible, and this method continues to work with v1.53.
[edit] Pre-v1.48
It's strongly advised to use one of the above systems because v1.48 adds a lot to the Alchemical Sorter. However, if you do decide to use this system - The system is fully backwards compatible, and this method continues to work with v1.48 and all later versions.
scn AlchContBurdenScr
short bActive
short bEmpty
float Timer
Begin OnActivate
if (IsActionRef player)
;Change these to suit your script
set cobAlsCounter1.rContainer to MyMainContainerRef ;Set this to the Reference Editor ID of your container
set cobAlsSorter1.iBurden to 1 ;Set to the effect, see below for the list
set cobAlsCounterVars.bEffectContainers to 1
set cobAlsCounter1.iAlchSkill to player.GetBaseAV Alchemy
set cobAlsSorter1.fQuestDelayTime to 0.01
set bActive to 1
StartQuest cobAlsSorter1
endif
End
Begin GameMode
If bActive
If Timer < 0.7
set Timer to Timer + GetSecondsPassed
Else
cobAlchTempRef.Activate player ;Be sure that you leave out the 1 or RunOnActivate flag
set Timer to 0
set bEmpty to 1
set bActive to 0
EndIf
ElseIf bEmpty
cobAlchTempRef.RemoveAllItems MyMainContainerRef
set bEmpty to 0
EndIf
End
That might look a little horrid, but you only need to change a few things for each effect container. Each needs it's own script name. Each needs "MyMainContainerRef" changed to the name of your main container reference.
The only other line to worry about is "set cobAlsSorter1.iBurden to 1". In that line, you need to change "Burden" to the name of the effect for the particular container. Remove any spaces or dashes (-) from the effect name, like the ones listed below.
In that same line, you need to set the right quest name for the effect you're working on. I tried to put all those variables in a single script, but it didn't work as I'd hoped so I had to split them up. The correct quest names are as follows:
[edit] Effects
cobAlsSorter1 --
iBurden
iChameleon
iCureDisease
iCureParalysis
iCurePoison
iDamageAgility
iDamageEndurance
iDamageFatigue
iDamageHealth
iDamageIntelligence
iDamageLuck
iDamageMagicka
cobAlsSorter2 --
iDamagePersonality
iDamageSpeed
iDamageStrength
iDamageWillpower
iDetectLife
iDispel
iDrainHealth
iFeather
iFireDamage
iFireShield
iFortifyAgility
iFortifyEndurance
iFortifyFatigue
iFortifyHealth
iFortifyIntelligence
iFortifyLuck
iFortifyMagicka
iFortifyPersonality
iFortifySpeed
iFortifyStrength
iFortifyWillpower
cobAlsSorter3 --
iFrostDamage
iFrostShield
iInvisibility
iLight
iNightEye
iParalyze
iReflectDamage
iReflectSpell
iResistDisease
iResistFire
iResistFrost
iResistParalysis
iResistPoison
iResistShock
iRestoreAgility
iRestoreEndurance
iRestoreFatigue
iRestoreHealth
iRestoreIntelligence
iRestoreLuck
iRestoreMagicka
iRestorePersonality
iRestoreSpeed
iRestoreStrength
iRestoreWillpower
cobAlsSorter4 --
iShield
iShockDamage
iShockShield
iSilence
iWaterBreathing
iWaterWalking
cobAlsSorterVars --
;--Vanilla effects that can NOT be made with vanilla ingredients
iAbsorbAgility
iAbsorbEndurance
iAbsorbIntelligence
iAbsorbLuck
iAbsorbPersonality
iAbsorbSpeed
iAbsorbStrength
iAbsorbWillpower
iAbsorbFatigue
iAbsorbHealth
iAbsorbMagicka
iAbsorbArmorer
iAbsorbAthletics
iAbsorbBlade
iAbsorbBlock
iAbsorbBlunt
iAbsorbH2H
iAbsorbHeavyArmor
iAbsorbAlchemy
iAbsorbAlteration
iAbsorbConjuration
iAbsorbDestruction
iAbsorbIllusion
iAbsorbMysticism
iAbsorbRestoration
iAbsorbAcrobatics
iAbsorbLightArmor
iAbsorbMarksman
iAbsorbMercantile
iAbsorbSecurity
iAbsorbSpeechcraft
iAbsorbSneak
iBoundAxe
iBoundBoots
iBoundBow
iBoundCuirass
iBoundDagger
iBoundGauntlets
iBoundGreaves
iBoundHelmet
iBoundMace
iBoundShield
iBoundSword
iCalm
iCharm
iCommandCreature
iCommandHumanoid
iDemoralize
iDisintegrateArmor
iDisintegrateWeapon
iDrainAgility
iDrainEndurance
iDrainIntelligence
iDrainLuck
iDrainPersonality
iDrainSpeed
iDrainStrength
iDrainWillpower
iDrainFatigue
iDrainMagicka
iDrainArmorer
iDrainAthletics
iDrainBlade
iDrainBlock
iDrainBlunt
iDrainH2H
iDrainHeavyArmor
iDrainAlchemy
iDrainAlteration
iDrainConjuration
iDrainDestruction
iDrainIllusion
iDrainMysticism
iDrainRestoration
iDrainAcrobatics
iDrainLightArmor
iDrainMarksman
iDrainMercantile
iDrainSecurity
iDrainSpeechcraft
iDrainSneak
iFortifyArmorer
iFortifyAthletics
iFortifyBlade
iFortifyBlock
iFortifyBlunt
iFortifyH2H
iFortifyHeavyArmor
iFortifyAlchemy
iFortifyAlteration
iFortifyConjuration
iFortifyDestruction
iFortifyIllusion
iFortifyMysticism
iFortifyRestoration
iFortifyAcrobatics
iFortifyLightArmor
iFortifyMarksman
iFortifyMercantile
iFortifySecurity
iFortifySpeechcraft
iFortifySneak
iFrenzy
iOpen
iRally
iResistMagic
iResistNormalWeapons
iScriptedEffect
iSoulTrap
iSpellAbsorption
iStuntedMagicka
iSummonClannfear
iSummonDaedroth
iSummonDremora
iSummonDremoraLord
iSummonFadedWraith
iSummonMDArmor
iSummonMDHelm
iSummonFlameAtronach
iSummonFrostAtronach
iSummonGhost
iSummonGloomWraith
iSummonHeadlessZombie
iSummonLich
iSummonScamp
iSummonSkeleton
iSummonSkeletonChamp
iSummonSkeletonHero
iSummonSkeletonGuardian
iSummonSpiderDaedra
iSummonStormAtronach
iSummonXivilai
iSummonSpiderling
iSummonBear
iSummonZombie
iTelekinesis
iTurnUndead
iVampirism
iWeaknessToDisease
iWeaknessToFire
iWeaknessToFrost
iWeaknessToMagic
iWeaknessToNormalWeapons
iWeaknessToPoison
iWeaknessToShock
;--Shivering Isles Effects
iSummonFleshMangled
iSummonFleshSewn
iSummonFleshStitched
iSummonFleshTorn
iSummonHunger
iSummonHungerGluttonous
iSummonHungerRavenous
iSummonHungerVoracious
iSummonSaint
iSummonSeducer
iSummonShambles
iSummonShamblesDecrepit
iSummonShamblesReplete

![[Content is available under Attribution-ShareAlike]](http://www.uesp.net/w/images/Somerights.png)