buildat/doc/design.txt

107 lines
3.2 KiB
Plaintext
Raw Normal View History

2014-09-16 15:27:57 +03:00
Buildat
=======
2014-09-19 19:38:20 +03:00
A minecraftlike with vast extendability.
2014-09-16 15:27:57 +03:00
2014-09-18 19:35:07 +03:00
License: Apache 2.0
2014-09-16 20:39:57 +03:00
2014-09-16 17:58:01 +03:00
Client
------
2014-09-22 14:43:48 +03:00
Built using Urho3D.
2014-09-16 15:27:57 +03:00
2014-09-16 18:22:12 +03:00
Module code is transfered from the server and run in a safe Lua sandbox.
2014-09-19 10:01:50 +03:00
Extensions are non-sandboxed code installed separately on each client.
2014-09-16 17:58:01 +03:00
Server
------
2014-09-22 14:43:48 +03:00
Built using C++, with suitable parts from Urho3D, with most functionality in
runtime-compiled C++ modules.
2014-09-16 18:22:12 +03:00
Module structure
----------------
module
2014-09-19 10:01:50 +03:00
|-- deps.txt << Module and extension dependencies
|-- <module>.cpp << Server-side code
|-- api.h << Structures for interfacing between modules
2014-09-18 18:12:59 +03:00
|-- client_lua
| `-- init.lua << Client-side code (by convention)
2014-09-18 18:12:59 +03:00
`-- client_data
`-- media.png << Data files (by convention)
2014-09-16 18:22:12 +03:00
Module behavior
---------------
2014-09-18 18:12:59 +03:00
No script or data transfer to the client is initiated by the core. Conventions
followed by builtin modules:
- module/client_lua/{init,*}.lua - builtin/client_lua
- module/client_data/* - builtin/client_data
2014-09-16 15:27:57 +03:00
2014-09-17 13:37:34 +03:00
Modules can be unloaded at runtime. Handling of client-side state is left up to
the C++ modules themselves.
2014-09-16 22:42:47 +03:00
The first module to be loaded is called __loader. It loads all other modules.
C++ modules can use the core/ and interface/ headers. Everything else is
considered unstable.
2014-09-17 13:37:34 +03:00
C++ modules are run in threads, and everything they can officially access is
thread-safe.
C++ modules can provide direct library functionality inlined in their include/
2014-09-18 18:12:59 +03:00
files. See builtin/network as an example.
2014-09-17 13:37:34 +03:00
Startup sequence and what the module should do:
- constructor : Don't access other modules. Throw on fatal errors.
- init() : Subscribe to events; access other external things.
- "core:start" : Start doing whatever the module wants to actively do.
- "core:unload" : Module will be unloaded immediately after event handler.
- "core:continue" : Continue doing stuff after a reload.
2014-09-29 09:15:18 +03:00
Metainformation: meta.txt
-------------------------
2014-09-19 10:01:50 +03:00
Example:
2014-09-29 09:15:18 +03:00
{
"cxxflags": "",
"ldflags": "-lsasl2",
"dependencies": [
{"module": "network"},
{"module": "plants", "optional": true},
],
"reverse_dependencies": [
{"module": "stuff", "optional": true},
],
}
Any fields can be left out. The minimum meta.txt content is an empty object {}.
2014-09-19 10:01:50 +03:00
Extension structure
-------------------
extension
`-- init.lua << Loaded when the module is required
2014-09-20 10:04:28 +03:00
`-- init.cpp << Compiled as a Lua module and loaded if init.lua doesn't exist
Extension behavior
------------------
Extensions use the new Lua 5.1/5.2 module interface.
If an extension wish to provide an interface to sandboxed code, it should
2014-09-19 11:29:23 +03:00
implement table "safe", which contains the safe interface.
Extensions and modules use require "buildat/extension/<name>" to use extensions.
The __menu extension is specially loaded automatically at client startup if no
server address is provided on the command line. __menu can then connect to a
server. When disconnecting from a server, the whole client window is closed and
reopened.
2014-09-19 22:45:24 +03:00
2014-09-17 03:00:54 +03:00
Network protocol
----------------
(Type, length, data) tuples on TCP. In the future TLS can be taken into use. A
name->type registry is used for determining numeric packet types.
Data is freeform. Types 0...99 are reserved for initialization.
2014-09-17 03:00:54 +03:00
2014-09-18 01:12:06 +03:00
Core uses cereal's portable binary serialization, except for low-level packet
streaming.