Design Tools > Wall Worm Level Design in 3ds Max

Notice of Upcoming Update affecting ambient generic entities

(1/1)

wallworm:
I'm going to add an update to WW soon that has a visual helper for the radius of some entity parameters (like for env_soundscape and ambient_generic). The problem is that to do this correctly, I need to make sure that the parameters for these functions are float values. Unfortunately, due to the way the FGD files are written, the radius parameter for some entities (ambient_generic, for example) were stored as strings instead of floats. In my update, these will convert to floats. But here is the catch--the update to Custom Attributes that changes a parameter type does not allow the current value to propagate. This means that any existing scenes will get the default value applied to all ambient_generic radius values.

I can write a function that can embed the current value that can later be retrieved into the updated entities, but it must be done on a scene BEFORE updating to the version of WW that has these entity updates.

I want to try and get an idea about how many people this will affect as well as how many scenes. I need to know if it's worth my time to built this function.

Joris Ceoen:

--- Quote from: wallworm on September 02, 2020, 07:39:50 pm ---I want to try and get an idea about how many people this will affect as well as how many scenes. I need to know if it's worth my time to built this function.
--- End quote ---
For me, specifically for Daigo, won't be a problem because I hadn't any ambient_generic entities. Not sure about other entities (prop_static also have a radius option for visibility optimization), but I'm 100% positive I haven't dabbled with any of the radius values on any possible entity in my scene, aka they're all the default as it is in Hammer.

wallworm:
The FGD data made the radius be a string (with text input) for several entities :


--- Code: ---radius(string) : "Max Audible Distance" : "1250" : "Maximum distance at which this sound is audible."
--- End code ---

Here are the entities that I see this problem going to occur from base.fgd :


* ambient_generic
* env_physexplosion
* physics_cannister
* trigger_proximity

Joris Ceoen:

--- Quote from: wallworm on September 03, 2020, 06:57:42 pm ---
* ambient_generic
* env_physexplosion
* physics_cannister
* trigger_proximity
--- End quote ---
No problem!

wallworm:
I am about to release an update to Wall Worm with this change. Below is a MAXScript that you can run before updating to store the current values that will be affected:


--- Code: ---/*
struct WallWormEntityDataTypeHelper (
--values stored as strings that will be converted to floats in a custom attribute update and we need to store it because
stringsThatWillBeFloats = #("radius"), --make array in case we add more in future
/*
This script will embed entity parameters that are strings but will be converted to floats in a custom attribute update.
This is necessary because when a custom attribute parameter type is changed, it's current value is not kept (converted) but reverts to parameter default value.
*/
function storeCurrentValues = (
local updatedEnts = #()
for ent in ::WallWormHelperOps.entities WHERE isvalidnode ent do (
local ca = ::WallWormEntityOps.getEntCA ent
if ca != undefined then (
for p in stringsThatWillBeFloats do (
if isProperty ca p then (
local v = (getProperty ca p)
if classof v != float then (
setUserProp ent (("wallworm_entity_store_"+p) as name) (v as string)
append updatedEnts ent
)
)
)
)
)
if updatedEnts.count > 0 then (
selectionSets["Entities that Stored old values"] = updatedEnts
)
),
function retrieveOldValues = (
if ::WallWormHelperOps.entities.count > 0 then (
local paramsToCheck = #()
for p in stringsThatWillBeFloats do (
append paramsToCheck (datapair p (("wallworm_entity_store_"+p) as name))
)
for ent in ::WallWormHelperOps.entities WHERE isvalidnode ent do (
local ca = ::WallWormEntityOps.getEntCA ent
if ca != undefined then (
for p in paramsToCheck do (
local storedVal = getUserProp ent p.v2
if storedVal != undefined AND storeVal != "" then (
if isProperty ca p.v1 then (
--do a try because we cannot guarantee the string value can be converted to the data type
try (
setProperty ca p.v1 (storedVal as (classof (getProperty ca p.v1)))
) catch (
format "ERROR: Could not set % to % in %\n" p.v1 storedVal ent
)
)
)
)
)
)
)
)
)

::WallWormEntityDataTypeHelper = WallWormEntityDataTypeHelper()

--- End code ---

To use this

* click Scripting > New Script
* Paste that code into your MAXScript File
* Click Tools > Evaluate All (CTRL+E)
* In the MAXScript Listener (F11) paste this code and then hit ENTER: ::WallWormEntityDataTypeHelper.storeCurrentValues()
Now the script will store the current values.

To retrieve the values after you update Wall Worm, you can then run this command in the MAXScript listener:

--- Code: ---::WallWormEntityDataTypeHelper.retrieveOldValues()
--- End code ---


IMPORTANT NOTE: You must run this code before updating to Wall Worm 5.0.41+ on each scene that you want to preserve the radius values of entities. If you do not have entities that use the radius parameter (or the radius was already defined as a float in the FGD you are using), you do not need to concern with this script.

Navigation

[0] Message Index

Go to full version