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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
ecs = require("ecs")
log = require("log")
world = require("world")
net = require("net")
NetworkedComponent = require("ecs.networked")
PredictedComponent = require("ecs.predicted")
player_movement = require("shared.player_movement")
x = {}
x.initialize = () ->
world.domain = "server"
if not world.hub
log.error("Running server init, but no world hub has been created",{"server"})
print("World was:",world)
error("World.hub has not been set")
log.info("Server initalized",{"server"})
world.level_sync.name = "levels.lobby"
pawns = {} -- peerid to entity lookup
net.register_message("RequestLevel",{})
world.hub\listen("RequestLevel", "RespondLevel", (from_client, data) ->
log.info("Got reqeust for level info" .. tostring(from_client), {"net","server"})
world.hub\send(from_client, "RespondLevel",{
name: world.level_sync.name
data: world.level_sync.data
})
)
net.register_message("RequestPeers",{})
world.hub\listen("RequestPeers", "RespondPeers", (from_client, data) ->
log.info("Got request for player info" .. tostring(from_client), {"net","server"})
players = {}
for peerid, ent in pairs(world.level_sync.peers)
players[peerid] = ent\get("net")\pack!
log.info("Got data for player" .. peerid .. ":" .. players[peerid], {"net","server"})
world.hub\send(from_client, "RespondPeers", players)
)
net.register_message("RequestEntities",{})
world\check!
world.hub\listen("RequestEntities", "RespondEntities", (from_client, data) ->
log.info("Got request for entities from " .. tostring(from_client), {"net","server"})
log.info("Responding with:" .. tostring(world.level_sync.ents), {"net","server"})
log.info("At request for entities, level is " .. tostring(world.level_sync.name), {"net","server"})
if world.level_sync.name == "levels.game"
return -- Don't sync here, instead send a R
world\check!
-- Simplified way to send entities
nents = {}
for i, entity in pairs(world.level_sync.ents)
ent_net = entity\get("net")
if not ent_net
error("Server entity does not have a net component:" .. tostring(entity))
if not ent_net.properties.type
error("Failed to find net entity type for " .. tostring(net_ent) .. " net component was: " .. tostring(ent_net.net_properties))
nents[i] = ent_net\pack!
world.hub\send(from_client, "RespondEntities", nents)
)
world.hub\listen("Join", "CreatePawn", (from_client, data) ->
assert(world.hub, "Join should only be called on the server")
log.info("Got player joining:" .. tostring(from_client), {"net","server"})
--pawn = ecs.Entity!
--spawn_loc = assert(world.level_sync.ref\get_spawn_location!, "Failed to find inital spawn location")
--net = NetworkedComponent("net",{
--type: "player"
--pos: spawn_loc
--ang: 0
--vel: {0,0,0}
--acc: {0,0,0}
--player_name: "name"
--last_update: am.eval_js("Date.now()")
--peerid: from_client
--})
--pawn\add(net, "net")
--pred = PredictedComponent("pred",{acc:{0,0,0}, vel: {0,0,0}, pos: {0,0,0}}, "net", player_movement)
--pawn\add(pred, "pred")
--world.level_sync.peers[from_client] = pawn
--world.hub\broadcast("CreatePawn", net\pack!)
-- Surface Join events to the browser for integration tests.
-- Guarded so it is a no-op in non-HTML environments.
if am and am.eval_js and am.to_json
js = string.format("window._hubJoinReceived = true; window._hubJoinData = %s;", am.to_json(data or {}))
am.eval_js(js)
)
require("levels.lobby")
lobby = ecs.Entity!
lobby\add(ecs.NetworkedComponent("lobby_peer",{
type: "level",
level_name: world.level_sync.name
level_data: {world.hub.peer.id}
}), "net")
world.level_sync.ref = {
id: "level from server/init.moon"
get_spawn_location: () ->
{0,0,0}
}
net.register_message("SuggestPlayerUpdate",{
optional: {
pos: "table" -- x, y, z
ang: "number" -- 0->360
vel: "table" -- x, y, z
acc: "table" -- x, y, z
player_name: "string"
last_update: "number"
}
})
world.hub\listen("SuggestPlayerUpdate","UpdateName",(from_client, data) ->
log.debug("Got player update from " .. from_client .. ":" .. tostring(data), {"net","server","player"})
net = world.level_sync.peers[from_client]\get("net")
if not net
error("Got message from client" .. tostring(from_client) .. " but no such client exists!")
if data.player_name
net.properties.player_name = data.player_name
if data.pos
net.properties.pos = data.pos
if data.vel
net.properties.vel = data.vel
if data.last_update
net.properties.last_update = data.last_update
if data.acc
for i = 1,3
if not (data.acc[i] and type(data.acc[i] == "number"))
log.warn("Peer " .. from_client .. " sent bad acceleration", {"net","player"})
return
v = vec3(data.acc[1], data.acc[2], data.acc[3])
if math.length(v) > 1
log.warn("Peer " .. from_client .. " sent too much acceleration: " .. tostring(math.length(v)),{"net","player"})
return
net.properties.acc = data.acc
)
world.hub\listen("RequestRole","Request role", (clientid, _) ->
client_data = world.level_sync.client_data
log.info("Responding with role:" .. tostring(client_data[clientid]), {"net","server"})
world.hub\send(clientid, "RespondRole", client_data[clientid])
)
world.domain = "client"
x
|