Jump to content

DOWNLOAD MODS

Are you looking for something shiny for your load order? We have many exclusive mods and resources you won't find anywhere else. Start your search now...

LEARN MODDING

Ready to try your hand at making your own mod creations? Visit the Enclave, the original ES/FO modding school, and learn the tricks of the trade from veteran modders...

JOIN THE ALLIANCE

Membership is free and registering unlocks image galleries, project hosting, live chat, unlimited downloads, & more...

scansurfer

Allies
  • Posts

    3
  • Joined

  • Last visited

Posts posted by scansurfer

  1. OK, I figured it out well enough to suit my purposes. The magic function that makes it all work in my case is the OBSE function GetFirstRefInCell, using its parameter for also accessing the surrounding cells. Since the IC worldspaces are smallish, a single call to GetFirstRefInCell (for flora) will access every single cell in the worldspace that has anything in it, without accessing anything beyond that. So I only needed to access 6 cells ... rather than 6 worldspaces ... to get Refs for all the flora objects I needed.

    Which of course means that I didn't need to enumerate the children of the worldspace itself. I looked into that, too, and it looks like I'd need to write a dll plugin and compile it with all the OBSE stuff to get that to work. So it's a good thing I don't need to do that, because OBSE isn't compiling very well right now on my recent MSVC.

    One funny thing was that I couldn't access the cells in the ICPalace using the script. When the script started parsing, if I had any ICPalaceXX cells in the script, the script would immediately stop executing.

     

    scriptName ICmushrooms
    ref nextCcell
    ref nextFlora
    short nextCell
    short hp_flys
    short hp_lotus
    short hp_gcup
    short hp_sblue
    short other
    short season
    begin ScriptEffectStart
    
    	; figure out which season it is, based on the month
    	if GameMonth > 2
    		set season to (GameMonth - 3) / 4
    	else
    		set season to 3
    	endif
    	Label 10
    	if nextCell == 0
    		set nextCcell to ICMarketDistrict04
    	elseif nextCell == 1
    		set nextCcell to ICArena06
    	elseif nextCell == 2
    		set nextCcell to ICArboretum01
    	elseif nextCell == 3
    		set nextCcell to ICTalosPlazaDistrict03
    	elseif nextCell == 4
    		set nextCcell to ICElvenGardensDistrict03
    	else
    		set nextCcell to ICTempleDistrict02
    	endif
    
    	set nextFlora to GetFirstRefInCell nextCcell 31 2		; loop through all flora in each worldspace
    	Label 20
    	set other to 0
    	if ( nextFlora ) ; continue until all refs are processed
    		if nextFlora.IsHarvested == 0
    			if nextFlora.GetIngredient == FlyAmanitaCap
    				set hp_flys to nextFlora.GetIngredientChance season
    			elseif nextFlora.GetIngredient == SacredLotusSeeds
    				set hp_lotus to nextFlora.GetIngredientChance season
    			elseif nextFlora.GetIngredient == GreenStainCupCap
    				set hp_gcup to nextFlora.GetIngredientChance season
    			elseif nextFlora.GetIngredient == SteelBlueEntolomaCap
    				set hp_sblue to nextFlora.GetIngredientChance season
    			else
    				set other to 1		; nirnroot
    			endif
    			if other == 0
    				nextFlora.SetHarvested 1
    			endif
    		endif
    		set nextFlora to getNextRef
    		Goto 20
    	endif
    
    	set nextCell to nextCell + 1
    	if nextCell < 6
    		goto 10
    	endif
    	; in the IC, there are 199 fly amanitas, 63 sacred lotus, 11 green stain cups, and 27 entelomas
    	; -- add the correct number of each to the player
    	set hp_flys to (199 * hp_flys) / 100
    	playerRef.addItem FlyAmanitaCap hp_flys
    	set hp_lotus to (63 * hp_lotus) / 100
    	playerRef.addItem SacredLotusSeeds hp_lotus
    	set hp_gcup to (11 * hp_gcup) / 100
    	playerRef.addItem GreenStainCupCap hp_gcup
    	set hp_sblue to (27 * hp_sblue) / 100
    	playerRef.addItem SteelBlueEntolomaCap hp_sblue
    
    end

     

     

  2. Newbie warning: this is only my second scripted spell.

    Overview: I want to create a cheater spell that harvests all the mushrooms and lotus seeds in the Imperial City in one swipe.

    Of course, the IC consists of seven worldspaces, which each consist of several dozen cells.

    I could go through by hand and make a very large ArrayVar of every cell that contains a flora, and try to loop through them all that way.

    But I would really prefer to loop over the seven worldspaces, and find all their children cells, and loop over those in turn in a subloop.

    (I can do the technical part of building the spell and giving it to the player just fine.)

    Attempted so far:

    When I try to access, for example, the ICMarketDistrict worldspace with .GetNumChildRefs, I get a compiler error that ICMarketDistrict is not an ObjectID.

    If I try to do it by taking a child cell (ICMarketDistrict01) and calling .GetParentCell to get an ObjectID, the CS crashes when I compile.

    Is there a simple way to enumerate the cells within a worldspace in a script? (If so, am I close to getting it right?)

    Can I call SetHarvested on a flora that's not "in memory" -- ie. in the current cell?

     

×
×
  • Create New...