buildat/design.txt

90 lines
2.5 KiB
Plaintext
Raw Normal View History

2014-09-16 15:27:57 +03:00
Buildat
=======
A Minecraft clone with vast extendability.
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
------
Built using Polycode C++.
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
------
Built using C++ with most functionality in RCC++.
2014-09-16 18:22:12 +03:00
C++ modules can interface with each other by using Cereal.
Module structure
----------------
module
2014-09-19 10:01:50 +03:00
|-- deps.txt << Module and extension dependencies
|-- <module>.cpp << Server-side code
2014-09-17 02:18:03 +03:00
|-- include
2014-09-17 02:21:56 +03:00
| `-- 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:continue" : Continue doing stuff after a reload.
2014-09-19 10:01:50 +03:00
Dependencies: deps.txt
----------------------
File format: One entry per line. Indentation for presentational purposes only.
Module entry:
<module_name> <options>
Extension entry:
extension:<extension_name> <options>
Options:
? - Optional dependency
r - Reverse dependency; load before the specified module (not for extensions)
Example:
network
plants ?
stuff ?r
extension:ecs2
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.