Exposing more C++ sources

This commit is contained in:
Eric Froemling 2020-10-15 12:44:01 -07:00
parent 517abc9112
commit e8a4e249dc
20 changed files with 2542 additions and 275 deletions

View File

@ -3932,24 +3932,24 @@
"assets/build/windows/Win32/ucrtbased.dll": "https://files.ballistica.net/cache/ba1/b5/85/f8b6d0558ddb87267f34254b1450",
"assets/build/windows/Win32/vc_redist.x86.exe": "https://files.ballistica.net/cache/ba1/1c/e1/4a1a2eddda2f4aebd5f8b64ab08e",
"assets/build/windows/Win32/vcruntime140d.dll": "https://files.ballistica.net/cache/ba1/50/8d/bc2600ac9491f1b14d659709451f",
"build/prefab/full/linux_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/19/53/2a9c168ffd8bc53475e8c9e139ed",
"build/prefab/full/linux_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/20/79/28f2821d36d20be52eebee1475fa",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/6e/4e/1f59b95892fdd6ebf55159c0fb69",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/3c/64/8790eac167ed9cb6ced1b4e43a34",
"build/prefab/full/mac_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/06/6c/1ffc0a07960c3272304b1b5f858a",
"build/prefab/full/mac_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/6c/fd/193b81fcda6c6716e3dcaa7f7cb8",
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/0f/30/8ac58a8ebc1b73dc335d82d7cecb",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/26/a7/dc477a2297d27eb7fbb14a662619",
"build/prefab/full/windows_x86/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/70/07/1e15c6fcdbf35ceda17a5d324394",
"build/prefab/full/windows_x86/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/9b/2b/59a36a36dd90410b4a94726a3e4b",
"build/prefab/full/windows_x86_server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/fc/36/6bafb410c3ad3d458545fc495cfd",
"build/prefab/full/windows_x86_server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/f3/29/0e5332b1ab93ea7c564fea7ce980",
"build/prefab/lib/linux_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/4d/01/29abecb0b2bd764ad3c261f1727e",
"build/prefab/lib/linux_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/68/c6/61c27c594a5b67abb7cd0a2a0f51",
"build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/79/a9/480cd7947a83b5e52359945c450e",
"build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/53/96/32edc65468aa4546f245192238c3",
"build/prefab/lib/mac_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/18/34/0c7bc3754d9dc5a796133484a891",
"build/prefab/lib/mac_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/0a/69/49203680f51913705a4f6263ef01",
"build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/08/ea/3732982a8df8b9510b9ae4bb3ace",
"build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/9c/31/60fcef7fd4e08d4ebb1859f4c9a3"
"build/prefab/full/linux_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/50/39/970b2b3f334bdbfd72469cd27f8c",
"build/prefab/full/linux_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/bd/46/92d63ccc123d646df92cd1545d0a",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/d0/8e/be85a2a57eaeb26f9d09899e6811",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ee/f8/28c1f4606f3d2234dbbe79990c61",
"build/prefab/full/mac_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/2d/02/5843eaa3f9118883523042379292",
"build/prefab/full/mac_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/89/dc/8b965051d0c27d5812d80ecac1d3",
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/16/89/34ea43bcd3901c8e5157460c37d6",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ae/72/30fe5cbfa936477b4f61e861a7ae",
"build/prefab/full/windows_x86/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/e6/5d/4402c2e9193641ee78d20c85ff3d",
"build/prefab/full/windows_x86/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/02/0b/dcdc0dd9147dd9a56992572aeb60",
"build/prefab/full/windows_x86_server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/02/87/645ddc08b2bdb90fcc69430a7b0b",
"build/prefab/full/windows_x86_server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/3f/ce/60d6f026d3f22d800538ffd69da8",
"build/prefab/lib/linux_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/15/54/bfba7d740c7221a5d46e8e21c756",
"build/prefab/lib/linux_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/4b/1f/ca36bea671a5b88a7e2ccf2e4c4a",
"build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/57/2d/e4b9a67cb21131cdcdfb8287f9e7",
"build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/59/b6/6ffc20f2c0253180496d2dae968c",
"build/prefab/lib/mac_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/b9/0a/dc300391e73286380eab87f6e742",
"build/prefab/lib/mac_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/97/76/7e35dd32e4507a4521a74d8c1b03",
"build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/9d/60/716cde2b1ec5efb8eedfa1a978f1",
"build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a2/a2/70a0bda587c2405a67c6709a5d0a"
}

View File

@ -22,7 +22,6 @@ class AdvancedSettingsWindow(ba.Window):
origin_widget: ba.Widget = None):
# pylint: disable=too-many-statements
from ba.internal import master_server_get
import threading
# Preload some modules we use in a background thread so we won't
@ -65,7 +64,8 @@ class AdvancedSettingsWindow(ba.Window):
# In vr-mode, the internal keyboard is currently the *only* option,
# so no need to show this.
self._show_always_use_internal_keyboard = (not app.vr_mode)
self._show_always_use_internal_keyboard = (not app.vr_mode
and not app.iircade_mode)
self._scroll_width = self._width - (100 + 2 * x_inset)
self._scroll_height = self._height - 115.0

View File

