カワリモノ息子の技術メモ的な~

カワリモノ息子とその母の技術メモ的な〜

学校が苦手な息子くんの作品とその母の作品、はたまた日常などいろいろを在宅エンジニア母が綴る

小6息子くんRobloxでプレイヤー新規登録者を発射する

タイトル「プレイヤー新規登録者を発射する」て、なんのこっちゃですね。
こんなの作っていました。

f:id:toriko0413:20200222215901g:plain

↑ 初めてgif動画埋め込んでみました。いいですね^^

なんか顔の書いた緑色の紙みたいなものがたくさん発射されていますね。
これ、Robloxにリアルタイムで新規登録された人の情報(顔と名前)らしいです!
すごい勢いでロブロックスのプレイヤー登録者(アカウント登録者)が増えている様子がわかります。世界中から登録されてるんでしょうね!すごい!
そしてゲーム開発側からそんな情報も取得できるんですね。

元にしたスクリプト

公開されているこちらのスクリプトをカスタマイズしたとのこと。
www.roblox.com

息子くんによると、このスクリプトリアルタイムで新規登録者が増えるスピードに処理が追い付いていないから、追いつけるように修正したとのこと。

どのようにしたかというと、非同期でどんどん関数をコールして多重処理してるんですって。
スレッドをたくさん起動して同時に処理しているということです。

息子くん作スクリプトを紹介

そのスクリプトを公開します。
「適当に作ってるからね!」とソースコードが綺麗でないことを主張してましたw

--Get ChatService
local ChatService = require(game:GetService("ServerScriptService"):WaitForChild("ChatServiceRunner"):WaitForChild("ChatService"))

--Wait for the channel 'All' to exist
if not ChatService:GetChannel("All") then
	while true do
		local ChannelName = ChatService.ChannelAdded:Wait()
		if ChannelName == "All" then
			break
		end
	end
end

local function getTime()
    local date = os.date("!*t")
    return ("%02d:%02d %s"):format(((date.hour % 24) - 1) % 12 + 1, date.min, date.hour > 11 and "PM " or "AM ".."(UTC)")
end

--Make your speaker and have it join the 'All' channel we waited for
local Welecome = ChatService:AddSpeaker("Welecome!")
Welecome:JoinChannel("All")

--Change data for your speaker such as name color, chat color, font, text size, and tags
Welecome:SetExtraData("NameColor", Color3.fromRGB(255, 255, 0))
Welecome:SetExtraData("ChatColor", Color3.fromRGB(255, 255, 204))

MaxPos = 0

function WelecomeMessage(PlayerName)
	Welecome:SetExtraData("NameColor", BrickColor.Random().Color)
	Welecome:SayMessage("Roblox Registered! Player Name is "..PlayerName.."!", "All")
	for _,player in pairs(game.Players:GetChildren()) do
		local PlayerLogGui = player.PlayerGui:FindFirstChild("Log")
		local AutoScrollEnabled
		if PlayerLogGui then
			local Template = PlayerLogGui.Window.Frame.PlayerTemplate:Clone()
			AutoScrollEnabled = PlayerLogGui.Window.Frame.CanvasPosition.Y <= MaxPos
			MaxPos = MaxPos + 50
			PlayerLogGui.Window.Frame.CanvasSize = UDim2.new(0,0,0,MaxPos)
			Template.Position = UDim2.new(0,0,0,MaxPos)
			Template.Visible = true
			Template.Parent = PlayerLogGui.Window.Frame
			Template.PlayerName.Text = PlayerName
			Template.Time.Text = getTime()
		else
			game.ReplicatedStorage.Log:Clone().Parent = player.PlayerGui
			PlayerLogGui = player.PlayerGui:FindFirstChild("Log")
			local Template = PlayerLogGui.Window.Frame.PlayerTemplate:Clone()
			AutoScrollEnabled = PlayerLogGui.Window.Frame.CanvasPosition.Y <= MaxPos
			MaxPos = MaxPos + 50
			PlayerLogGui.Window.Frame.CanvasSize = UDim2.new(0,0,0,MaxPos)
			Template.Position = UDim2.new(0,0,0,MaxPos)
			Template.Visible = true
			Template.Parent = PlayerLogGui.Window.Frame
			Template.PlayerName.Text = PlayerName
			Template.Time.Text = getTime()
		end
		if AutoScrollEnabled then
			PlayerLogGui.Window.Frame.CanvasPosition = Vector2.new(0,MaxPos)
		end
	end
end

local f=function(x)
	local y,r=pcall(function()return game.Players:GetNameFromUserIdAsync(x)end)
	if y then return r end
end
local x=0
for i=30,0,-1 do
	print("Isolating range ("..i..")")
	local n=x+2^i
	if f(n)or f(n+1)or f(n+2)then
		x=n
	end
end
print("Newest user located")

while wait() do
	spawn(function()
		local ox = x
		while wait() do
			local newuser = f(ox)
			if newuser ~= nil then
				print("new user: "..newuser.." (".. tostring(x) ..")")
				WelecomeMessage(newuser)
				local Panel = game.ReplicatedStorage.UserPanel:Clone()
				Panel.Parent = workspace
				Panel.UserImage.Texture = "https://www.roblox.com/headshot-thumbnail/image?userId=" .. tostring(x-1) .. "&width=420&height=420&format=png"
				Panel.Gui.PlayerName.Text = newuser .. " (".. tostring(x) ..")"
				game.Debris:AddItem(Panel,30)
				break
			end
		end
	end)
	x = x + 1
end

割と下の方の

while wait() do
	spawn(function()

が、非同期で多重起動しているところだと教えてもらいました。
function を spawn してるんですね。なるほど。

f:id:toriko0413:20200222224659p:plain

また、「Players Log」という画面は改造して作成したとのことで、これを開くと登録時刻とユーザー名を確認することができます。

f:id:toriko0413:20200222224526p:plain

最近はOSいじりとRobloxとYouTube鑑賞が主な活動の息子くん。
もうすぐ中学生なんです。
中学はN中で、入学手続き済ませました。どんな感じになるかなー。

Roblox関連記事

以前公開したライブラリ

siroitori.hatenablog.com
siroitori.hatenablog.com

乗っ取り被害にあったらカスタマーサポートに問い合わせましょう

siroitori.hatenablog.com

Robloxのすべての記事はこちら

siroitori.hatenablog.com



スター・はてブとても嬉しいです!