-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
91 lines (73 loc) · 1.99 KB
/
main.go
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
package main
import (
"flag"
"fmt"
"log"
"os"
"os/signal"
"strconv"
"github.com/frustra/fracture/chunk"
"github.com/frustra/fracture/edge"
"github.com/frustra/fracture/entity"
"github.com/frustra/fracture/network"
"github.com/frustra/fracture/world"
)
func main() {
var (
// Cluster flags.
existing = flag.String("join", "localhost:7946", "address of any node in the cluster")
node = flag.String("node", ":7946", "node address within the cluster")
// Edge server flags.
addr = flag.String("addr", ":25565", "address to bind")
offset = flag.Int64("offset", 0, "id range offset")
size = flag.Int("size", 16, "server size")
// Chunk server flags.
px = flag.Int64("x", 0, "x offset")
pz = flag.Int64("z", 0, "z offset")
)
log.SetFlags(log.Lmicroseconds)
flag.Parse()
role := flag.Arg(0)
cluster, err := network.CreateCluster(*node, *existing)
if err != nil {
log.Fatal("Error creating cluster: ", err)
}
var server network.Server
meta := cluster.LocalNodeMeta
switch role {
case "edge":
meta.Type = network.EdgeType
server = &edge.Server{Addr: *addr, Cluster: cluster, Size: *size, Offset: *offset}
case "entity":
meta.Type = network.EntityType
server = &entity.Server{Addr: *addr, Cluster: cluster, Size: *size}
case "chunk":
meta.Type = network.ChunkType
x, z := *px, *pz
chunkServer := &chunk.Server{
Addr: *addr,
Cluster: cluster,
OffsetX: x * world.ChunkWidthPerNode,
OffsetZ: z * world.ChunkWidthPerNode,
}
meta.X = &chunkServer.OffsetX
meta.Z = &chunkServer.OffsetZ
server = chunkServer
default:
log.Fatal("Invalid role: ", role)
}
log.SetPrefix(fmt.Sprintf("[%7s %-7s] ", role, *addr))
meta.Addr = ":" + strconv.Itoa(server.NodePort())
if err := cluster.Join(); err != nil {
log.Fatal("Failed to join cluster: ", err)
}
interrupts := make(chan os.Signal, 1)
signal.Notify(interrupts, os.Interrupt)
go func() {
for _ = range interrupts {
cluster.Part()
os.Exit(1)
}
}()
log.Fatal(server.Serve())
}