function methods.GetMessageHeight(t,d,y,I)I=I or y.AbsoluteSize.X local Z=t:GetStringTextBounds(d.Text,d.Font,d.TextSize,UDim2.new(0,I,0,1000))return Z.Y end function methods.GetNumberOfSpaces(t,d,y,I)local Z=t:GetStringTextBounds(d,y,I)local a=t:GetStringTextBounds(" ",y,I)return math.ceil(Z.X/a.X)end function methods.CreateBaseMessage(Z,d,y,I,t)local a=Z:GetFromObjectPool("\070\114\097\109\101")a.Selectable=false a.Size=UDim2.new(1,0,0,18)a.Visible=true a.BackgroundTransparency=1 local X=8 local O=Z:GetFromObjectPool("\084\101\120\116\076\097\098\101\108")O.Selectable=false O.Size=UDim2.new(1,-(X+6),1,0)O.Position=UDim2.new(0,X,0,0)O.BackgroundTransparency=1 O.Font=y O.TextSize=I O.TextXAlignment=Enum.TextXAlignment.Left O.TextYAlignment=Enum.TextYAlignment.Top O.TextTransparency=0 O.TextStrokeTransparency=.625 O.TextStrokeColor3=Color3.new(1.0,.8078431372549,.95686274509804)O.TextColor3=t O.TextWrapped=true O.Text=d O.Visible=true O.Parent=a return a,O end function methods.AddNameButtonToBaseMessage(Z,d,y,I,t)local a=Z:GetStringTextBounds(I,d.Font,d.TextSize)local X=Z:GetFromObjectPool("\084\101\120\116\066\117\116\116\111\110")X.Selectable=false X.Size=UDim2.new(0,a.X,0,a.Y)X.Position=UDim2.new(0,0,0,0)X.BackgroundTransparency=1 X.Font=d.Font X.TextSize=d.TextSize X.TextXAlignment=d.TextXAlignment X.TextYAlignment=d.TextYAlignment X.TextTransparency=d.TextTransparency X.TextStrokeTransparency=d.TextStrokeTransparency X.TextStrokeColor3=Color3.new(.73725490196078,.14509803921569,.28235294117647)X.TextColor3=y X.Text=I X.Visible=true X.Parent=d X.MouseButton1Click:connect(function()Z:NameButtonClicked(X,t)end)return X end function methods.AddChannelButtonToBaseMessage(Z,d,y,I,t)local a=Z:GetStringTextBounds(I,d.Font,d.TextSize)local X=Z:GetFromObjectPool("\084\101\120\116\066\117\116\116\111\110")X.Selectable=false X.Size=UDim2.new(0,a.X,0,a.Y)X.Position=UDim2.new(0,0,0,0)X.BackgroundTransparency=1 X.Font=d.Font X.TextSize=d.TextSize X.TextXAlignment=d.TextXAlignment X.TextYAlignment=d.TextYAlignment X.TextTransparency=d.TextTransparency X.TextStrokeTransparency=d.TextStrokeTransparency X.TextColor3=y X.Text=I X.Visible=true X.Parent=d X.MouseButton1Click:connect(function()Z:ChannelButtonClicked(X,t)end)return X end function methods.NameButtonClicked(I,d,y)if not I.ChatWindow then return end if ChatSettings.ClickOnPlayerNameToWhisper then local d=Players:FindFirstChild(y)if d and d~=LocalPlayer then local d="\084\111 "..y if I.ChatWindow:GetChannel(d)then I.ChatBar:ResetCustomState()local y=I.ChatWindow:GetTargetMessageChannel()if y~=d then I.ChatWindow:SwitchCurrentChannel(d)end I.ChatBar:ResetText()I.ChatBar:CaptureFocus()elseif not I.ChatBar:IsInCustomState()then local d="\047\119 "..y I.ChatBar:CaptureFocus()I.ChatBar:SetText(d)end end end end function methods.ChannelButtonClicked(I,d,y)if not I.ChatWindow then return end if ChatSettings.ClickOnChannelNameToSetMainChannel then if I.ChatWindow:GetChannel(y)then I.ChatBar:ResetCustomState()local d=I.ChatWindow:GetTargetMessageChannel()if d~=y then I.ChatWindow:SwitchCurrentChannel(y)end I.ChatBar:ResetText()I.ChatBar:CaptureFocus()end end end function methods.RegisterChatWindow(y,d)y.ChatWindow=d y.ChatBar=d:GetChatBar()end function methods.GetFromObjectPool(y,d)if y.ObjectPool==nil then return Instance.new(d)end return y.ObjectPool:GetInstance(d)end function methods.RegisterObjectPool(y,d)y.ObjectPool=d end function methods.RegisterGuiRoot(y,d)testLabel.Parent=d end
--// Above was taken directly from Util.GetStringTextBounds() in the old chat corescripts.

