1- fs = require " fs"
2- opn = require " opn"
3- http = require " http"
4- server = http .createServer ()
5- io = require (" socket.io" )(server)
6- express = require ' express'
7- app = express ();
8- term = require ( ' terminal-kit' ).terminal
1+ webmc = require " ./webmc"
92mineflayer = require ' mineflayer'
103Chunk = require (' prismarine-chunk' )(" 1.16.1" )
114vec3 = require " vec3"
12- exec = (cmd )->
13- exec = require (' child_process' ).exec ;
14- return new Promise (resolve , reject ) ->
15- exec cmd, (error , stdout , stderr ) ->
16- if error
17- console .warn error
18- resolve stdout ? stdout : stderr
19- return
20- return
21-
22- config = JSON .parse fs .readFileSync (__dirname + " /config.json" )
23-
24- port = config[" express-port" ]
25-
26- app .use express .static (__dirname + " /../client/" )
27- app .use (req, res, next) ->
28- res .set ' Cache-Control' , ' no-store'
29- next ()
30- app .get " /websocket/" ,(req ,res )->
31- res .send String (config[" websocket-port" ])
32- app .get " /host/" ,(req ,res )->
33- res .send String (config[" host" ])
34- app .listen port
5+ fs = require " fs"
356
367world = {}
8+
379saveWorld = ->
3810 fs .writeFileSync __dirname + " /savedWorld.json" ,JSON .stringify (world)
3911restoreWorld = ->
4012 world = JSON .parse fs .readFileSync (__dirname + ' /savedWorld.json' )
13+
4114restoreWorld ()
4215players = {}
4316socketInfo = {}
4417
45- io .sockets .on " connection" , (socket )->
46- socket .emit " firstLoad" ,world
47- socket .on " initClient" ,(data )->
48- socketInfo[socket .id ]= data
49- dolaczGracza socket .id
50- socket .on " playerUpdate" ,(data )->
51- players[socket .id ]= data
52- io .sockets .emit " playerUpdate" ,players
53- socket .on " blockUpdate" ,(block )->
54- world[" #{ block[0 ]} :#{ block[1 ]} :#{ block[2 ]} " ]= block[3 ]
55- if block[3 ] is 0
56- delete world[" #{ block[0 ]} :#{ block[1 ]} :#{ block[2 ]} " ]
57- io .sockets .emit " blockUpdate" ,block
58- saveWorld ()
59- socket .on " disconnect" , ->
60- odlaczGracza socket .id
61- delete players[socket .id ]
62- delete socketInfo[socket .id ]
63- server .listen config[" websocket-port" ]
18+ webmc .on " blockUpdate" , (x ,y ,z ,v )->
19+ world[" #{ x} :#{ y} :#{ z} " ]= v
20+ if v is 0
21+ delete world[" #{ x} :#{ y} :#{ z} " ]
22+ webmc .broadcast " blockUpdate" ,[x,y,z,v]
23+ saveWorld ()
6424
25+ webmc .on " join" , (socketid ,data )->
26+ console .log " NEW: " + socketid
27+ webmc .send socketid, " mapChunk" ,123
28+ # init socketInfo
29+ socketInfo[socketid]= data
6530
66-
67- term .windowTitle " web-minecraft console"
68- term .clear ()
69- term .green (fs .readFileSync (__dirname + ' /asciiLogo' ))
70-
71- log = (message )->
72- term (" \n #{ message} \n " )
73- return
74- stop = ->
75- term .brightGreen " \n Server stopped!\n "
76- process .exit ()
77- return
78- help = ->
79- term .brightGreen (" \n
80- help\t - pomoc\n
81- stop\t - zatrzymanie serwera\n
82- open\t - uruchomienie przeglądarki pod adresem serwera\n
83- copen\t - uruchamianie gry w przeglądarce chrome w wersji 'app'\n
84- list\t - wypisuje wszystkich aktywnych użytkowników\n
85- clear\t - czyści consolę\n
86- info\t - wypisuje informacje o serwerze\n
87- " )
88- return
89- info = ->
90- term " \n "
91- term .table [
92- [ " Typ serwera" , " Adres serwera" ] ,
93- [ " Serwer websocket" , " #{ config .host } :#{ config[" websocket-port" ]} " ] ,
94- [ " Serwer express" , " #{ config .host } :#{ config[" express-port" ]} " ] ,
95- [ " Serwer minecraftowy" , " #{ config .realServer .ip } :#{ config .realServer .port } " ] ,
96- ] , {
97- hasBorder : true ,
98- contentHasMarkup : true ,
99- borderChars : ' lightRounded' ,
100- borderAttr : { color : ' blue' } ,
101- textAttr : { bgColor : ' default' } ,
102- firstRowTextAttr : { bgColor : ' blue' } ,
103- width : 60 ,
104- fit : true
105- }
106- return
107- com = (command )->
108- if command is " stop"
109- stop ()
110- else if command is " help" or command is " ?"
111- help ()
112- else if command is " clear"
113- term .clear ()
114- else if command is " list"
115- Object .keys (socketInfo).forEach (p)->
116- term " \n #{ p} (#{ socketInfo[p].nick } )"
117- else if command is " open"
118- opn " http://#{ config[" host" ]} :#{ config[" express-port" ]} "
119- else if command is " copen"
120- exec " google-chrome --app=http://#{ config[" host" ]} :#{ config[" express-port" ]} "
121- else if command is " info"
122- info ()
123- else if command isnt " "
124- term .red " \n Nieznana komenda. Użyj 'help' lub '?' aby uzyskać pomoc."
125- incon ()
126- return
127- incon = ->
128- term .green " \n server> "
129- term .inputField {
130- autoComplete : [
131- ' help' ,
132- ' stop' ,
133- ' ?' ,
134- ' open' ,
135- ' clear' ,
136- ' info' ,
137- ' list' ,
138- ' copen'
139- ] ,
140- autoCompleteHint : true ,
141- autoCompleteMenu : true
142- },( er , input )->
143- com input
144- return
145- term .on ' key' , ( name , matches , data )->
146- if name is ' CTRL_C'
147- stop ()
148- return
149- info ()
150- incon ()
151- dolaczGracza = (socketid )->
31+ # socketInfo add Bot
15232 socketInfo[socketid].bot = mineflayer .createBot {
153- host : config .realServer .ip
154- port : config .realServer .port
33+ host : webmc . config .realServer .ip
34+ port : webmc . config .realServer .port
15535 username : socketInfo[socketid].nick
15636 }
157-
37+
15838 socketInfo[socketid].bot ._client .on " map_chunk" ,(packet )->
15939 cell = new Chunk ()
16040 cell .load packet .chunkData ,packet .bitMap ,true ,false
161- io . to (socketid). emit " mapChunk" , cell .sections
41+ webmc . send socketid, " mapChunk" , cell .sections
16242 return
163-
16443 socketInfo[socketid].bot .on ' chat' ,(username , message )->
16544 if username is socketInfo[socketid].bot .username
16645 return
16746 socketInfo[socketid].bot .chat message
16847 return
48+ # first world load
49+ webmc .send socketid," firstLoad" ,world
50+
51+
16952 return
170- odlaczGracza = (socketid )->
53+ webmc .on " leave" , (socketid )->
54+ console .log " DIS: " + socketid
55+
56+ # end bot session
17157 socketInfo[socketid].bot .end ()
58+ # delete socketinfo
59+ delete players[socket .id ]
60+ delete socketInfo[socket .id ]
61+
17262 return
63+ webmc .on " playerUpdate" ,(data )->
64+ players[socket .id ]= data
65+ webmc .broadcast " playerUpdate" , data
0 commit comments