Tracker Device - SetTitleText/SetDescriptionDescription/SetTarget don't work for players who join in progress

Reference ID

e002d298-406c-94e2-4890-75bdfa831590

Please select what you are reporting on:

Verse

What Type of Bug are you experiencing?

Devices

Summary

Hello,

There is an issue with these 3 methods in the “tracker_device” :

  • SetTitleText
  • SetDescriptionText
  • SetTarget

Context :

  • I have a player (A) who is already in the game (before we start the game with the “Start Game” button)
  • I have a player (B) who joined the game after it started
  • When the game starts, I set a custom title, description, and a target value on verse.

When I assign the tracker to all the players in the game :

  • A will have the tracker with the new title, description, and target value set on verse
  • B will have the tracker with the default title, description, and target value set in the editor.

If I try to set the title, description, and target again with the same value as for A, nothing will happen (Because I’m trying to set the same values as in the server so the modification won’t be applied to the clients). But if I set different values, the modifications will be applied (Because it will be different from the server).

To sum up the bug, if the values (Title, Description, and target value) of a tracker device and a player joins the game in progress, the new player won’t have the updated version.

Steps to Reproduce

  • Start the game with the player ‘A’
  • In a verse device with the function ‘OnBegin’, modify the title, description, and target value of the tracker device.
  • Join the game with the player ‘B’
  • When ‘B’ has joined, assign the tracker to all players

Expected Result

Both players must have the tracker assigned with the title, description, and target value corresponding to those set from the verse code.

Observed Result

  • ‘A’ will have the tracker with the new title, description, and target value set on verse
  • ‘B’ will have the tracker with the default title, description, and target value set in the editor.

Platform(s)

windows

Additional Notes

Tracker Setup :
Tracker Device Setup

My verse device :
Debug Game Manager Device Setup


# Built-In Verse Modules :
using {/Fortnite.com/Devices}
using {/Fortnite.com/Playspaces}
using {/Verse.org/Simulation}
using {/Verse.org/Random}

# Custom Modules :
using {Scripts.Modules.Debug}

# Custom Extensions :
using {Scripts.Extensions.ArrayExt}
using {Scripts.Extensions.FortPlayspaceExt}
using {Scripts.Extensions.TrackerExt}

# Custom Tags :
debug_game_manager_device_tag <public> := class(meta4_device_tag) {}

# Custom Log Channel :
debug_game_manager_device_log_channel <internal> := class(meta4_device_log_channel) {}

