{"id":21934940,"url":"https://github.com/benruijl/quakemonkey","last_synced_at":"2025-04-19T22:42:25.992Z","repository":{"id":4223191,"uuid":"5345283","full_name":"benruijl/quakemonkey","owner":"benruijl","description":"An implementation of the Quake 3 network code for jMonkeyEngine. This extension builds on top of the original Message protocol.","archived":false,"fork":false,"pushed_at":"2014-01-17T08:36:40.000Z","size":148,"stargazers_count":14,"open_issues_count":2,"forks_count":7,"subscribers_count":3,"default_branch":"master","last_synced_at":"2023-03-11T02:48:05.031Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/benruijl.png","metadata":{"files":{"readme":"README.textile","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-08-08T17:52:25.000Z","updated_at":"2022-02-23T07:24:25.000Z","dependencies_parsed_at":"2022-08-06T15:16:01.588Z","dependency_job_id":null,"html_url":"https://github.com/benruijl/quakemonkey","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benruijl%2Fquakemonkey","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benruijl%2Fquakemonkey/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benruijl%2Fquakemonkey/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/benruijl%2Fquakemonkey/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/benruijl","download_url":"https://codeload.github.com/benruijl/quakemonkey/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227010934,"owners_count":17716674,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-29T00:17:47.019Z","updated_at":"2024-11-29T00:17:47.706Z","avatar_url":"https://github.com/benruijl.png","language":"Java","readme":"h1. What is quakemonkey?\n\nQuakemonkey is an implementation of the snapshot protocol used in the successful Quake 3 engine, built on top of the existing jMonkeyEngine networking framework. In short, this UDP-only protocol sends partial messages to each client in order to save bandwidth. These partials are created from the difference at byte level of the current message and the message that was last received by the client. For a more detailed overview, see this \"webpage\":http://fabiensanglard.net/quake3/network.php.\n\nQuakemonkey makes your life easier, because you don't have to figure out for yourself which values in your gamestate have changed and create partial messages for each to save bandwidth. You can just send a big gamestate message, and quakemonkey will take care of the rest.\n\nh2. Features\n\nBecause the snapshot mechanism is implemented at byte level - i.e. when the messages are serialized to a byte buffer - no modifications to your messages are required to use quakemonkey in your existing code. It just works! \n\nSummary:\n\n* UDP-only: fast connections\n* Delta messages: smaller packages\n* Byte-level deltas: invisible to user\n* No need to split up master gamestate\n* Built on top of existing framework\n* Easy way to check if client is lagging\n\nh2. Example code\n\nThe following shows how to use quakemonkey in your code. For a full example, see the _example_ directory in the git repository.\n\nh3. Server code:\n\nbc. DiffClassRegistration.registerClasses();\nmyServer = Network.createServer(6143);\ndiffHandler = new ServerDiffHandler\u003cGameStateMessage\u003e(myServer);\nmyServer.start();\ndiffHandler.dispatchMessage(myServer, Filters.in(myServer.getConnections()), newMessage);\n\nThis should look like the code you already have. The only thing that changes is that a @ServerDiffHandler@ is created and that the message you want to follow the quake protocol is broadcast by @diffHandler.dispatchMessage@.\n\nh3. Client code:\n\nbc. diffHandler = new ClientDiffHandler\u003c\u003e(myClient, GameStateMessage.class);\ndiffHandler.addListener(this); // register listener for GameStateMessage\n\nThe client code is even easier: instead of registering a listener for the class @GameStateMessage@ in the client class directly, this is done through the @ClientDiffHandler@.\n\n","funding_links":[],"categories":["Multiplayer"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenruijl%2Fquakemonkey","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbenruijl%2Fquakemonkey","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenruijl%2Fquakemonkey/lists"}