function methods:GetMessageHeight(BaseMessage, BaseFrame, xSize)
	xSize = xSize or BaseFrame.AbsoluteSize.X
	local textBoundsSize =
		self:GetStringTextBounds(BaseMessage.Text, BaseMessage.Font, BaseMessage.TextSize, UDim2.new(0, xSize, 0, 1000))
	return textBoundsSize.Y
end

function methods:GetNumberOfSpaces(str, font, textSize)
	local strSize = self:GetStringTextBounds(str, font, textSize)
	local singleSpaceSize = self:GetStringTextBounds(" ", font, textSize)
	return math.ceil(strSize.X / singleSpaceSize.X)
end

function methods:CreateBaseMessage(message, font, textSize, chatColor)
	local BaseFrame = self:GetFromObjectPool("Frame")
	BaseFrame.Selectable = false
	BaseFrame.Size = UDim2.new(1, 0, 0, 18)
	BaseFrame.Visible = true
	BaseFrame.BackgroundTransparency = 1

	local messageBorder = 8

	local BaseMessage = self:GetFromObjectPool("TextLabel")
	BaseMessage.Selectable = false
	BaseMessage.Size = UDim2.new(1, -(messageBorder + 6), 1, 0)
	BaseMessage.Position = UDim2.new(0, messageBorder, 0, 0)
	BaseMessage.BackgroundTransparency = 1
	BaseMessage.Font = font
	BaseMessage.TextSize = textSize
	BaseMessage.TextXAlignment = Enum.TextXAlignment.Left
	BaseMessage.TextYAlignment = Enum.TextYAlignment.Top
	BaseMessage.TextTransparency = 0
	BaseMessage.TextStrokeTransparency = 0.625
	BaseMessage.TextStrokeColor3 = Color3.new(255 / 255, 206 / 255, 244 / 255)
	BaseMessage.TextColor3 = chatColor
	BaseMessage.TextWrapped = true
	BaseMessage.Text = message
	BaseMessage.Visible = true
	BaseMessage.Parent = BaseFrame

	return BaseFrame, BaseMessage
end

function methods:AddNameButtonToBaseMessage(BaseMessage, nameColor, formatName, playerName)
	local speakerNameSize = self:GetStringTextBounds(formatName, BaseMessage.Font, BaseMessage.TextSize)
	local NameButton = self:GetFromObjectPool("TextButton")
	NameButton.Selectable = false
	NameButton.Size = UDim2.new(0, speakerNameSize.X, 0, speakerNameSize.Y)
	NameButton.Position = UDim2.new(0, 0, 0, 0)
	NameButton.BackgroundTransparency = 1
	NameButton.Font = BaseMessage.Font
	NameButton.TextSize = BaseMessage.TextSize
	NameButton.TextXAlignment = BaseMessage.TextXAlignment
	NameButton.TextYAlignment = BaseMessage.TextYAlignment
	NameButton.TextTransparency = BaseMessage.TextTransparency
	NameButton.TextStrokeTransparency = BaseMessage.TextStrokeTransparency
	NameButton.TextStrokeColor3 = Color3.new(188 / 255, 37 / 255, 72 / 255)
	NameButton.TextColor3 = nameColor
	NameButton.Text = formatName
	NameButton.Visible = true
	NameButton.Parent = BaseMessage

	NameButton.MouseButton1Click:connect(function()
		self:NameButtonClicked(NameButton, playerName)
	end)

	return NameButton