@ -12,8 +12,8 @@
<w>ack'ed</w>
<w>acked</w>
<w>acks</w>
<w>aclass</w>
<w>aclass's</w>
<w>aclass</w>
<w>activityplayer</w>
<w>addrs</w>
<w>adjoint</w>
@ -41,6 +41,7 @@
<w>appconfig</w>
<w>appname</w>
<w>appnameupper</w>
<w>appstate</w>
<w>asci</w>
<w>assigninput</w>
<w>athome</w>
@ -144,8 +145,8 @@
<w>cmath</w>
<w>cmds</w>
<w>cmdvals</w>
<w>codewarrior</w>
<w>codewarrior's</w>
<w>codewarrior</w>
<w>cofnodes</w>
<w>collapseable</w>
<w>collidable</w>
@ -399,6 +400,7 @@
<w>ifaddrs</w>
<w>ifdebug</w>
<w>iiiiisss</w>
<w>iircade</w>
<w>illum</w>
<w>ilock</w>
<w>imagewidget</w>

View File

@ -274,11 +274,13 @@ add_executable(ballisticacore
${BA_SRC_ROOT}/ballistica/game/account.h
${BA_SRC_ROOT}/ballistica/game/client_controller_interface.h
${BA_SRC_ROOT}/ballistica/game/connection/connection.h
${BA_SRC_ROOT}/ballistica/game/connection/connection_set.h
${BA_SRC_ROOT}/ballistica/game/connection/connection_to_client.h
${BA_SRC_ROOT}/ballistica/game/connection/connection_to_client_udp.h
${BA_SRC_ROOT}/ballistica/game/connection/connection_to_host.h
${BA_SRC_ROOT}/ballistica/game/connection/connection_to_host_udp.h
${BA_SRC_ROOT}/ballistica/game/friend_score_set.h
${BA_SRC_ROOT}/ballistica/game/game.cc
${BA_SRC_ROOT}/ballistica/game/game.h
${BA_SRC_ROOT}/ballistica/game/game_stream.h
${BA_SRC_ROOT}/ballistica/game/host_activity.h

View File

@ -1,5 +1,5 @@
<!-- THIS FILE IS AUTO GENERATED; DO NOT EDIT BY HAND -->
<h4><em>last updated on 2020-10-13 for Ballistica version 1.5.26 build 20205</em></h4>
<h4><em>last updated on 2020-10-15 for Ballistica version 1.5.26 build 20213</em></h4>
<p>This page documents the Python classes and functions in the 'ba' module,
which are the ones most relevant to modding in Ballistica. If you come across something you feel should be included here or could be better explained, please <a href="mailto:support@froemling.net">let me know</a>. Happy modding!</p>
<hr>

View File

@ -29,7 +29,7 @@
namespace ballistica {
// These are set automatically via script; don't change here.
const int kAppBuildNumber = 20210;
const int kAppBuildNumber = 20215;
const char* kAppVersion = "1.5.26";
// Our standalone globals.

View File

@ -68,6 +68,7 @@ class CollideModelData;
class Collision;
class CollisionCache;
class Connection;
class ConnectionSet;
class ConnectionToClient;
class Context;
class ContextTarget;

View File

@ -0,0 +1,136 @@
// Released under the MIT License. See LICENSE for details.
#ifndef BALLISTICA_GAME_CONNECTION_CONNECTION_SET_H_
#define BALLISTICA_GAME_CONNECTION_CONNECTION_SET_H_
#include <map>
#include <string>
#include <vector>
#include "ballistica/core/object.h"
namespace ballistica {
class ConnectionSet {
public:
ConnectionSet();
// Whoever wants to wrangle current client connections should call this
// to register itself. Note that it must explicitly call unregister when
// unregistering itself.
auto RegisterClientController(ClientControllerInterface* c) -> void;
auto UnregisterClientController(ClientControllerInterface* c) -> void;
// Quick test as to whether there are clients. Does not check if they are
// fully connected.
auto has_connection_to_clients() const -> bool {
assert(InGameThread());
return (!connections_to_clients_.empty());
}
// Returns our host-connection or nullptr if there is none.
auto connection_to_host() -> ConnectionToHost* {
return connection_to_host_.get();
}
auto GetConnectionToHostUDP() -> ConnectionToHostUDP*;
auto connections_to_clients()
-> const std::map<int, Object::Ref<ConnectionToClient> >& {
return connections_to_clients_;
}
auto client_controller() -> ClientControllerInterface* {
return client_controller_;
}
// Simple thread safe query.
auto has_connection_to_host() const -> bool {
return has_connection_to_host_;
}
auto Update() -> void;
auto Shutdown() -> void;
auto PrepareForLaunchHostSession() -> void;
auto HandleClientDisconnected(int id) -> void;
// Returns true if disconnect attempts are supported.
auto DisconnectClient(int client_id, int ban_seconds) -> bool;
auto ForceDisconnectClients() -> void;
auto PushHostConnectedUDPCall(const SockAddr& addr,
bool print_connect_progress) -> void;
auto PushDisconnectFromHostCall() -> void;
auto PushDisconnectedFromHostCall() -> void;
auto GetPrintUDPConnectProgress() const -> bool {
return print_udp_connect_progress_;
}
auto PushUDPConnectionPacketCall(const std::vector<uint8_t>& data,
const SockAddr& addr) -> void;
// Return our client connections (if any).
// FIXME: this prunes invalid connections, but it is necessary?
// Can we just use connections_to_clients() for direct access?
auto GetConnectionsToClients() -> std::vector<ConnectionToClient*>;
// Return the number of connections-to-client with "connected" status true.
auto GetConnectedClientCount() const -> int;
// For applying player-profiles data from the master-server.
auto SetClientInfoFromMasterServer(const std::string& client_token,
PyObject* info) -> void;
auto SendChatMessage(const std::string& message,
const std::vector<int>* clients = nullptr,
const std::string* sender_override = nullptr) -> void;
// Send a screen message to all connected clients AND print it on the host.
auto SendScreenMessageToAll(const std::string& s, float r, float g, float b)
-> void;
// send a screen message to all connected clients
auto SendScreenMessageToClients(const std::string& s, float r, float g,
float b) -> void;
// Send a screen message to specific connected clients (those matching the IDs
// specified) the id -1 can be used to specify the host.
auto SendScreenMessageToSpecificClients(const std::string& s, float r,
float g, float b,
const std::vector<int>& clients)
-> void;
#if BA_GOOGLE_BUILD
auto PushClientDisconnectedGooglePlayCall(int id) -> void;
int GetGooglePlayClientCount() const;
auto PushHostConnectedGooglePlayCall() -> void;
auto PushClientConnectedGooglePlayCall(int id) -> void;
auto PushCompressedGamePacketFromHostGooglePlayCall(
const std::vector<uint8_t>& data) -> void;
auto PushCompressedGamePacketFromClientGooglePlayCall(
int google_client_id, const std::vector<uint8_t>& data) -> void;
auto ClientIDFromGooglePlayClientID(int google_id) -> int;
auto GooglePlayClientIDFromClientID(int client_id) -> int;
#endif
auto UDPConnectionPacket(const std::vector<uint8_t>& data,
const SockAddr& addr) -> void;
auto PushClientDisconnectedCall(int id) -> void;
private:
// Try to minimize the chance a garbage packet will have this id.
int next_connection_to_client_id_{113};
std::map<int, Object::Ref<ConnectionToClient> > connections_to_clients_;
Object::Ref<ConnectionToHost> connection_to_host_;
ClientControllerInterface* client_controller_{};
// Simple flag for thread-safe access.
bool has_connection_to_host_{};
bool print_udp_connect_progress_{true};
// Prevents us from printing multiple 'you got disconnected' messages.
bool printed_host_disconnect_{};
#if BA_GOOGLE_BUILD
std::map<int, int> google_play_id_to_client_id_map_;
std::map<int, int> client_id_to_google_play_id_map_;
#endif
};
} // namespace ballistica
#endif // BALLISTICA_GAME_CONNECTION_CONNECTION_SET_H_

View File

@ -34,7 +34,7 @@ class ConnectionToHostUDP : public ConnectionToHost {
bool did_die_{};
void Die();
void SendDisconnectRequest();
millisecs_t last_client_i_d_request_time_{};
millisecs_t last_client_id_request_time_{};
millisecs_t last_disconnect_request_time_{};
int client_id_{};
millisecs_t last_host_response_time_{};

2212
src/ballistica/game/game.cc Normal file

File diff suppressed because it is too large Load Diff

View File

@ -38,8 +38,6 @@ class Game : public Module {
const std::string& token) -> void;
auto PushAwardAdTicketsCall() -> void;
auto PushAwardAdTournamentEntryCall() -> void;
auto PushUDPConnectionPacketCall(const std::vector<uint8_t>& data,
const SockAddr& addr) -> void;
auto PushPartyInviteCall(const std::string& name,
const std::string& invite_id) -> void;
auto PushPartyInviteRevokeCall(const std::string& invite_id) -> void;
@ -106,27 +104,11 @@ class Game : public Module {
auto PushBackButtonCall(InputDevice* input_device) -> void;
auto PushOnAppResumeCall() -> void;
auto PushFrameDefRequest() -> void;
auto PushDisconnectFromHostCall() -> void;
auto PushClientDisconnectedCall(int id) -> void;
auto PushHostConnectedUDPCall(const SockAddr& addr,
bool print_connect_progress) -> void;
auto PushDisconnectedFromHostCall() -> void;
auto ChangeGameSpeed(int offs) -> void;
auto ResetInput() -> void;
auto RunMainMenu() -> void;
auto HandleThreadPause() -> void override;
#if BA_GOOGLE_BUILD
auto PushClientDisconnectedGooglePlayCall(int id) -> void;
int GetGooglePlayClientCount() const;
auto PushHostConnectedGooglePlayCall() -> void;
auto PushClientConnectedGooglePlayCall(int id) -> void;
auto PushCompressedGamePacketFromHostGooglePlayCall(
const std::vector<uint8_t>& data) -> void;
auto PushCompressedGamePacketFromClientGooglePlayCall(
int google_client_id, const std::vector<uint8_t>& data) -> void;
#endif
#if BA_VR_BUILD
auto PushVRHandsState(const VRHandsState& state) -> void;
const VRHandsState& vr_hands_state() const { return vr_hands_state_; }
@ -179,35 +161,6 @@ class Game : public Module {
auto replay_speed_exponent() const -> int { return replay_speed_exponent_; }
auto replay_speed_mult() const -> float { return replay_speed_mult_; }
// Returns our host-connection or nullptr if there is none.
auto connection_to_host() -> ConnectionToHost* {
return connection_to_host_.get();
}
auto GetConnectionToHostUDP() -> ConnectionToHostUDP*;
// Send a screen message to all connected clients AND print it on the host.
auto SendScreenMessageToAll(const std::string& s, float r, float g, float b)
-> void;
// send a screen message to all connected clients
auto SendScreenMessageToClients(const std::string& s, float r, float g,
float b) -> void;
// Send a screen message to specific connected clients (those matching the IDs
// specified) the id -1 can be used to specify the host.
auto SendScreenMessageToSpecificClients(const std::string& s, float r,
float g, float b,
const std::vector<int>& clients)
-> void;
// Return our client connections (if any).
// FIXME: this prunes invalid connections, but it is necessary?
// Can we just use connections_to_clients() for direct access?
auto GetConnectionsToClients() -> std::vector<ConnectionToClient*>;
// Return the number of connections-to-client with "connected" status true.
auto GetConnectedClientCount() const -> int;
auto GetPartySize() const -> int;
auto last_connection_to_client_join_time() const -> millisecs_t {
return last_connection_to_client_join_time_;
@ -216,34 +169,12 @@ class Game : public Module {
last_connection_to_client_join_time_ = val;
}
// Simple thread safe query.
auto has_connection_to_host() const -> bool {
return has_connection_to_host_;
}
auto game_roster() const -> cJSON* { return game_roster_; }
auto SendChatMessage(const std::string& message,
const std::vector<int>* clients = nullptr,
const std::string* sender_override = nullptr) -> void;
// Quick test as to whether there are clients. Does not check if they are
// fully connected.
auto has_connection_to_clients() const -> bool {
assert(InGameThread());
return (!connections_to_clients_.empty());
}
auto chat_messages() const -> const std::list<std::string>& {
return chat_messages_;
}
// Whoever wants to wrangle current client connections should call this
// to register itself. Note that it must explicitly call unregister when
// unregistering itself.
auto RegisterClientController(ClientControllerInterface* c) -> void;
auto UnregisterClientController(ClientControllerInterface* c) -> void;
// Used to know which globals is in control currently/etc.
auto GetForegroundScene() const -> Scene* {
assert(InGameThread());
@ -251,19 +182,10 @@ class Game : public Module {
}
auto SetForegroundScene(Scene* sg) -> void;
// Returns true if disconnect attempts are supported.
auto DisconnectClient(int client_id, int ban_seconds) -> bool;
auto UpdateGameRoster() -> void;
auto IsPlayerBanned(const PlayerSpec& spec) -> bool;
auto BanPlayer(const PlayerSpec& spec, millisecs_t duration) -> void;
// For applying player-profiles data from the master-server.
auto SetClientInfoFromMasterServer(const std::string& client_token,
PyObject* info) -> void;
auto GetPrintUDPConnectProgress() const -> bool {
return print_udp_connect_progress_;
}
// For cheat detection. Returns the largest amount of time that has passed
// between frames since our last reset (for detecting memory modification
// UIs/etc).
@ -298,20 +220,8 @@ class Game : public Module {
return admin_public_ids_;
}
auto connections_to_clients()
-> const std::map<int, Object::Ref<ConnectionToClient> >& {
return connections_to_clients_;
}
auto client_controller() -> ClientControllerInterface* {
return client_controller_;
}
auto kick_vote_in_progress() const -> bool { return kick_vote_in_progress_; }
#if BA_GOOGLE_BUILD
auto ClientIDFromGooglePlayClientID(int google_id) -> int;
auto GooglePlayClientIDFromClientID(int client_id) -> int;
#endif
auto SetPublicPartyEnabled(bool val) -> void;
auto public_party_enabled() const { return public_party_enabled_; }
auto public_party_size() const { return public_party_size_; }
@ -333,12 +243,16 @@ class Game : public Module {
auto public_party_player_count() const { return public_party_player_count_; }
auto SetPublicPartyPlayerCount(int count) -> void;
auto ran_app_launch_commands() const { return ran_app_launch_commands_; }
auto CleanUpBeforeConnectingToHost() -> void;
auto connections() -> ConnectionSet* {
assert(connections_.get());
return connections_.get();
}
auto mark_game_roster_dirty() -> void { game_roster_dirty_ = true; }
private:
auto InitSpecialChars() -> void;
auto Draw() -> void;
auto UDPConnectionPacket(const std::vector<uint8_t>& data,
const SockAddr& addr) -> void;
auto PartyInvite(const std::string& name, const std::string& invite_id)
-> void;
auto PartyInviteRevoke(const std::string& invite_id) -> void;
@ -358,8 +272,6 @@ class Game : public Module {
int rift_step_index_{};
#endif
auto HandleClientDisconnected(int id) -> void;
auto ForceDisconnectClients() -> void;
auto Prune() -> void; // Periodic pruning of dead stuff.
auto Update() -> void;
auto Process() -> void;
@ -370,21 +282,11 @@ class Game : public Module {
auto UpdateProcessTimer() -> void;
auto Reset() -> void;
auto GetGameRosterMessage() -> std::vector<uint8_t>;
auto CleanUpBeforeConnectingToHost() -> void;
auto Shutdown(bool soft) -> void;
std::map<int, int> google_play_id_to_client_id_map_;
std::map<int, int> client_id_to_google_play_id_map_;
bool print_udp_connect_progress_{true};
std::unique_ptr<ConnectionSet> connections_;
std::list<std::pair<millisecs_t, PlayerSpec> > banned_players_;
ClientControllerInterface* client_controller_{};
std::list<std::string> chat_messages_;
// Simple flag for thread-safe access.
bool has_connection_to_host_{};
// Prevents us from printing multiple 'you got disconnected' messages.
bool printed_host_disconnect_{};
bool chat_muted_{};
bool first_update_{true};
bool game_roster_dirty_{};
@ -423,10 +325,6 @@ class Game : public Module {
bool kick_voting_enabled_{true};
std::set<std::string> admin_public_ids_;
// Try to minimize the chance a garbage packet will have this id.
int next_connection_to_client_id_{113};
std::map<int, Object::Ref<ConnectionToClient> > connections_to_clients_;
Object::Ref<ConnectionToHost> connection_to_host_;
cJSON* game_roster_{};
millisecs_t kick_vote_end_time_{};
bool kick_vote_in_progress_{};

View File

@ -17,70 +17,75 @@ class GameStream : public Object, public ClientControllerInterface {
public:
GameStream(HostSession* host_session, bool saveReplay);
~GameStream() override;
void SetTime(millisecs_t t);
void AddScene(Scene* s);
void RemoveScene(Scene* s);
void StepScene(Scene* s);
void AddNode(Node* n);
void NodeOnCreate(Node* n);
void RemoveNode(Node* n);
void SetForegroundScene(Scene* sg);
void AddMaterial(Material* m);
void RemoveMaterial(Material* m);
void AddMaterialComponent(Material* m, MaterialComponent* c);
void AddTexture(Texture* t);
void RemoveTexture(Texture* t);
void AddModel(Model* t);
void RemoveModel(Model* t);
void AddSound(Sound* t);
void RemoveSound(Sound* t);
void AddData(Data* d);
void RemoveData(Data* d);
void AddCollideModel(CollideModel* t);
void RemoveCollideModel(CollideModel* t);
void ConnectNodeAttribute(Node* src_node, NodeAttributeUnbound* src_attr,
Node* dst_node, NodeAttributeUnbound* dst_attr);
void NodeMessage(Node* node, const char* buffer, size_t size);
void SetNodeAttr(const NodeAttribute& attr, float val);
void SetNodeAttr(const NodeAttribute& attr, int64_t val);
void SetNodeAttr(const NodeAttribute& attr, bool val);
void SetNodeAttr(const NodeAttribute& attr, const std::vector<float>& vals);
void SetNodeAttr(const NodeAttribute& attr, const std::vector<int64_t>& vals);
void SetNodeAttr(const NodeAttribute& attr, const std::string& val);
void SetNodeAttr(const NodeAttribute& attr, Node* n);
void SetNodeAttr(const NodeAttribute& attr, const std::vector<Node*>& vals);
void SetNodeAttr(const NodeAttribute& attr, Player* n);
void SetNodeAttr(const NodeAttribute& attr,
const std::vector<Material*>& vals);
void SetNodeAttr(const NodeAttribute& attr, Texture* n);
void SetNodeAttr(const NodeAttribute& attr,
const std::vector<Texture*>& vals);
void SetNodeAttr(const NodeAttribute& attr, Sound* n);
void SetNodeAttr(const NodeAttribute& attr, const std::vector<Sound*>& vals);
void SetNodeAttr(const NodeAttribute& attr, Model* n);
void SetNodeAttr(const NodeAttribute& attr, const std::vector<Model*>& vals);
void SetNodeAttr(const NodeAttribute& attr, CollideModel* n);
void SetNodeAttr(const NodeAttribute& attr,
const std::vector<CollideModel*>& vals);
void PlaySoundAtPosition(Sound* sound, float volume, float x, float y,
float z);
void PlaySound(Sound* sound, float volume);
void EmitBGDynamics(const BGDynamicsEmission& e);
auto SetTime(millisecs_t t) -> void;
auto AddScene(Scene* s) -> void;
auto RemoveScene(Scene* s) -> void;
auto StepScene(Scene* s) -> void;
auto AddNode(Node* n) -> void;
auto NodeOnCreate(Node* n) -> void;
auto RemoveNode(Node* n) -> void;
auto SetForegroundScene(Scene* sg) -> void;
auto AddMaterial(Material* m) -> void;
auto RemoveMaterial(Material* m) -> void;
auto AddMaterialComponent(Material* m, MaterialComponent* c) -> void;
auto AddTexture(Texture* t) -> void;
auto RemoveTexture(Texture* t) -> void;
auto AddModel(Model* t) -> void;
auto RemoveModel(Model* t) -> void;
auto AddSound(Sound* t) -> void;
auto RemoveSound(Sound* t) -> void;
auto AddData(Data* d) -> void;
auto RemoveData(Data* d) -> void;
auto AddCollideModel(CollideModel* t) -> void;
auto RemoveCollideModel(CollideModel* t) -> void;
auto ConnectNodeAttribute(Node* src_node, NodeAttributeUnbound* src_attr,
Node* dst_node, NodeAttributeUnbound* dst_attr)
-> void;
auto NodeMessage(Node* node, const char* buffer, size_t size) -> void;
auto SetNodeAttr(const NodeAttribute& attr, float val) -> void;
auto SetNodeAttr(const NodeAttribute& attr, int64_t val) -> void;
auto SetNodeAttr(const NodeAttribute& attr, bool val) -> void;
auto SetNodeAttr(const NodeAttribute& attr, const std::vector<float>& vals)
-> void;
auto SetNodeAttr(const NodeAttribute& attr, const std::vector<int64_t>& vals)
-> void;
auto SetNodeAttr(const NodeAttribute& attr, const std::string& val) -> void;
auto SetNodeAttr(const NodeAttribute& attr, Node* n) -> void;
auto SetNodeAttr(const NodeAttribute& attr, const std::vector<Node*>& vals)
-> void;
auto SetNodeAttr(const NodeAttribute& attr, Player* n) -> void;
auto SetNodeAttr(const NodeAttribute& attr,
const std::vector<Material*>& vals) -> void;
auto SetNodeAttr(const NodeAttribute& attr, Texture* n) -> void;
auto SetNodeAttr(const NodeAttribute& attr, const std::vector<Texture*>& vals)
-> void;
auto SetNodeAttr(const NodeAttribute& attr, Sound* n) -> void;
auto SetNodeAttr(const NodeAttribute& attr, const std::vector<Sound*>& vals)
-> void;
auto SetNodeAttr(const NodeAttribute& attr, Model* n) -> void;
auto SetNodeAttr(const NodeAttribute& attr, const std::vector<Model*>& vals)
-> void;
auto SetNodeAttr(const NodeAttribute& attr, CollideModel* n) -> void;
auto SetNodeAttr(const NodeAttribute& attr,
const std::vector<CollideModel*>& vals) -> void;
auto PlaySoundAtPosition(Sound* sound, float volume, float x, float y,
float z) -> void;
auto PlaySound(Sound* sound, float volume) -> void;
auto EmitBGDynamics(const BGDynamicsEmission& e) -> void;
auto GetSoundID(Sound* s) -> int64_t;
auto GetMaterialID(Material* m) -> int64_t;
void ScreenMessageBottom(const std::string& val, float r, float g, float b);
void ScreenMessageTop(const std::string& val, float r, float g, float b,
auto ScreenMessageBottom(const std::string& val, float r, float g, float b)
-> void;
auto ScreenMessageTop(const std::string& val, float r, float g, float b,
Texture* texture, Texture* tint_texture, float tint_r,
float tint_g, float tint_b, float tint2_r,
float tint2_g, float tint2_b);
void OnClientConnected(ConnectionToClient* c) override;
void OnClientDisconnected(ConnectionToClient* c) override;
float tint2_g, float tint2_b) -> void;
auto OnClientConnected(ConnectionToClient* c) -> void override;
auto OnClientDisconnected(ConnectionToClient* c) -> void override;
auto GetOutMessage() const -> std::vector<uint8_t>;
private:
HostSession* host_session_;
// Make sure the scene is in our stream.
// Make sure various components are part of our stream.
auto IsValidScene(Scene* val) -> bool;
auto IsValidNode(Node* val) -> bool;
auto IsValidTexture(Texture* val) -> bool;
@ -89,9 +94,49 @@ class GameStream : public Object, public ClientControllerInterface {
auto IsValidData(Data* val) -> bool;
auto IsValidCollideModel(CollideModel* val) -> bool;
auto IsValidMaterial(Material* val) -> bool;
auto Flush() -> void;
auto AddMessageToReplay(const std::vector<uint8_t>& message) -> void;
auto Fail() -> void;
auto ShipSessionCommandsMessage() -> void;
auto SendPhysicsCorrection(bool blend) -> void;
auto EndCommand(bool is_time_set = false) -> void;
auto WriteString(const std::string& s) -> void;
auto WriteFloat(float val) -> void;
auto WriteFloats(size_t count, const float* vals) -> void;
auto WriteInts32(size_t count, const int32_t* vals) -> void;
auto WriteInts64(size_t count, const int64_t* vals) -> void;
auto WriteChars(size_t count, const char* vals) -> void;
auto WriteCommand(SessionCommand cmd) -> void;
auto WriteCommandInt32(SessionCommand cmd, int32_t value) -> void;
auto WriteCommandInt64(SessionCommand cmd, int64_t value) -> void;
auto WriteCommandInt32_2(SessionCommand cmd, int32_t value1, int32_t value2)
-> void;
auto WriteCommandInt64_2(SessionCommand cmd, int64_t value1, int64_t value2)
-> void;
auto WriteCommandInt32_3(SessionCommand cmd, int32_t value1, int32_t value2,
int32_t value3) -> void;
auto WriteCommandInt64_3(SessionCommand cmd, int64_t value1, int64_t value2,
int64_t value3) -> void;
auto WriteCommandInt32_4(SessionCommand cmd, int32_t value1, int32_t value2,
int32_t value3, int32_t value4) -> void;
auto WriteCommandInt64_4(SessionCommand cmd, int64_t value1, int64_t value2,
int64_t value3, int64_t value4) -> void;
template <typename T>
auto GetPointerCount(const std::vector<T*>& vec) -> size_t;
template <typename T>
auto GetFreeIndex(std::vector<T*>* vec, std::vector<size_t>* free_indices)
-> size_t;
template <typename T>
auto Add(T* val, std::vector<T*>* vec, std::vector<size_t>* free_indices)
-> void;
template <typename T>
auto Remove(T* val, std::vector<T*>* vec, std::vector<size_t>* free_indices)
-> void;
HostSession* host_session_;
millisecs_t next_flush_time_;
void Flush();
void AddMessageToReplay(const std::vector<uint8_t>& message);
// Individual command going into the commands-messages.
std::vector<uint8_t> out_command_;
@ -101,40 +146,8 @@ class GameStream : public Object, public ClientControllerInterface {
std::vector<ConnectionToClient*> connections_to_clients_;
std::vector<ConnectionToClient*> connections_to_clients_ignored_;
bool writing_replay_;
void Fail();
millisecs_t last_physics_correction_time_;
millisecs_t last_send_time_;
void ShipSessionCommandsMessage();
void SendPhysicsCorrection(bool blend);
void EndCommand(bool is_time_set = false);
void WriteString(const std::string& s);
void WriteFloat(float val);
void WriteFloats(size_t count, const float* vals);
void WriteInts32(size_t count, const int32_t* vals);
void WriteInts64(size_t count, const int64_t* vals);
void WriteChars(size_t count, const char* vals);
void WriteCommand(SessionCommand cmd);
void WriteCommandInt32(SessionCommand cmd, int32_t value);
void WriteCommandInt64(SessionCommand cmd, int64_t value);
void WriteCommandInt32_2(SessionCommand cmd, int32_t value1, int32_t value2);
void WriteCommandInt64_2(SessionCommand cmd, int64_t value1, int64_t value2);
void WriteCommandInt32_3(SessionCommand cmd, int32_t value1, int32_t value2,
int32_t value3);
void WriteCommandInt64_3(SessionCommand cmd, int64_t value1, int64_t value2,
int64_t value3);
void WriteCommandInt32_4(SessionCommand cmd, int32_t value1, int32_t value2,
int32_t value3, int32_t value4);
void WriteCommandInt64_4(SessionCommand cmd, int64_t value1, int64_t value2,
int64_t value3, int64_t value4);
template <typename T>
auto GetPointerCount(const std::vector<T*>& vec) -> size_t;
template <typename T>
auto GetFreeIndex(std::vector<T*>* vec, std::vector<size_t>* free_indices)
-> size_t;
template <typename T>
void Add(T* val, std::vector<T*>* vec, std::vector<size_t>* free_indices);
template <typename T>
void Remove(T* val, std::vector<T*>* vec, std::vector<size_t>* free_indices);
millisecs_t time_;
std::vector<Scene*> scenes_;
std::vector<size_t> free_indices_scene_graphs_;

View File

@ -9,6 +9,7 @@
#include "ballistica/app/app.h"
#include "ballistica/app/app_globals.h"
#include "ballistica/dynamics/bg/bg_dynamics.h"
#include "ballistica/game/connection/connection_set.h"
#include "ballistica/game/connection/connection_to_client.h"
#include "ballistica/game/connection/connection_to_host.h"
#include "ballistica/game/session/session.h"
@ -295,7 +296,8 @@ void Graphics::DrawMiscOverlays(RenderPass* pass) {
bool show = false;
// Add in/out data for any host connection.
if (ConnectionToHost* connection_to_host = g_game->connection_to_host()) {
if (ConnectionToHost* connection_to_host =
g_game->connections()->connection_to_host()) {
if (connection_to_host->can_communicate()) show = true;
in_size += connection_to_host->GetBytesInPerSecond();
in_size_compressed += connection_to_host->GetBytesInPerSecondCompressed();
@ -309,7 +311,7 @@ void Graphics::DrawMiscOverlays(RenderPass* pass) {
ping = connection_to_host->average_ping();
} else {
int connected_count = 0;
for (auto&& i : g_game->connections_to_clients()) {
for (auto&& i : g_game->connections()->connections_to_clients()) {
ConnectionToClient* client = i.second.get();
if (client->can_communicate()) {
show = true;

View File

@ -8,6 +8,7 @@
#include "ballistica/app/app.h"
#include "ballistica/app/app_globals.h"
#include "ballistica/audio/audio.h"
#include "ballistica/game/connection/connection_set.h"
#include "ballistica/game/player.h"
#include "ballistica/graphics/renderer.h"
#include "ballistica/python/python.h"
@ -1024,7 +1025,7 @@ void Joystick::HandleSDLEvent(const SDL_Event* e) {
// FIXME: Need a call we can make for this.
bool do_party_button = false;
int party_size = g_game->GetPartySize();
if (party_size > 1 || g_game->connection_to_host()
if (party_size > 1 || g_game->connections()->connection_to_host()
|| g_ui->root_ui()->always_draw_party_icon()) {
do_party_button = true;
}

View File

@ -137,22 +137,6 @@ class Networking {
};
auto GetScanResults() -> std::vector<ScanResultsEntry>;
/// Sends a POST request to the master server and returns the response.
/// path should be something like "/mystatspage".
/// Throws std::exceptions (NOT ballistica Exceptions) if something goes
/// wrong.
static auto MasterServerPost(
const std::string& path,
const std::map<std::string, std::string>& parameters,
bool use_fallback_addr = false) -> std::string;
/// Sends a GET request to the master server and returns the response.
/// path should be something like "/mystatspage".
/// Throws std::exceptions (NOT ballistica Exceptions) if something goes
/// wrong.
static auto MasterServerGet(const std::string& path,
bool use_fallback_addr = false) -> std::string;
private:
void PruneScanResults();
struct ScanResultsEntryPriv;

View File

@ -8,6 +8,7 @@
#include "ballistica/app/app.h"
#include "ballistica/app/app_globals.h"
#include "ballistica/core/logging.h"
#include "ballistica/game/connection/connection_set.h"
#include "ballistica/game/game_stream.h"
#include "ballistica/game/host_activity.h"
#include "ballistica/game/session/host_session.h"
@ -501,10 +502,11 @@ auto PyScreenMessage(PyObject* self, PyObject* args, PyObject* keywds)
std::vector<int32_t> client_ids;
if (clients_obj != Py_None) {
std::vector<int> client_ids2 = Python::GetPyInts(clients_obj);
g_game->SendScreenMessageToSpecificClients(message, color.x, color.y,
color.z, client_ids2);
g_game->connections()->SendScreenMessageToSpecificClients(
message, color.x, color.y, color.z, client_ids2);
} else {
g_game->SendScreenMessageToAll(message, color.x, color.y, color.z);
g_game->connections()->SendScreenMessageToAll(message, color.x, color.y,
color.z);
}
} else {
// Currently specifying client_ids only works for transient messages; we'd

View File

@ -11,6 +11,7 @@
#include "ballistica/dynamics/collision.h"
#include "ballistica/dynamics/dynamics.h"
#include "ballistica/dynamics/material/material_action.h"
#include "ballistica/game/connection/connection_set.h"
#include "ballistica/game/connection/connection_to_client.h"
#include "ballistica/game/game_stream.h"
#include "ballistica/game/host_activity.h"
@ -467,8 +468,9 @@ auto PyGetGameRoster(PyObject* self, PyObject* args, PyObject* keywds)
if (clientid == -1) {
account_id = AppInternalGetPublicAccountID();
} else {
auto client2 = g_game->connections_to_clients().find(clientid);
if (client2 != g_game->connections_to_clients().end()) {
auto client2 =
g_game->connections()->connections_to_clients().find(clientid);
if (client2 != g_game->connections()->connections_to_clients().end()) {
account_id = client2->second->peer_public_account_id();
}
}

View File

@ -8,6 +8,7 @@
#include "ballistica/app/app.h"
#include "ballistica/app/app_globals.h"
#include "ballistica/game/account.h"
#include "ballistica/game/connection/connection_set.h"
#include "ballistica/game/game.h"
#include "ballistica/input/input.h"
#include "ballistica/python/python.h"
@ -2053,7 +2054,7 @@ auto PyChatMessage(PyObject* self, PyObject* args, PyObject* keywds)
std::vector<int> clients = Python::GetPyInts(clients_obj);
clients_p = &clients;
}
g_game->SendChatMessage(message, clients_p, sender_override_p);
g_game->connections()->SendChatMessage(message, clients_p, sender_override_p);
Py_RETURN_NONE;
BA_PYTHON_CATCH;
}
@ -2150,7 +2151,8 @@ auto PyCanShowAd(PyObject* self, PyObject* args, PyObject* keywds)
// them or whatnot) also disallow ads if remote apps are connected; at least
// on android ads pause our activity which disconnects the remote app.. (could
// potentially still allow on other platforms; should verify..)
if (g_game->connection_to_host() || g_game->has_connection_to_clients()
if (g_game->connections()->connection_to_host()
|| g_game->connections()->has_connection_to_clients()
|| g_input->HaveRemoteAppController()) {
Py_RETURN_FALSE;
}
@ -2262,7 +2264,8 @@ auto PyIsPartyIconVisible(PyObject* self, PyObject* args, PyObject* keywds)
Platform::SetLastPyCall("is_party_icon_visible");
BA_PYTHON_TRY;
bool party_button_active =
(g_game->GetConnectedClientCount() > 0 || g_game->connection_to_host()
(g_game->connections()->GetConnectedClientCount() > 0
|| g_game->connections()->connection_to_host()
|| g_ui->root_ui()->always_draw_party_icon());
if (party_button_active) {
Py_RETURN_TRUE;

View File

@ -5,6 +5,7 @@
#include <algorithm>
#include <string>
#include "ballistica/game/connection/connection_set.h"
#include "ballistica/game/game.h"
#include "ballistica/game/session/host_session.h"
#include "ballistica/graphics/component/simple_component.h"
@ -46,7 +47,7 @@ RootUI::~RootUI() = default;
void RootUI::TogglePartyWindowKeyPress() {
assert(InGameThread());
if (g_game->GetPartySize() > 1 || g_game->connection_to_host()
if (g_game->GetPartySize() > 1 || g_game->connections()->connection_to_host()
|| always_draw_party_icon()) {
ActivatePartyIcon();
}
@ -81,8 +82,9 @@ auto RootUI::HandleMouseButtonDown(float x, float y) -> bool {
if (explicit_bool(DO_OLD_MENU_PARTY_BUTTONS)) {
bool party_button_active =
(!party_window_open_
&& (g_game->GetConnectedClientCount() > 0
|| g_game->connection_to_host() || always_draw_party_icon()));
&& (g_game->connections()->GetConnectedClientCount() > 0
|| g_game->connections()->connection_to_host()
|| always_draw_party_icon()));
float party_button_left =
menu_active ? 2 * menu_button_size_ : menu_button_size_;
float party_button_right = menu_active ? menu_button_size_ : 0;
@ -202,7 +204,7 @@ void RootUI::Draw(FrameDef* frame_def) {
// (this probably shouldn't live here).
bool draw_connected_players_icon = false;
int party_size = g_game->GetPartySize();
bool is_host = (g_game->connection_to_host() == nullptr);
bool is_host = (g_game->connections()->connection_to_host() == nullptr);
millisecs_t last_connection_to_client_join_time =
g_game->last_connection_to_client_join_time();
@ -211,7 +213,7 @@ void RootUI::Draw(FrameDef* frame_def) {
&& real_time - last_connection_to_client_join_time < 5000);
if (!party_window_open_
&& (party_size != 0 || g_game->connection_to_host()
&& (party_size != 0 || g_game->connections()->connection_to_host()
|| always_draw_party_icon_)) {
draw_connected_players_icon = true;
}

View File

@ -116,23 +116,30 @@ def _trim_docstring(docstring: str) -> str:
def _spelling(words: List[str]) -> None:
fname = '.idea/dictionaries/ericf.xml'
with open(fname) as infile:
lines = infile.read().splitlines()
if lines[2] != ' <words>':
raise RuntimeError('Unexpected dictionary format.')
added_count = 0
for word in words:
line = f' <w>{word.lower()}</w>'
if line not in lines:
lines.insert(3, line)
added_count += 1
import os
for fname in [
'.idea/dictionaries/ericf.xml',
'ballisticacore-cmake/.idea/dictionaries/ericf.xml'
]:
if not os.path.exists(fname):
continue
with open(fname) as infile:
lines = infile.read().splitlines()
if lines[2] != ' <words>':
raise RuntimeError('Unexpected dictionary format.')
added_count = 0
for word in words:
line = f' <w>{word.lower()}</w>'
if line not in lines:
lines.insert(3, line)
added_count += 1
with open(fname, 'w') as outfile:
# Sort lines in the words section.
assert all(l.startswith(' <w>') for l in lines[3:-3])
outfile.write('\n'.join(lines[:3] + sorted(lines[3:-3]) + lines[-3:]))
print('Added', added_count, 'words to the dictionary.')
with open(fname, 'w') as outfile:
# Sort lines in the words section.
assert all(l.startswith(' <w>') for l in lines[3:-3])
outfile.write('\n'.join(lines[:3] + sorted(lines[3:-3]) +
lines[-3:]))
print(f'Added {added_count} words to {fname}.')
def spelling_all() -> None: