Author Topic: Notice of Upcoming Update affecting ambient generic entities  (Read 875 times)

wallworm

  • Administrator
  • Hero Member
  • *****
  • Posts: 3673
  • Karma: 101
  • Behind me?
    • View Profile
Notice of Upcoming Update affecting ambient generic entities
« on: September 02, 2020, 07:39:50 pm »
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

  • Global Moderator
  • Full Member
  • *****
  • Posts: 232
  • Karma: 27
  • WallWorm Ambassador
    • View Profile
Re: Notice of Upcoming Update affecting ambient generic entities
« Reply #1 on: September 03, 2020, 03:57:03 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.
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

  • Administrator
  • Hero Member
  • *****
  • Posts: 3673
  • Karma: 101
  • Behind me?
    • View Profile
Re: Notice of Upcoming Update affecting ambient generic entities
« Reply #2 on: September 03, 2020, 06:57:42 pm »
The FGD data made the radius be a string (with text input) for several entities :

Code: [Select]
radius(string) : "Max Audible Distance" : "1250" : "Maximum distance at which this sound is audible."
Here are the entities that I see this problem going to occur from base.fgd :

  • ambient_generic
  • env_physexplosion
  • physics_cannister
  • trigger_proximity
« Last Edit: September 03, 2020, 07:02:08 pm by wallworm »

Joris Ceoen

  • Global Moderator
  • Full Member
  • *****
  • Posts: 232
  • Karma: 27
  • WallWorm Ambassador
    • View Profile
Re: Notice of Upcoming Update affecting ambient generic entities
« Reply #3 on: September 04, 2020, 05:32:27 am »
  • ambient_generic
  • env_physexplosion
  • physics_cannister
  • trigger_proximity
No problem!

wallworm

  • Administrator
  • Hero Member
  • *****
  • Posts: 3673
  • Karma: 101
  • Behind me?
    • View Profile
Re: Notice of Upcoming Update affecting ambient generic entities
« Reply #4 on: November 27, 2020, 01:47:05 pm »
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: [Select]
/*
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()

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: [Select]
::WallWormEntityDataTypeHelper.retrieveOldValues()

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.
« Last Edit: November 27, 2020, 01:49:11 pm by wallworm »