# A Verse-authored creative device that can be placed in a level
debug_game_manager_device := class(creative_device) {

	# ==============================[Protected Properties]============================== #

		@editable
		Tracker : tracker_device = tracker_device {}

		@editable
		TitleFromVerse : string = "This is the title set from verse"

		@editable
		DescriptionFromVerse : string = "This is the tracker description set from verse"

		@editable
		TargetValueFromVerse : int = 100

		@editable
		bUpdateTrackerOnPlayerAdded : logic = false

		@editable
		AssignAllTrackerButton : button_device = button_device {}

		@editable
		AssignToAgentTrackerButton : button_device = button_device {}

		@editable
		RemoveAllTrackerButton : button_device = button_device {}

		@editable
		RemoveToAgentTrackerButton : button_device = button_device {}

		@editable
		IncrementingButton : button_device = button_device {}

		@editable
		DecrementingButton : button_device = button_device {}

		@editable
		IncreaseTargetValueButton : button_device = button_device {}

		@editable
		DecreaseTargetValueButton : button_device = button_device {}

		@editable
		RandomTrackerTextButton : button_device = button_device {}

		@editable
		ForceInitialzeTrackerButton : button_device = button_device {}

	# ==============================[Public Methods]============================== #
		
		OnBegin <override> () <suspends> : void = {
			Playspace : fort_playspace = GetPlayspace()

			# Devices Initializations
			InitializeTracker()

			# Subscriptions
			AssignAllTrackerButton.InteractedWithEvent.Subscribe(OnAssignAllTrackerButtonInteracted) 
			AssignToAgentTrackerButton.InteractedWithEvent.Subscribe(OnAssignToAgentTrackerButtonInteracted) 
			RemoveAllTrackerButton.InteractedWithEvent.Subscribe(OnRemoveAllTrackerButtonInteracted) 
			RemoveToAgentTrackerButton.InteractedWithEvent.Subscribe(OnRemoveToAgentTrackerButtonInteracted) 
			IncrementingButton.InteractedWithEvent.Subscribe(OnIncrementingButtonInteracted) 
			DecrementingButton.InteractedWithEvent.Subscribe(OnDecrementingButtonInteracted)
			IncreaseTargetValueButton.InteractedWithEvent.Subscribe(OnIncreaseTargetValueButtonInteracted)
			DecreaseTargetValueButton.InteractedWithEvent.Subscribe(OnDecreaseTargetValueButtonInteracted)
			RandomTrackerTextButton.InteractedWithEvent.Subscribe(OnRandomTrackerTextButtonInteracted)
			ForceInitialzeTrackerButton.InteractedWithEvent.Subscribe(OnForceInitialzeTrackerButtonInteracted)

			Playspace.PlayerAddedEvent().Subscribe(OnPlayerAdded)

			Log("[OnBegin]")
		}


	# ==============================[Protected Methods]============================== #
	
		InitializeTrackerRandomText <protected> () : void = {
			RandomTitle := GenerateRandomString(GetRandomInt(5,10))
			RandomDescription := GenerateRandomString(GetRandomInt(15,25))
			Tracker.SetText(RandomTitle, RandomDescription)
		}

		InitializeTrackerRandomTarget <protected> () : void = {
			Tracker.SetTarget(GetRandomInt(15,20))
		}

		InitializeTrackerRandom <protected> () : void = {
			InitializeTrackerRandomText()
			InitializeTrackerRandomTarget()
		}
		
		InitializeTracker <protected> () : void = {
			Tracker.SetText(TitleFromVerse, DescriptionFromVerse)
			Tracker.SetTarget(TargetValueFromVerse)
		}
		
	# ==============================[Private Methods]============================== #
		
		OnRandomTrackerTextButtonInteracted <private> (Agent : agent) : void = {
			Log("[InitializeTrackerText]", debug_game_manager_device_log_channel)
			InitializeTrackerRandomText()
		}

		OnAssignAllTrackerButtonInteracted <private> (Agent : agent) : void = {
			Log("[OnAssignAllTrackerButtonInteracted] : ", debug_game_manager_device_log_channel)
			Tracker.AssignToAll()
		}

		OnAssignToAgentTrackerButtonInteracted <private> (Agent : agent) : void = {
			Log("[OnAssignToAgentTrackerButtonInteracted] : ", debug_game_manager_device_log_channel)
			Tracker.Assign(Agent)
		}

		OnRemoveAllTrackerButtonInteracted <private> (Agent : agent) : void = {
			Log("[OnRemoveAllTrackerButtonInteracted] : ", debug_game_manager_device_log_channel)
			Tracker.RemoveFromAll()
		}

		OnRemoveToAgentTrackerButtonInteracted <private> (Agent : agent) : void = {
			Log("[OnRemoveToAgentTrackerButtonInteracted] : ", debug_game_manager_device_log_channel)
			Tracker.Remove(Agent)
		}

		OnIncrementingButtonInteracted <private> (Agent : agent) : void = {
			CurrentValue := Tracker.GetValue()
			NewValue := Tracker.GetValue() + 1
			Log("[OnIncrementingButtonInteracted] : CurrentTarget = {CurrentValue} | NewTarget = {NewValue}", debug_game_manager_device_log_channel)
			Tracker.SetValue(NewValue)
		}

		OnDecrementingButtonInteracted <private> (Agent : agent) : void = {
			CurrentValue := Tracker.GetValue()
			NewValue := Tracker.GetValue() - 1
			Log("[OnDecrementingButtonInteracted] : CurrentTarget = {CurrentValue} | NewTarget = {NewValue}", debug_game_manager_device_log_channel)
			Tracker.SetValue(NewValue)
		}

		OnIncreaseTargetValueButtonInteracted <private> (Agent : agent) : void = {
			CurrentTarget := Tracker.GetTarget()
			NewTarget := Tracker.GetTarget() + 1
			Log("[OnIncreaseTargetValueButtonInteracted] : CurrentTarget = {CurrentTarget} | NewTarget = {NewTarget}", debug_game_manager_device_log_channel)
			Tracker.SetTarget(NewTarget)
		}

		OnDecreaseTargetValueButtonInteracted <private> (Agent : agent) : void = {
			CurrentTarget := Tracker.GetTarget()
			NewTarget := Tracker.GetTarget() - 1
			Log("[OnDecreaseTargetValueButtonInteracted] : CurrentTarget = {CurrentTarget} | NewTarget = {NewTarget}", debug_game_manager_device_log_channel)
			Tracker.SetTarget(NewTarget)
		}

		OnPlayerAdded <private> (Player : player) : void = {
			bUpdateTrackerOnPlayerAddedStr := if (bUpdateTrackerOnPlayerAdded?) then "True" else "False"
			Log("[OnPlayerAdded] : bUpdateTrackerOnPlayerAdded = {bUpdateTrackerOnPlayerAddedStr}", debug_game_manager_device_log_channel)

			if (bUpdateTrackerOnPlayerAdded?) :
				UpdateTrackerOnPlayerAdded()
		}

		OnForceInitialzeTrackerButtonInteracted <private> (Agent : agent) : void = {
			Log("[OnForceInitialzeTrackerButtonInteracted]", debug_game_manager_device_log_channel)
			InitializeTracker()
		}

		UpdateTrackerOnPlayerAdded <private> () : void = {
			Log("[UpdateTrackerOnPlayerAdded]", debug_game_manager_device_log_channel)
			InitializeTracker()
		}
}


GenerateRandomString <public> (Length : int) : string = {
	Chars := "abcdefghijklmnopqrstuvwxyz"
	var Result : string = ""

	for (Index := 0 .. Length) :
		if (RandomChar := Chars.GetRandom[]) :
			set Result += array {RandomChar}

	return Result
}

Player ‘A’ in the game when launched :

Joining Player ‘B’ POV :

3 Likes

The status of UCB-1008 incident has been moved from ‘Needs Triage’ to ‘Closed’.

Also experiencing this issue with updating tracker details via Verse for players who join in progress, they only get assigned the default configuration of the tracker.

OP has already provided a fantastic amount of info already, but thought I should reply as the Bug-Reporter response seems to indicate that the issue is closed/resolved - which isn’t the case, this problem is still occuring.

Bug still exists

Can confirm this is Still happening as of 29.40 Patch!