hey everyone im currently working on a story game kind of like field trip z but right now im lost. I have a viewport frame but it captures me whenever an npc talks, i just want to get the npc on there as well as the player when they are talking.
this is what i have right now
here is the current local script inside of the MainGui
local StarterGui = game:GetService("StarterGui")
local RunService = game:GetService('RunService')
local createDialogueEvent = game.ReplicatedStorage.Remotes.createDialogueEvent
local hideDialogueEvent = game.ReplicatedStorage.Remotes.hideDialogueEvent
local setDialogueImageEvent = game.ReplicatedStorage.Remotes.setDialogueImageEvent
local richText = require(game.ReplicatedStorage.Modules.RichText)
local player = game.Players.LocalPlayer
local dialogueFrame = player.PlayerGui.MainGui.Frame
local setDialogueImageEventMonster = game.ReplicatedStorage.Remotes.setDialogueImageEventMonster
local setDialogueImageEventGhost = game.ReplicatedStorage.Remotes.setDialogueImageEventGhost
local RunService = game:GetService('RunService')
local UserInputService = game:GetService("UserInputService")
--Localize
local instance, newRay = Instance.new, Ray.new
local v2, v3, cf, udim2 = Vector2.new, Vector3.new, CFrame.new, UDim2.new
local insert, random, abs = table.insert, math.random, math.abs
local Player = game.Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded:Wait()
--Basic setup
local ViewPort = script.Parent.Frame.ViewportFrame
--Settings
local Offset = cf(0, 1, -6)
--Create the viewport camera
local Camera = instance("Camera")
ViewPort.CurrentCamera = Camera
local ValidClasses = {
["MeshPart"] = true; ["Part"] = true; ["Accoutrement"] = true;
["Pants"] = true; ["Shirt"] = true;
["Humanoid"] = true;
}
local PartUpdater
local function swooshSound()
local sound = Instance.new("Sound", game.ReplicatedStorage)
sound.PlaybackSpeed = 1
sound.Volume = 1
sound.PlayOnRemove = true
sound.SoundId = "rbxassetid://4845387138"
sound:Destroy()
end
hideDialogueEvent.OnClientEvent:Connect(function()
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Backpack, true)
swooshSound()
dialogueFrame:TweenPosition(UDim2.new(0.5, 0, 2, 0), 0.1)
end)
createDialogueEvent.OnClientEvent:Connect(function(english, spanish)
if dialogueFrame.Position ~= UDim2.new(0.5, 0, 0.85, 0) then
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Backpack, false)
dialogueFrame:TweenPosition(UDim2.new(0.5, 0, 0.85, 0), 0.1)
end
local ln = game:GetService("LocalizationService").RobloxLocaleId
local content = english
if ln == "en-us" then
content = english
elseif ln == "es-es" then
if spanish then
content = spanish
end
end
local textObject = richText:New(dialogueFrame.textFrame, content)
textObject:Animate(true)
end)
local function cleanVPF()
if dialogueFrame.ViewportFrame:FindFirstChildOfClass("Model") then
dialogueFrame.ViewportFrame:FindFirstChildOfClass("Model"):Destroy()
end
if dialogueFrame.ViewportFrame:FindFirstChildOfClass("Camera") then
dialogueFrame.ViewportFrame:FindFirstChildOfClass("Camera"):Destroy()
end
end
local function renderHumanoid(model, parent)
local modelParts = model:GetDescendants()
for i = 1, #modelParts do
local part = modelParts[i]
if ValidClasses[part.ClassName] then
local archivable = part.Archivable
part.Archivable = true
local renderClone = part:Clone()
part.Archivable = archivable
if part.ClassName == "MeshPart" or part.ClassName == "Part" then
PartUpdater = RunService.Heartbeat:Connect(function()
if part then
renderClone.CFrame = part.CFrame
else
renderClone:Destroy()
PartUpdater:Disconnect()
end
end)
elseif part:IsA("Accoutrement") then
PartUpdater = RunService.Heartbeat:Connect(function()
if part then
if renderClone.Handle then
renderClone.Handle.CFrame = part.Handle.CFrame
end
else
renderClone:Destroy()
PartUpdater:Disconnect()
end
end)
elseif part:IsA("Humanoid") then
local nameTag = Instance.new("BillboardGui")
nameTag.Name = "NameTag"
nameTag.Adornee = renderClone
nameTag.Parent = parent
local nameLabel = Instance.new("TextLabel")
nameLabel.Text = model.Name
nameLabel.TextSize = 14
nameLabel.TextStrokeTransparency = 0.5
nameLabel.Parent = nameTag
nameTag.StudsOffset = Vector3.new(0, 2, 0)
end
renderClone.Parent = parent
end
end
end
local function CaptureImage(model, camera)
local player = game.Players.LocalPlayer
local viewportFrame = Instance.new("ViewportFrame")
viewportFrame.Size = UDim2.new(1, 0, 1, 0)
viewportFrame.CurrentCamera = camera
viewportFrame.BackgroundTransparency = 1
for _, part in pairs(model:GetDescendants()) do
if part:IsA("BasePart") then
part.LocalTransparencyModifier = 0 -- Make sure the part is not transparent
end
end
model.Parent = viewportFrame
local imageLabel = Instance.new("ImageLabel")
imageLabel.Size = UDim2.new(1, 0, 1, 0)
imageLabel.BackgroundTransparency = 1
imageLabel.Parent = player.PlayerGui
wait(2) -- Adjust this wait time as needed
-- Cleanup
viewportFrame:Destroy()
model.Parent = game.Workspace
for _, part in pairs(model:GetDescendants()) do
if part:IsA("BasePart") then
part.LocalTransparencyModifier = 1 -- Restore original transparency
end
end
end
setDialogueImageEventMonster.OnClientEvent:Connect(function(model, color)
dialogueFrame.PlayerName.TextColor3 = Color3.new(0, 0, 0)
dialogueFrame.PlayerName.TextStrokeColor3 = Color3.new(0.82089, 0, 0)
dialogueFrame.PlayerName.TextStrokeTransparency = 0
dialogueFrame.Message.TextColor3 = Color3.new(0, 0, 0)
dialogueFrame.Message.TextStrokeTransparency = 0
dialogueFrame.Message.TextStrokeColor3 = Color3.new(0.82089, 0, 0)
dialogueFrame.PlayerName.Text = model.name
local image = CaptureImage(model, Camera)
renderHumanoid(model, dialogueFrame.ViewportFrame)
end)
setDialogueImageEventGhost.OnClientEvent:Connect(function(model, color)
dialogueFrame.PlayerName.TextColor3 = Color3.new(1, 1, 1)
dialogueFrame.PlayerName.TextStrokeColor3 = Color3.new(0.197635, 0.66746, 1)
dialogueFrame.PlayerName.TextStrokeTransparency = 0
dialogueFrame.Message.TextColor3 = Color3.new(1, 1, 1)
dialogueFrame.Message.TextStrokeTransparency = 0
dialogueFrame.Message.TextStrokeColor3 = Color3.new(0.197635, 0.66746, 1)
dialogueFrame.PlayerName.Text = model.name
local image = CaptureImage(model, Camera)
renderHumanoid(model, dialogueFrame.ViewportFrame)
end)
setDialogueImageEvent.OnClientEvent:Connect(function(model, color)
dialogueFrame.PlayerName.TextStrokeTransparency = 1
dialogueFrame.PlayerName.TextColor3 = Color3.new(255, 255, 255)
dialogueFrame.Message.TextColor3 = Color3.new(255, 255, 255)
dialogueFrame.Message.TextStrokeTransparency = 1
dialogueFrame.PlayerName.Text = model.name
local image = CaptureImage(model, Camera)
renderHumanoid(model, dialogueFrame.ViewportFrame)
end)
local function Render()
ViewPort:ClearAllChildren()
local localPlayerChar = instance("Model")
localPlayerChar.Name = ""
localPlayerChar.Parent = ViewPort
renderHumanoid(Character, localPlayerChar)
for _, player in ipairs(game.Players:GetPlayers()) do
if player ~= Player and player.Character then
local otherPlayerChar = instance("Model")
otherPlayerChar.Name = ""
otherPlayerChar.Parent = ViewPort
renderHumanoid(player.Character, otherPlayerChar)
end
end
end
Character.DescendantAdded:Connect(Render)
Character.DescendantRemoving:Connect(Render)
Render()
local CameraUpdater = RunService.Heartbeat:Connect(function()
if Character.HumanoidRootPart then
Camera.CFrame = cf(Character.HumanoidRootPart.CFrame:toWorldSpace(Offset).p, Character.HumanoidRootPart.CFrame.p)
end
end)