24.01 Release Notes
Updates to Maximum Publish Download Size
- The maximum download size for publishing has been increased from 300MB to 400MB. In the future we intent to have per platform limitations that will vary.
Known Issues
- Validation
- For the 24.01 release, Spray Decals will not validate. This will prevent you from playing these projects. Please remove Spray Decals until this issue addressed at a later date
- If you add the Day Sequence Device, Delete it and Undo, the editor may be in a conflicted state where lighting updates do not work. In this case, please close the editor and re-open it.
- If you are using Perforce, and Hide Selected in the Outliner, then saving, will result in every file in that level (for one file per actor) being checked out and the save of the level failing. This will be addressed in a future release.
- Under “World Settings”, if you remove the “Day Night Cycle” from the “World Time of Day Manager”, you may not be able to save your level. If using Perforce, it also may result in the check out of every file in the one file per actor system. This will be addressed in a future release.
- After using the event binding in Creative Edit mode, if those devices are copy and pasted in the editor, they will lose their event binding references. This only affects events bound in the Fortnite client and doesn’t affect devices bound in the UEFN editor. This will be fixed in a future release.
- Vaulting - Enabling Vaulting on the island settings results in vaulting not functioning in play.
- Engaging tactical sprint while in the pre-game phase of an island running from a test island code results in broken sprinting animation state.
- If the user disables the sprinting and sliding, players will see buggy sprint animation when trying to sprint and slide while in edit mode.
Removals
- Verse API from the following devices has been removed
- The following API in AI devices have been removed. They will return in the future with an improved API.
- Creature Spawner Device
- EliminatedEvent
- Guard Spawner Device
- SpawnedEvent
- EliminatedEvent
- EliminatingPlayerEvent
- EliminatingAIEvent
- HiredEvent
- DismissedEvent
- AlertedToAgentEvent
- TargetLostEvent
- Hire
- DismissAllHiredGuards
- DismissAgentHiredGuards
- Wildlife Spawner Device
- SpawnedEvent
- EliminatedEvent
- TamedEvent
- UntamedEvent
- ForceSpawnedEvent
- EliminatedByANeutralAgentEvent
- EliminatedByAnEnemyAgentEvent
- EliminatedByPredatorEvent
- DamagedEvent
- SomethingIsEatenEvent
- RiddenEvent
- DismountedEvent
- Tame
- UntameAll
- UntameFromAgent
- EliminatedTamedFromAgent
- Ride
- DismountAgent
- RestoreEnergyForAgent
- ConsumeEnergyForAgent
- Creature Spawner Device
Updates / Refactors
-
EpicGames.com module has been renamed to UnrealEngine.com. Replace using { /EpicGames.com/*** } with using { /UnrealEngine.com/*** }.
-
Some events were changed to have an optional agent result. You should now check to see if there was an agent or not.
- creature_placer_device.EliminatedEvent()
- wildlife_spawner_device.DamagedEvent()
- supply_drop_spawner_device.BalloonPoppedEvent()
Example:
Was:
AwaitTrigger(Trigger:trigger_device, GroupEvent:event(agent))<suspends>:void =
GroupEvent.Signal(Trigger.TriggeredEvent.Await())
Is now:
AwaitTrigger(Trigger:trigger_device, GroupEvent:event(agent))<suspends>:void =
loop:
MaybeAgent := Trigger.TriggeredEvent.Await()
if (TriggerAgent := MaybeAgent?):
GroupEvent.Signal(TriggerAgent)
break # exit loop
# No agent so loop back for another trigger
Devices
The Verse team has been performing final reviews for the 24.01 release. This review resulted in changes to standardize the Verse API and minimize inconsistencies.
Device Name | Before | After |
---|---|---|
animated_mesh_device | PauseAnimation() | Pause() |
animated_mesh_device | PlayAnimation() | Play() |
animated_mesh_device | PlayReverseAnimation() | PlayReverse() |
attribute_trigger_device | attribute_trigger_device | attribute_evaluator_device |
audio_player_device | RegisterAgent(Agent:agent) | Register(Agent:agent) |
audio_player_device | UnregiseterAllAgents() | UnregisterAll() |
audio_player_device | UnregisterAgent(Agent:agent) | Unregister(Agent:agent) |
cancelable interface | cancellable | cancelable |
capture_area_device | ResetTeamControl() | Reset() |
character_device | TurnOffVisibility() | Hide() |
character_device | TurnOnVisibility() | Show() |
class_selector_ui_device | ShowPopupUI() | Show() |
creature_spawner_device | CreatureEliminatedEvent:listenable(agent) | EliminatedEvent:listenable(?agent) |
down_but_not_out_device | DownAgent(Agent:agent) | Down(Agent:agent) |
down_but_not_out_device | ReviveAgent(Agent:agent) | Revive(Agent:agent) |
elimination_manager_device | EliminationEvent:listenable(agent) | EliminationEvent:listenable(?agent) |
explosive_device | TurnOffVisibility() | Hide() |
explosive_device | TurnOnVisibility() | Show() |
fishing_zone_device | ResetUses() | Reset() |
fort_br_team_collection | AddAgentToTeam(InAgent:agent, InTeam:team) | AddToTeam(InAgent:agent, InTeam:team) |
fort_br_team_collection | GetAgentsOnTeam(InTeam:team) | GetAgents(InTeam:team) |
fort_br_team_collection | GetTeamForAgent(InAgent:agent) | GetTeam(InAgent:agent) |
fort_br_team_collection | IsAgentOnTeam(InAgent:agent, InTeam:team) | IsOnTeam(InAgent:agent, InTeam:team) |
fort_character | SetVisible(IsVisible:logic) | Show()/Hide() |
fort_minigame_team_collection | AddAgentToTeam(InAgent:agent, InTeam:team) | AddToTeam(InAgent:agent, InTeam:team) |
fort_minigame_team_collection | GetAgentsOnTeam(InTeam:team) | GetAgents(InTeam:team) |
fort_minigame_team_collection | GetTeamForAgent(InAgent:agent) | GetTeam(InAgent:agent) |
fort_minigame_team_collection | IsAgentOnTeam(InAgent:agent, InTeam:team) | IsOnTeam(InAgent:agent, InTeam:team) |
fort_team_collection | AddAgentToTeam(InAgent:agent, InTeam:team) | AddToTeam(InAgent:agent, InTeam:team) |
fort_team_collection | GetAgentsOnTeam(InTeam:team) | GetAgents(InTeam:team) |
fort_team_collection | GetTeamForAgent(InAgent:agent) | GetTeam(InAgent:agent) |
fort_team_collection | IsAgentOnTeam(InAgent:agent, InTeam:team) | IsOnTeam(InAgent:agent, InTeam:team) |
fuel_pump_device | RestockFuel() | Reset() |
guard_spawner_device | EliminatedEvent:listenable(agent) | EliminatedEvent:listenable(?agent) |
guard_spawner_device | ResetTotalSpawnCount() | Reset() |
hud_message_device | GetMessage() | GetText() |
hud_message_device | SetMessage() | SetText() |
item_granter_device | ClearSaveDataForAgent(Agent:agent) | ClearSaveData(Agent:agent) |
objective_device | TurnOffVisibility() | Hide() |
objective_device | TurnOnVisibility() | Show() |
player_counter_device | GetShowInfoPanel() | IsShowingInfoPanel[] |
player_counter_device | ResetTargetCount() | Reset() |
player_counter_device | SetShowInfoPanel(Show:logic) | ShowInfoPanel(); HideInfoPanel() |
popup_dialog_device | HideFromAll() | Hide() |
popup_dialog_device | ShowToAll() | Show() |
prop_mover_device | MovementFinishedEvent() | FinishedEvent() |
prop_mover_device | MovementStartedEvent() | BeganEvent() |
prop_mover_device | MovementStoppedEvent() | EndedEvent() |
race_manager_device | BeginRace() | Begin() |
race_manager_device | EndRace() | End() |
race_manager_device | RaceStartedByManagerEvent() | RaceBeganEvent() |
radio_device | RegisterAgent(Agent:agent) | Register(Agent:agent) |
radio_device | UnregiseterAllAgents() | UnregisterAll() |
radio_device | UnregisterAgent(Agent:agent) | Unregister(Agent:agent) |
sentry_device | EliminatedEvent:listenable(agent) | EliminatedEvent:listenable(?agent) |
sequencer_device | BeginSequence() | Begin() |
sequencer_device | EndSequence() | End() |
sequencer_device | sequencer_device | pulse_trigger_device |
supply_drop_spawner_device | LockSupplyDrop() | Lock() |
supply_drop_spawner_device | OpenSupplyDrop(Agent:agent) | Open(Agent:agent) |
supply_drop_spawner_device | SpawnSupplyDrop() | Spawn() |
supply_drop_spawner_device | SpawnSupplyDrop(Agent:agent) | Spawn(Agent:agent) |
supply_drop_spawner_device | UnlockSupplyDrop() | Unlock() |
switch_device | ClearAgentPersistenceData(Agent:agent) | ClearPersistenceData(Agent:agent) |
timed_objective_device | StartedEvent() | BeganEvent() |
timed_objective_device | StoppedEvent() | EndedEvent() |
timer_device | FailureEvent:listenable(agent) | FailureEvent:listenable(?agent) |
timer_device | SetLapTimeForAgent(Agent:agent) | SetLapTime(Agent:agent) |
timer_device | StartUrgencyModeEvent:listenable(agent) | StartUrgencyModeEvent:listenable(?agent) |
timer_device | SuccessEvent:listenable(agent) | SuccessEvent:listenable(?agent) |
tracker_device | DecrementProgress(Agent:agent) | Decrement(Agent:agent) |
tracker_device | IncrementProgress(Agent:agent) | Increment(Agent:agent) |
tracker_device | LoadForAgent(Agent:agent) | Load(Agent:agent) |
tracker_device | ResetProgress(Agent:agent) | Reset(Agent:agent) |
trigger_base_device | ResetTimesTriggered() | Reset() |
vfx_creator_device | BeginEffectAtAgent(Agent:agent) | Begin(Agent:agent) |
vfx_creator_device | BeginEffectAtDevice() | Begin() |
vfx_creator_device | BeginEffectForAllAgents() | BeginForAll() |
vfx_creator_device | EndEffectAtAgent(Agent:agent) | End(Agent:agent) |
vfx_creator_device | EndEffectAtDevice() | End() |
vfx_creator_device | EndEffectForAllAgents() | EndForAll() |
vfx_creator_device | RemoveEffectFromAgent(Agent:agent) | Remove(Agent:agent) |
vfx_creator_device | RemoveEffectFromAllAgents() | RemoveFromAll() |
vfx_creator_device | SpawnAtAgent(Agent:agent) | SpawnAt(Agent:agent) |
vfx_creator_device | ToggleEffectAtAgent(Agent:agent) | Toggle(Agent:agent) |
vfx_creator_device | ToggleEffectAtDevice() | Toggle() |
vfx_creator_device | ToggleEffectForAllAgents() | ToggleForAll() |
vfx_creator_device | ToggleEffectPauseAtAgent(Agent:agent) | TogglePause(Agent:agent) |
vfx_creator_device | ToggleEffectPauseAtDevice() | TogglePause() |
vfx_creator_device | ToggleEffectPauseForAllAgents() | TogglePauseForAll() |
video_player_device | EndAllStreaming() | EndForAll() |
water_device | ResetWater() | Reset() |
wildlife_spawner_device | EliminatedEvent:listenable(agent) | EliminatedEvent:listenable(?agent) |
wildlife_spawner_device | ResetTotalSpawnCount() | Reset() |
Recap of 24.00 release highlights
Validation
24.00 introduces asset validation. This validation verifies that the content is allowed in a UEFN project. There may be issues with assets or devices that you believe are valid but prevent your project from being uploaded.
Please see this post for more details: Handling Content Validation in 24.00
Verse API Changes for 24.00
These are included if you were upgrading a project that is upgrading from a release prior to 24.00
Removals
- editable_text_base, editable_text, and editable_text_box widgets have been removed from the UI API
- material_block and texture_block widgets have been removed
Updates / Refactors
- Support for Verse code finding props and user devices by tag
- This includes renaming
- GetDevicesWithTag to GetCreativeObjectsWithTag
- GetDevicesWithTags to GetCreativeObjectsWithTags
- These methods also return a creative_object_interface which can then be cast to each of these.
# Some test code for finding all of these that have an all_tag on them and then casting to the appropriate type
AllCreativeObjects:[]creative_object_interface := GetCreativeObjectsWithTag(all_tag{})
for (PropItem:AllCreativeObjects):
if (TheProp := creative_prop[PropItem]):
Logger.Print("Prop found with all_tag at position: {TheProp.GetTransform().Translation}")
for (DeviceItem:AllCreativeObjects):
if (TheDevice := creative_device_base[DeviceItem]):
Logger.Print("Creative device found with all_tag at position: {TheDevice.GetTransform().Translation}")
for (UserDeviceItem:AllCreativeObjects):
if (TheDevice := creative_device[UserDeviceItem]):
Logger.Print("User device found with all_tag at position: {TheDevice.GetTransform().Translation}")
- Rename ToStringSeparated to Join
- Removed vector3.XAxis, vector3.YAxis, vector3.ZAxis
- Removed fort_character.IsDown and added fort_character.IsActive to indicate the character is active. If IsActive returns false, most character actions will silently fail.
- Added vector3.IsAlmostZero(tolerance) and IsAlmostEqual(vector3, vector3, tolerance) to more easily allow testing for these states.
- Add support for NamedColors.Tan
Devices
-
Audio Player
- Audio Player now uses Play() and Stop() instead of Activate() and Deactivate()
- Audio Player now has an option to call Play(Agent) or Stop(Agent) if you want to direct audio at a specific user.
-
Radio
- Radio now uses Play() and Stop() instead of PlayRadio() and Stop Radio()
-
Random Number Generator Device
- Device no longer takes an optional Agent argument. Instead users can either choose to call a function with a mandatory Agent argument, or one with no arguments at all.
-
Switch Device
- Device no longer takes an optional Agent argument. Instead users can either choose to call a function with a mandatory Agent argument, or one with no arguments at all.
-
Timer Device
- Device no longer takes an optional Agent argument. Instead users can either choose to call a function with a mandatory Agent argument, or one with no arguments at all.
-
Bear Spawner Device
- bear_spawner_device has been renamed to vehicle_spawner_pickup_truck_device
-
Mudflap Spawner Device
- mudflap_spawner_device has been renamed to vehicle_spawner_big_rig_device
-
Prevalent Spawner Device
- Prevalent_spawner_device has been renamed to vehicle_spawner_sedan_device
-
Whiplash Spawner Device
- whiplash_spawner_device has been renamed to vehicle_spawner_sports_car_device