1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
ecs = require("ecs")
world = require("world")
shader = require("shaders.world")
sprites = require("sprites")
task = require("task")
LobbyGraphic = require("prefab.lobby")
GraphicsComponent = require("ecs.graphics")
ClientNetworkedComponent = require("ecs.client_networked")
NetworkedComponent = require("ecs.networked")
log = require("log")
level = {}
lobby = nil
level.create = (code) ->
log.info("Creating level:" .. code,{"level"})
-- We can set this even on the client, it just won't get used.
world.level_sync.ref = {
id: "Level from lobby.moon"
get_spawn_location: () ->
{0,0,0}
}
log.info("world.domain was" .. tostring(world.domain),{"level"})
if world.domain == "client"
lobby = ecs.Entity!
lobby_graphic = LobbyGraphic("graphic",{})
lobby\add(lobby_graphic,"grapic")
lobby\add(ClientNetworkedComponent("net",{
type: "level",
level_name: "levels.lobby"
level_data: {code}
}),"net")
code = world.level_sync.data[1]
path = am.eval_js("window.CLIPBOARD.get_path()")
url = string.format("%s?i=%s",path,code)
--todo: set qr code
am.eval_js([[
var s = document.createElement('div');
s.setAttribute("id","qrcode");
s.setAttribute("style","z-index: 1; position:absolute; visibility:hidden;");
var p = document.getElementById("container");
p.prepend(s);
console.log("[JS] Added qrcode", s);
new QRCode(s, "]] .. url .. [[");
]])
co = coroutine.create(() ->
print("Start of coroutine.")
imgsrc = ""
while imgsrc == ""
imgsrc = am.eval_js([[document.getElementById("qrcode").children[1].src;]])
print("Waiting on imgsrc...")
coroutine.yield!
print("Got imgsrc.")
b64 = imgsrc\match("^data:image/png;base64,(.+)")
print("Found base64 png of qrcode.")
qrbuffer = am.base64_decode(b64)
print("Got qrbuffer")
qrimg = am.decode_png(qrbuffer)
print("Created img")
qrtex = am.texture2d(qrimg)
print("Created texture2d")
sprite = {
texture: qrtex
s1: 0
t1: 0
s2: 1
t2: 1
x1: 0
y1: 0
x2: qrimg.width
y2: qrimg.height
wdith: qrimg.width
height: qrimg.height
}
qrcode = ecs.Entity!
qrcode_texture = {
vec4(0,1,1,1),
vec4(1,1,1,1),
vec4(1,0,1,1),
vec4(1,0,1,1),
vec4(0,0,1,1),
vec4(0,1,1,1)
}
code_graphic = GraphicsComponent("graphic",{
graphic: sprite
})
qrcode\add(code_graphic)
code_graphic\moveto(vec3(-0.5,-0.25,0))
)
log.info("Creating qrcode coroutine for lobby",{"ui"})
require("task").add(co)
elseif world.domain == "server"
lobby = ecs.Entity!
lobby\add(NetworkedComponent("net",{
type: "level",
level_name: "levels.lobby"
level_data: {world.hub.peer.id}
}), "net")
qrcode = ecs.Entity!
else
error("Unknown domain:" .. world.domain)
level.destroy = () ->
if not lobby
error("Tried to destory lobby before it was built")
lobby\destroy!
level
|