end

function methods:AddChannelButtonToBaseMessage(BaseMessage, channelColor, formatChannelName, channelName)
	local channelNameSize = self:GetStringTextBounds(formatChannelName, BaseMessage.Font, BaseMessage.TextSize)
	local ChannelButton = self:GetFromObjectPool("TextButton")
	ChannelButton.Selectable = false
	ChannelButton.Size = UDim2.new(0, channelNameSize.X, 0, channelNameSize.Y)
	ChannelButton.Position = UDim2.new(0, 0, 0, 0)
	ChannelButton.BackgroundTransparency = 1
	ChannelButton.Font = BaseMessage.Font
	ChannelButton.TextSize = BaseMessage.TextSize
	ChannelButton.TextXAlignment = BaseMessage.TextXAlignment
	ChannelButton.TextYAlignment = BaseMessage.TextYAlignment
	ChannelButton.TextTransparency = BaseMessage.TextTransparency
	ChannelButton.TextStrokeTransparency = BaseMessage.TextStrokeTransparency
	ChannelButton.TextColor3 = channelColor
	ChannelButton.Text = formatChannelName
	ChannelButton.Visible = true
	ChannelButton.Parent = BaseMessage

	ChannelButton.MouseButton1Click:connect(function()
		self:ChannelButtonClicked(ChannelButton, channelName)
	end)

	return ChannelButton
end

function methods:NameButtonClicked(nameButton, playerName)
	if not self.ChatWindow then
		return
	end

	if ChatSettings.ClickOnPlayerNameToWhisper then
		local player = Players:FindFirstChild(playerName)
		if player and player ~= LocalPlayer then
			local whisperChannel = "To " .. playerName
			if self.ChatWindow:GetChannel(whisperChannel) then
				self.ChatBar:ResetCustomState()
				local targetChannelName = self.ChatWindow:GetTargetMessageChannel()
				if targetChannelName ~= whisperChannel then
					self.ChatWindow:SwitchCurrentChannel(whisperChannel)
				end
				self.ChatBar:ResetText()
				self.ChatBar:CaptureFocus()
			elseif not self.ChatBar:IsInCustomState() then
				local whisperMessage = "/w " .. playerName
				self.ChatBar:CaptureFocus()
				self.ChatBar:SetText(whisperMessage)
			end
		end
	end
end

function methods:ChannelButtonClicked(channelButton, channelName)
	if not self.ChatWindow then
		return
	end

	if ChatSettings.ClickOnChannelNameToSetMainChannel then
		if self.ChatWindow:GetChannel(channelName) then
			self.ChatBar:ResetCustomState()
			local targetChannelName = self.ChatWindow:GetTargetMessageChannel()
			if targetChannelName ~= channelName then
				self.ChatWindow:SwitchCurrentChannel(channelName)
			end
			self.ChatBar:ResetText()
			self.ChatBar:CaptureFocus()
		end
	end
end

function methods:RegisterChatWindow(chatWindow)
	self.ChatWindow = chatWindow
	self.ChatBar = chatWindow:GetChatBar()
end

function methods:GetFromObjectPool(className)
	if self.ObjectPool == nil then
		return Instance.new(className)
	end
	return self.ObjectPool:GetInstance(className)
end

function methods:RegisterObjectPool(objectPool)
	self.ObjectPool = objectPool
end

function methods:RegisterGuiRoot(root)
	testLabel.Parent = root
end
