1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995
|
/*
* Copyright (C) Volition, Inc. 1999. All rights reserved.
*
* All source code herein is the property of Volition, Inc. You may not sell
* or otherwise commercially exploit the source or things you created based on the
* source.
*
*/
#ifndef _MULTI_H
#define _MULTI_H
#include "globalincs/pstypes.h"
#include "network/psnet2.h" // for PSNET_SOCKET
#include "network/multi_ping.h"
#include "network/multi_options.h"
#include "io/keycontrol.h"
#include "io/timer.h"
#include "globalincs/globals.h"
class p_object;
struct CFILE;
class player;
// ----------------------------------------------------------------------------------------
// Basic defines
//
//
// defines for checking PXO valid missions
#ifdef NDEBUG
// NEVER COMMENT OUT THIS LINE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define PXO_CHECK_VALID_MISSIONS // always check for valid missions in a debug build
#else
// #define PXO_CHECK_VALID_MISSIONS // comment this in and out as necessary (for testing or not)
#endif
// name of the validated mission file for PXO missions
#define MULTI_VALID_MISSION_FILE "mvalid.cfg"
// server version and compatible version
// to join a game - your LOCAL.MULTI_FS_SERVER_COMPATIBLE_VERSION must be >= GAME_SERVER.MULTI_FS_SERVER_VERSION
// Version #. Please put the date down when you up these values
// NOTE: always keep SERVER_VERSION and SERVER_COMPATIBLE_VERSION the same
//
// Version 32 - 1/29/99
// Version 33 - 2/22/99
// Version 34 - 4/8/99
// Version 35 - 4/21/99
// Version 36 - 4/28/99
// Version 37 - 4/29/99
// Version 38 - 5/17/77
// Version 39 - 7/3/99
// Version 40 - 7/7/99
// Version 41 - 7/22/99
// Version 42 - 7/26/99 (ingame join stuff)
// Version 43 - 7/30/99
// Version 44 - 8/24/99
// Version 46 - 8/30/99
// Version 47 - 11/11/2003 - (FS2OpenPXO, FS2 Open Changes - FS2Open 3.6)
// revert 46 - 9/7/2006 - (the 47 bump wasn't needed, reverting to retail version for compatibility reasons)
// Version 48 - 8/15/2016 - Multiple changes to the packet format for multi sexps
// Version 49 - 7/26/2020 - Addition of multilock
// Version 50 - 7/27/2020 - IPv6
// Version 51 - 9/20/2020 - Object Update Packet Upgrade: Waypoints, subsystem rotation, bandwidth improvements, bugfixes
// Version 52 - 10/9/2020 - Dumbfire Rollback, increases accuracy of high ping, or delayed packet primary fire for clients.
// Version 53 - 12/2/2020 - big set of packet fixes/upgrades
// Version 54 - 3/20/2021 - Fixes for FSO 21_2 especially better net_sig calc, better missile intercept
// Version 55 - 8/28/2021 - Adding multi-compatible animations
// Version 56 - 8/28/2021 - Fix animations for 22_0 release
// Version 57 - 6/5/2022 - Upgrade interpolation, fix multiplayer sexp handling, and enable player orders to exceed 16
// Version 58 - 11/14/2022 - Enable turret movement on clients, and fix in-game joining
// Version 59 - 12/9/2022 - New IDs for SEXP operators
// Version 60 - 3/27/2023 - Added generic lua data packet
// Version 61 - 4/17/2023 - Added compatibility for whackable asteroids (added force)
// STANDALONE_ONLY
#define MULTI_FS_SERVER_VERSION 61
#define MULTI_FS_SERVER_COMPATIBLE_VERSION MULTI_FS_SERVER_VERSION
// version defines (i.e. demo, full version, special OEM version
// id's should not be > 255!!!!
#define NG_VERSION_ID_FULL 1
// set the next define to be what version you want to build for.
#define NG_VERSION_ID NG_VERSION_ID_FULL
// the max # of active players (flying ships)
#define MULTI_MAX_PLAYERS 12
// the total max # of connections (players + observers + (possibly)standalone server)
#define MULTI_MAX_CONNECTIONS 16
// the max # of observers ever allowed
#define MAX_OBSERVERS 4
#define LOGIN_LEN 33
// string length defines
#define MAX_GAMENAME_LEN 32 // maximum length in characters of a game name
#define DESCRIPT_LENGTH 512 // maximum length of a mission description (as specified by Fred)
#define MAX_PASSWD_LEN 16 // maximum length of the password for a netgame
// netgame defines
#define MP_SINGLE_MISSION 0 // not playing a campaign - single mission
#define MP_CAMPAIGN 1 // playing a campaign
// respawn defines
#define RESPAWN_INVUL_TIMESTAMP 5000 // how long a player is invulnerable after he respawns
#define MAX_RESPAWN_POINTS 25 // the max # of respawn points we'll keep track of for any mission
// player information defines
#define BUTTON_INFO_SAVE_COUNT 30 // how many buttons infos we keep track of for sending critical keypresses to the server
#define MAX_PINGS 10 // how many pings we keep track of for averaging player pings
// reliable connect wait
#define MULTI_RELIABLE_CONNECT_WAIT 15
// tracker mission validation status
#define MVALID_STATUS_UNKNOWN -1
#define MVALID_STATUS_VALID 0
#define MVALID_STATUS_INVALID 1
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// Network macros
//
//
// netplayer management
#define NET_PLAYER_INDEX(np) (static_cast<int>(np-Net_players))
#define NET_PLAYER_NUM(np) (NET_PLAYER_INDEX(np))
#define MY_NET_PLAYER_NUM (NET_PLAYER_INDEX(Net_player))
// determine what the status of this machine is
#define MULTIPLAYER_MASTER ( (Game_mode & GM_MULTIPLAYER) && (Net_player->flags & NETINFO_FLAG_AM_MASTER) )
#define MULTIPLAYER_HOST ( (Game_mode & GM_MULTIPLAYER) && (Net_player->flags & NETINFO_FLAG_GAME_HOST) )
#define MULTIPLAYER_CLIENT ( (Game_mode & GM_MULTIPLAYER) && !(Net_player->flags & NETINFO_FLAG_AM_MASTER) )
#define MULTIPLAYER_STANDALONE ( (Game_mode & GM_MULTIPLAYER) && (Net_players[0].flags & NETINFO_FLAG_AM_MASTER) && !(Net_players[0].flags & NETINFO_FLAG_GAME_HOST) )
// determine the status of the passed player
#define MULTI_CONNECTED(np) (np.flags & NETINFO_FLAG_CONNECTED)
#define MULTI_HOST(np) (np.flags & NETINFO_FLAG_GAME_HOST)
#define MULTI_SERVER(np) (np.flags & NETINFO_FLAG_AM_MASTER)
#define MULTI_STANDALONE(np) ((np.flags & NETINFO_FLAG_AM_MASTER) && !(np.flags & NETINFO_FLAG_GAME_HOST))
#define MULTI_OBSERVER(np) (np.flags & NETINFO_FLAG_OBSERVER)
#define MULTI_TEMP_OBSERVER(np) ((np.flags & NETINFO_FLAG_OBSERVER) && (np.flags & NETINFO_FLAG_OBS_PLAYER))
#define MULTI_PERM_OBSERVER(np) ((np.flags & NETINFO_FLAG_OBSERVER) && !(np.flags & NETINFO_FLAG_OBS_PLAYER))
// are we playing on a master tracker registered server
#define MULTI_IS_TRACKER_GAME ((Game_mode & GM_MULTIPLAYER) && (Multi_options_g.pxo))
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// Packet definitions and additional packet data types
//
//
#define NETPLAYER_SLOTS_P 0x01 // data telling clients what player has what object number ...
#define FIRING_INFO 0x02 // firing info packet
#define INGAME_SHIP_UPDATE 0x03 // ship status-like update for ingame joiners choosing ships.
#define INGAME_SHIP_REQUEST 0x04 // used for requesting a replying (confirm or no) ships for an ingame joiner
#define TEAM_SELECT_UPDATE 0x05 // update from host to players in team select regarding who has what ship
#define FILE_SIG_INFO 0x06 // file signature info ( as calculated by get_bigass_file_signature() )
#define RESPAWN_NOTICE 0x07 // from client to server, or server to client
#define LOAD_MISSION_NOW 0x08 // clients should load the mission and return an ack
#define FILE_SIG_REQUEST 0x09 // request from server to client for filesig info
#define JUMP_INTO_GAME 0x0A // from server to client telling him to jump into the mission
#define RESPAWN_POINTS 0x0B // from server to ingame joiners, giving respawn data
#define CLIENT_REPAIR_INFO 0x0C // passing various data to clients indicating their repair status
#define CARGO_REVEALED 0x0E // cargo is known
#define SHIELD_EXPLOSION 0x0F // shield explosion
#define SUBSYSTEM_DESTROYED 0x10 // update about a subsystem update
#define MISSION_SYNC_DATA 0x11 // this is a unique packet from the host to the server in a standalone game
#define STORE_MISSION_STATS 0x12 // sent to client indicating the host has hit "accept" and they should update their alltime stats
#define DEBRIS_UPDATE 0x13 // debris position, velocity, orientation, etc update
#define SHIP_WSTATE_CHANGE 0x14 // used to tell clients that a ship's primary/secondary state changed
#define WSS_REQUEST_PACKET 0x15 // from client to server, requesting to do an operation
#define WSS_UPDATE_PACKET 0x16 // from server to client, given any update
#define KICK_PLAYER 0x17 // kick a specific player (sent to server by those who are allowed to do this)
#define MISSION_GOAL_INFO 0x18 // update of mission goal info
#define ASTEROID_INFO 0x19 // update of asteroid stuff
#define NETPLAYER_PAIN 0x1A // to notify the player of hits which he may not otherwise see
#define OBJECT_UPDATE_NEW 0x1B
#define SUBSYS_CARGO_REVEALED 0X1C // Capital ship cargo subsystem is known
#define POST_SYNC_DATA 0x20 // a very large packet containing all the data players will need before going into the mission itself
#define PLAYER_SETTINGS 0x21 // player settings for each individual net player
#define WSS_SLOTS_DATA 0x22 // all weapon slots information for the starting wings (needs to be synched)
#define PLAYER_STATS 0x23 // stats for a given player
#define SLOT_UPDATE 0x24 // an player slot position update in multiplayer ship/team select
#define TEAM_UPDATE 0x25 // used for performing misc operations on pregame interface screens for team vs. team games
#define INGAME_EXTRA 0x26 // extra data for ingame joiners
#define HOST_RESTR_QUERY 0x27 // query the host when a player joins a restricted game
#define OPTIONS_UPDATE 0x28 // options (netgame or local) update packet
#define CLIENT_UPDATE 0x29 // sent from server to client periodically to update important info (pause status, etc)
#define CD_VERIFY 0x2A // cd verification update
#define PRIMARY_FIRED_NEW 0x2B // For ships on the server, and client-side firing on LINEAR_WEAPON_FIRED fail
#define COUNTERMEASURE_NEW 0x2C // for client-side firing
#define EVENT_UPDATE 0x2D // event change
#define LINEAR_WEAPON_FIRED 0x2E // Cyborg17 - for firing of non-homing weapons from the player on a client to send to the server
#define SECONDARY_FIRED_AI 0xA0 // fired a secondary weapon (ai ship)
#define SECONDARY_FIRED_PLR 0xA1 // fired a secondary weapon (player ship)
#define COUNTERMEASURE_FIRED 0xA2 // countermeasure was fired
#define FIRE_TURRET_WEAPON 0xA3 // a turret weapon was fired
#define SHIP_STATUS_CHANGE 0xA4 // any of the relevant ship status buttons have been hit (need ack from server)
#define PLAYER_ORDER_PACKET 0xA5 // ship and wing commands sent from client to server
#define AI_INFO_UPDATE 0xA6 // update ai information for the given ship
#define CAMPAIGN_UPDATE 0xA7 // one of several campaign informational packets
#define CAMPAIGN_UPDATE_INGAME 0xA8 // campaign info for ingame joiner
#define HOMING_WEAPON_UPDATE 0xA9 // update homing object and subsystem for homing missile
#define FLAK_FIRED 0xAA // flak gun fired
#define SELF_DESTRUCT 0xAB // self destruct
#define ANIMATION_TRIGGERED 0xAC // Lafiel - Anytime an animation starts
#define TURRET_TRACK 0xAD // Cyborg - When a turret's target has changed.
#define JOIN 0xB1 // a join request to a server
#define ACCEPT 0xB2 // acceptance of a join packet
#define DENY 0xB3 // a join request is denied
#define NOTIFY_NEW_PLAYER 0xB4 // notify players of a new player
#define MISSION_REQUEST 0xB5 // request a list of missions on the master.
#define MISSION_ITEM 0xB6 // a bundle of mission filenames
#define GAME_INFO 0xB7 // game information packet for an active server
#define MULTI_PAUSE_REQUEST 0xB8 // send a request to the server to pause or unpause the game
#define TRANSFER_HOST 0xB9 // transfer host status to the receiver
#define CHANGE_SERVER_ADDR 0xBA // change your host_addr to this value
#define ACCEPT_PLAYER_DATA 0xBB // player data -- sent after guy is accepted
#define BEAM_FIRED 0xBC // a beam weapon was fired
#define SW_STD_QUERY 0xBD // query from host to standalone server to query PXO about a squad war match
#define HUD_MSG 0xC1 // a hud message
#define LEAVE_GAME 0xC2 // indication that a player is leaving the game
#define GAME_CHAT 0xC3 // this chat packet used for FreeSpace
#define MISSION_MESSAGE 0xC4 // a message (squadmate, etc)
#define SHIP_DEPART 0xC5 // a ship has left the building
#define SHIPS_INGAME_PACKET 0xC6 // ingame join ship data packet
#define WINGS_INGAME_PACKET 0xC7 // ingame join wing data packet
#define MISSION_END 0xC8 // sent from host(master) to clients indicating they should go to the debriefing
#define INGAME_NAK 0xC9 // opposite of INGAME_ACK. Uses the ACK_* defines as well.
#define OBSERVER_UPDATE 0xCA // sent from observers to server to give position and orientation
#define SQUADMSG_PLAYER 0xCB // a squadmate message command has been sent to a netplayer
#define OBJ_UPDATE_SYNC 0xCC // object update timebase syncing code
#define FORCE_MISSION_END 0xCD // Force all the players to skip straight to the debrief screen
#define WEAPON_DET 0xD1 // a weapon has detonated, possibly with child weapons
#define SHIP_KILL 0xD2 // a ship was killed
#define WING_CREATE 0xD3 // create and warp in a wing of ships
#define SHIP_CREATE 0xD4 // create and wrap in a ship
#define PING 0xD5 // ping
#define PONG 0xD6 // pong
#define XFER_PACKET 0xD7 // file xfer data of one kind or another
#define VOICE_PACKET 0xD8 // a voice streaming packet of one kind or another
#define NETGAME_END_ERROR 0xD9 // the netgame has been ended by the server because of an error (passed error code)
#define COUNTERMEASURE_SUCCESS 0xDA // countermeasure was successful for this player.
#define REINFORCEMENT_AVAIL 0xDB // a reinforcement is available
#define LIGHTNING_PACKET 0xDC // lightning bolt packet for multiplayer nebula
#define BYTES_SENT 0xDD // how much data we've sent/received
#define MISSILE_KILL 0xDE // get rid of this weapon on the client.
#define GAME_ACTIVE 0xE1 // info on an active game server
#define GAME_QUERY 0xE2 // request for a list of active game servers
#define GAME_UPDATE 0xE3 // update info on an active game server
#define NETPLAYER_UPDATE 0xE4 // a player update packet
#define OBJECT_UPDATE 0xE6 // an object update packet from server to all clients
#define MISSION_LOG_ENTRY 0xE7 // ad an item into the mission log
#define UPDATE_DESCRIPT 0xE8 // update the netgame description
#define COUNTDOWN 0xE9 // countdown timer for starting a game (pretty benign)
#define DEBRIEF_INFO 0xEA // end of mission debriefing information
#define EMP_EFFECT 0xEB // EMP effect (mission disk only)
#define CARGO_HIDDEN 0xEC // cargo is hidden
#define SUBSYS_CARGO_HIDDEN 0xED // Capital ship cargo subsystem is hidden for both ships and subsystems
#define VARIABLE_UPDATE 0xF0 // Karajorma - a variable update packet from server to all clients
#define SEXP 0xF1 // Karajorma - a general packet which can be used to update clients with changes caused by SEXPs
#define LUA_DATA_PACKET 0xF2 // Lafiel - any generic data sent by lua
#define MAX_TYPE_ID 0xFF // better not try to send > 255 in a single byte buddy
// ingame ack data codes
#define ACK_RESPAWN_POINTS 0x1 // from ingame joiner to server, indicating he got the respawn points packet
#define ACK_FILE_ACCEPTED 0x2 // server to client saying their file is valid
#define ACK_FILE_REJECTED 0x3 // server to client saying their file is not valid
// join request denial codes
#define JOIN_DENY_JR_STATE 0 // join request is rejected because the game is not in the proper state
#define JOIN_DENY_JR_TRACKER_INVAL 1 // join request is rejected because the game is an MT game and the passed player info is invalid
#define JOIN_DENY_JR_PASSWD 2 // join request is rejected because the game is password protected and the password sent is incorrect
#define JOIN_DENY_JR_CLOSED 3 // join request is rejected because the game is closed and is currently ingame
#define JOIN_DENY_JR_RANK_HIGH 4 // join request is rejected because the game is rank based and the passed rank is too high
#define JOIN_DENY_JR_RANK_LOW 5 // join request is rejected because the game is rank based and the passed rank is too low
#define JOIN_DENY_JR_DUP 6 // join request is denied because there is an exiting netplayer with matching characteristics
#define JOIN_DENY_JR_FULL 7 // join request is denied because the game is full
#define JOIN_DENY_JR_TEMP_CLOSED 8 // join request is denied because the _forming_ netgame has been toggled closed
#define JOIN_DENY_JR_BANNED 9 // join request is denied because the player has been banned for the duration of the game
#define JOIN_DENY_JR_NOOBS 10 // join request is denied because observers are not allowed
#define JOIN_DENY_JR_INGAME_JOIN 11 // join request is denied because someone else is already ingame joining
#define JOIN_DENY_JR_BAD_VERSION 12 // incompatible version types
#define JOIN_QUERY_RESTRICTED 13 // poll the host of the game to see if he accepts this player
#define JOIN_DENY_JR_TYPE 14 // cannot ingame join Squadwar games
// repair info codes
#define REPAIR_INFO_BEGIN 0x1 // server to client - set your REPAIRING flags
#define REPAIR_INFO_END 0x2 // server to client - unset your REPAIRING flags
#define REPAIR_INFO_UPDATE 0x3 // server to client - here's some repair update info (not currently used)
#define REPAIR_INFO_QUEUE 0x4 // server to client - client is queued for rearming.
#define REPAIR_INFO_ABORT 0x5 // server to client - client has aborted a rearm/repair
#define REPAIR_INFO_BROKEN 0x6 // server to client - client is breaking repair -- might be reestablished
#define REPAIR_INFO_WARP_ADD 0x7 // server to client - add client onto list of people for arriving support ship
#define REPAIR_INFO_WARP_REMOVE 0x8 // server to client - remove client from list of people for arriving support ship
#define REPAIR_INFO_ONWAY 0x9 // server to client - repair ship on way
#define REPAIR_INFO_KILLED 0xa // server to client - repair ship was killed on way to rearm player
#define REPAIR_INFO_COMPLETE 0xb // server to client - repair of your ship is complete
// debris update codes
#define DEBRIS_UPDATE_UPDATE 0x1 // update a piece
#define DEBRIS_UPDATE_REMOVE 0x2 // remove a piece of debris
#define DEBRIS_UPDATE_NUKE 0x3 // blow up a piece of debris
#define DEBRIS_UPDATE_CREATE_HULL 0x4 // create a piece of debris
// weapon select/ship select update packets
#define WSS_WEAPON_SELECT 0x1 // ship select stuff
#define WSS_SHIP_SELECT 0x2 // weapon select stuff
// accept packet codes
#define ACCEPT_INGAME (1<<0) // accept the player as an ingame joiner
#define ACCEPT_HOST (1<<1) // accept the player as the host of the game
#define ACCEPT_OBSERVER (1<<2) // accept the player as an observer
#define ACCEPT_CLIENT (1<<3) // accept the player as a normal, non ingame join, non host player
// accept player data codes
#define APD_NEXT 0 // there is still more player data
#define APD_END_PACKET 1 // end of this packet
#define APD_END_DATA 2 // end of the data
// ingame ship request codes
#define INGAME_SR_REQUEST 0x1 // request for the ship with the given net signature
#define INGAME_SR_CONFIRM 0x2 // confirmation to the client that he can use the requested ship
#define INGAME_SR_DENY 0x3 // deny the request the ingame joiner made for the ship
#define INGAME_PLAYER_CHOICE 0x4 // sent to other players informing them of ingame joiners choice
// ai info update codes
#define AI_UPDATE_DOCK 0x1 // server tells clients which ships are now docked
#define AI_UPDATE_UNDOCK 0x2 // server tells clients which ships have undocked
#define AI_UPDATE_ORDERS 0x3 // server tells clients about new AI order for the ship
// requests to the standalone
#define MISSION_LIST_REQUEST 0x1 // ask for list of missions
#define CAMPAIGN_LIST_REQUEST 0x2 // ask for list of campaigns
// asteroid stuff
#define ASTEROID_CREATE 0x1 // create an asteroid
#define ASTEROID_THROW 0x2 // throw an asteroid
#define ASTEROID_HIT 0x3 // asteroid hit occured
// commands for squadmate messages
#define SQUAD_MSG_SHIP 0x1
#define SQUAD_MSG_WING 0x2
#define SQUAD_MSG_ALL 0x3
#define SQUAD_MSG_REINFORCEMENT 0x4
// SW_STD_QUERY codes
#define SW_STD_START 0x1 // from host to standalone saying "query the tracker"
#define SW_STD_OK 0x2 // from standalone to host - "everything is cool"
#define SW_STD_BAD 0x3 // from standalone to host - "everything is bad"
// stats block packet
#define STATS_MISSION 0 // all stats for the mission (except kills), for one player
#define STATS_ALLTIME 1 // alltime stats, for one player
#define STATS_MISSION_KILLS 2 // mission kills and assists
#define STATS_DOGFIGHT_KILLS 3 // same as mission kills, but also sends per-player kills
#define STATS_MISSION_CLASS_KILLS 4 // kills for the mission, for one player
#define STATS_ALLTIME_KILLS 5 // alltime kills, for one player
// minor hack
constexpr int PLAYER_COLLISION_TIMESTAMP = 200; // how often the server should allow a client to go through ship-ship collisions
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// Multiplayer structure definitions
//
//
// definition of header packet used in any protocol
typedef struct header {
int bytes_processed; // used to determine how many bytes this packet was
ubyte addr[sizeof(in6_addr)]; // obtained from network-layer header
uint16_t port; // obtained from network-layer header
short id; // will be stuffed with player_id (short)
} header;
// NETPLAYER INFORMATION THE SERVER AND THE INDIVIDUAL CLIENT MUST HAVE
typedef struct net_player_server_info {
ping_struct ping; // evaluated by the ping module
int wing_index_backup; // in case of fail on the last packet
int wing_index; // index of the next wing data item to be sent
int ingame_join_flags; // status flags for an ingame joiner
int invul_timestamp; // invulnerability flag timestamp (for respawning after dying)
button_info last_buttons[BUTTON_INFO_SAVE_COUNT]; // button info for sending critical control packets to the server
int last_buttons_id[BUTTON_INFO_SAVE_COUNT]; //
fix last_buttons_time[BUTTON_INFO_SAVE_COUNT];//
int num_last_buttons; //
UI_TIMESTAMP last_full_update_time; // time when server last updated this player position/orientation
int xfer_handle; // handle to the file xfer handle (-1 if no file xfer is taking place)
UI_TIMESTAMP kick_timestamp; // timestamp with which we'll disconnect a player if he hasn't reponded to a kick packet
int kick_reason; // reason he was kicked
UI_TIMESTAMP voice_token_timestamp; // timestamp set when a player loses a token (so we can prevent him from getting it again too quickly)
time_t reliable_connect_time; // after sending an accept packet, wait for this long for the guy to connect on the reliable socket
// weapon select/linking information (maintained on the server and passed on respawn to all clients)
char cur_primary_bank; // currently selected primary bank
char cur_secondary_bank; // currently selected secondary bank
ubyte cur_link_status; // if (1<<0) - primaries linked. if (1<<1) - secondaries are linked
// information regarding the current view position of this player.
vec3d eye_pos; // eye position and orientation
matrix eye_orient;
// ets information
ushort ship_ets; // ets settings (sigh......)
// tracker information
int tracker_security_last; // this is the value returned when getting tracker data. it must be used when "sending" tracker data
unsigned int tracker_checksum; // tracker checksum
// common targeting information
int target_objnum;
// for collision hack -- to fix, enough bandwidth would be needed for full physics info to be transmitted uncompressed
TIMESTAMP player_collision_timestamp; // gets around limitations on oo update packets by having collisions only occur so often
// rate limiting information
int rate_stamp; // rate limiting timestamp
int rate_bytes; // bytes sent this "second"
// firing info (1<<0) for primary fire, (1<<1) for secondary fired, (1<<2) for countermeasure fired, (1<<3) for afterburner on
// basically, we set these bits if necessary between control info sends from the client. once sent, these values are
// cleared until the next send time
ubyte accum_buttons;
// buffered packet info
ubyte unreliable_buffer[MAX_PACKET_SIZE]; // buffer used to buffer unreliable packets before sending as a single UDP packet
int unreliable_buffer_size; // length (in bytes) of data in unreliable send_buffer
ubyte reliable_buffer[MAX_PACKET_SIZE]; // buffer used to buffer reliable packets before sending as a single UDP packet
int reliable_buffer_size; // length (in bytes) of data in reliable send_buffer
void init() {
memset(&ping, 0, sizeof(ping_struct));
wing_index_backup = -1;
wing_index = -1;
ingame_join_flags = 0;
invul_timestamp = 0;
memset(&last_buttons, 0, sizeof(last_buttons));
memset(&last_buttons_id, 0, sizeof(last_buttons_id));
memset(&last_buttons_time, 0, sizeof(last_buttons_time));
num_last_buttons = 0;
xfer_handle = -1;
kick_reason = 0;
reliable_connect_time = -1;
cur_primary_bank = 0;
cur_secondary_bank = 0;
cur_link_status = 0;
ship_ets = 0;
tracker_security_last = 0;
tracker_checksum = 0;
target_objnum = -1;
rate_stamp = 0;
rate_bytes = 0;
accum_buttons = 0;
memset(&unreliable_buffer, 0, sizeof(unreliable_buffer));
unreliable_buffer_size = 0;
memset(&reliable_buffer, 0, sizeof(reliable_buffer));
reliable_buffer_size = 0;
}
net_player_server_info() { init(); }
} net_player_server_info;
// NETPLAYER INFORMATION ALL COMPUTERS IN THE GAME MUST HAVE
typedef struct net_player_info {
p_object *p_objp; // pointer to parse object for my ship -- used with respawns
int team; // valid for team v. team games -- which team is this guy on
int ship_index; // index into the ship choices in team select/ship select (out of 12 choices)
int ship_class; // the ship class of the players ship
multi_local_options options; // players options settings
net_addr addr;
char pxo_squad_name[LOGIN_LEN]; // PXO squadron name
} net_player_info;
// NETPLAYER COMMON INFORMATION
typedef struct net_player {
player *m_player; // stuff pertaining directly to the player (callsign, etc).
short player_id; // player id (always use this instead of ip address for identification purposes)
int tracker_player_id; // the tracker id for this player, only matters in
// tracker games.
int flags; // tells us interesting information about this player
int state; // one of the NETGAME_STATE_* flags below -- used for sequencing
PSNET_SOCKET_RELIABLE reliable_socket; // reliable socket to server
ushort client_cinfo_seq; // sequence # for client control info packets
ushort client_server_seq; // sequence # for incoming object update packets
fix last_heard_time; // time when last heard from this player
net_player_server_info s_info; // server critical info
net_player_info p_info; // player critical info
// bytes sent and received
// SERVER-side
int sv_bytes_sent; // bytes we've sent to this guy (on the server)
int sv_last_pl; // packet loss
// CLIENT-side
int cl_bytes_recvd; // bytes we've received (as a client)
int cl_last_pl; // packet loss
void init() {
m_player = nullptr;
player_id = -1;
tracker_player_id = -1;
flags = 0;
state = 0;
reliable_socket = PSNET_INVALID_SOCKET;
client_cinfo_seq = 0;
client_server_seq = 0;
last_heard_time = 0;
memset(&p_info, 0, sizeof(net_player_info));
sv_bytes_sent = 0;
sv_last_pl = 0;
}
net_player() { init(); }
} net_player;
// structure which describes the state of the multiplayer game currently being played
typedef struct netgame_info {
char name[MAX_GAMENAME_LEN+1]; // name of the netgame (host can set this!)
char mission_name[NAME_LENGTH+1]; // current mission name (filename)
char title[NAME_LENGTH+1]; // title of the mission (as appears in the mission file)
char campaign_name[NAME_LENGTH+1]; // current campaign name
char passwd[MAX_PASSWD_LEN+1]; // password for the game
int version_info; // version info for this game.
int type_flags; // see NG_TYPE_* defines
int mode; // see NG_MODE_* defines
int flags; // see NG_FLAG_* defines
int rank_base; // used to compare against connecting players (rank above/rank below)
int max_players;
int game_state; // state (briefing, in mission, etc) this game is in
int security; // some random number that should hopefully be unique for each game started
// I'm also using this value to use as a starting base for the net_signature
// for object synchronization.
float ping_time; // ping time to this server
net_addr server_addr; // address of the server
net_player *host;
net_player *server; // pointer to the server
uint respawn;
int campaign_mode; // 0 == single mission mode, 1 == starting campaign
ushort server_update_seq; // the current object update reference count (server-side only)
int server_update_frame_ref; // used to determine when we should increment the server_update_seq value
multi_server_options options; // server options settings
ubyte debug_flags; // special debug flags (see NETD_FLAG_* defines)
void init() {
name[0] = '\0';
mission_name[0] = '\0';
title[0] = '\0';
campaign_name[0] = '\0';
passwd[0] = '\0';
version_info = 0;
type_flags = 0;
mode = 0;
flags = 0;
rank_base = 0;
max_players = 0;
game_state = 0;
security = 0;
ping_time = 0.0f;
host = nullptr;
server = nullptr;
respawn = 0;
campaign_mode = 0;
server_update_seq = 0;
server_update_frame_ref = 0;
debug_flags = 0;
memset(&server_addr, 0, sizeof(net_addr));
memset(&options, 0, sizeof(multi_server_options));
}
netgame_info() { init(); }
} netgame_info;
// structure for active games -- kind of like Descent, but using the linked list thing, we will
// be able to support many more games in the list.
#define AG_FLAG_COOP (1<<0) // is a coop game
#define AG_FLAG_TEAMS (1<<1) // is a team vs. team game
#define AG_FLAG_DOGFIGHT (1<<2) // is a dogfight game
#define AG_FLAG_FORMING (1<<3) // game is currently forming
#define AG_FLAG_BRIEFING (1<<4) // game is in the briefing state
#define AG_FLAG_DEBRIEF (1<<5) // game is in the debriefing state
#define AG_FLAG_PAUSE (1<<6) // game is paused
#define AG_FLAG_IN_MISSION (1<<7) // game is in mission
#define AG_FLAG_PASSWD (1<<8) // is a password protected game
#define AG_FLAG_STANDALONE (1<<9) // this is a standalone server
#define AG_FLAG_CAMPAIGN (1<<10) // the server is playing in campaign mode
#define AG_FLAG_TRACKER (1<<11)
// flags for defining the connection speed
#define AG_FLAG_CONNECTION_SPEED_MASK ((1<<12)|(1<<13)|(1<<14)) // mask for the connection speed
#define AG_FLAG_VALID_MISSION (1<<15) // the mission is a "valid" tracker mission
#define AG_FLAG_CONNECTION_BIT 12 // number of bits to shift right or left to get speed
#define AG_FLAG_TYPE_MASK (AG_FLAG_COOP|AG_FLAG_TEAMS|AG_FLAG_DOGFIGHT)
#define AG_FLAG_STATE_MASK (AG_FLAG_FORMING|AG_FLAG_BRIEFING|AG_FLAG_DEBRIEF|AG_FLAG_PAUSE|AG_FLAG_IN_MISSION)
typedef struct active_game {
UI_TIMESTAMP heard_from_timer; // when we last heard from the game
char name[MAX_GAMENAME_LEN+1];
char mission_name[NAME_LENGTH+1];
char title[NAME_LENGTH+1];
ubyte num_players;
net_addr server_addr;
ushort flags; // see above AG_FLAG_* defines
ubyte version,comp_version; // version and compatible version
ping_struct ping; // ping time to the server
void init() {
num_players = 0;
flags = 0;
version = 0;
comp_version = 0;
name[0] = '\0';
mission_name[0] = '\0';
title[0] = '\0';
memset(&server_addr, 0, sizeof(net_addr));
memset(&ping, 0, sizeof(ping_struct));
}
active_game() { init(); }
} active_game;
// permanent server list (read from tcp.cfg)
typedef struct server_item {
server_item *next, *prev;
net_addr server_addr;
} server_item;
// sent to the server on a join request with various data
#define JOIN_FLAG_AS_OBSERVER (1<<0) // wants to join as an aboserver
#define JOIN_FLAG_HAXOR (1<<2) // if the player has hacked data
typedef struct join_request {
char passwd[MAX_PASSWD_LEN+1]; // password for a password protected game
char callsign[CALLSIGN_LEN+1]; // player's callsign
char image_filename[MAX_FILENAME_LEN+1]; // player's image filename
char squad_filename[MAX_FILENAME_LEN+1]; // player's squad filename
ubyte player_rank; // the rank of the requesting player
ubyte flags; // misc flags associated with this guy
int tracker_id; // player's tracker ID #
multi_local_options player_options; // player's options
ubyte version, comp_version; // local version and comp_version
// multiplayer squad war info
char pxo_squad_name[LOGIN_LEN]; // squad name
} join_request;
// network buffer for sending and receiving packets
typedef struct network_buffer {
int size; // size of the buffer
ubyte data[MAX_PACKET_SIZE]; // MAX_PACKET_SIZE from psnet2.h
} network_buffer;
// -------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// Multiplayer structure flags/settings
//
//
// flags used for the net_player structure
#define NETINFO_FLAG_CONNECTED (1<<0) // if this player connected
#define NETINFO_FLAG_AM_MASTER (1<<1) // is this player the master
#define NETINFO_FLAG_MT_CONNECTED (1<<2) // if everything is hunky dory with the tracker connection
#define NETINFO_FLAG_MT_FAILED (1<<3) // all attempts to connect have failed
#define NETINFO_FLAG_MT_STARTUP (1<<4) // the initial state (ie, we haven't tried anything yet)
#define NETINFO_FLAG_GAME_HOST (1<<5) // I'm the host
#define NETINFO_FLAG_INGAME_JOIN (1<<6) // means he is still in the process of joining ingame
#define NETINFO_FLAG_OBSERVER (1<<7) // means he's an observer
#define NETINFO_FLAG_OBS_PLAYER (1<<8) // means he's an observer, but he was formerly a player (should show his stats)
#define NETINFO_FLAG_LIMBO (1<<9) // (client side) means he has to choose whether to be an observer or quit (no more respawns)
#define NETINFO_FLAG_MISSION_OK (1<<10) // this client's mission has been verified
#define NETINFO_FLAG_RESPAWNING (1<<11) // so that we wait on a keypress, or other user input before respawning
#define NETINFO_FLAG_DO_NETWORKING (1<<12) // set when we can send/receive data
#define NETINFO_FLAG_TEAM_LOCKED (1<<13) // if this is set, only the host can modify the team settings for this player
#define NETINFO_FLAG_TEAM_CAPTAIN (1<<14) // this player is the captain of his team
#define NETINFO_FLAG_KICKED (1<<15) // this player was kicked
#define NETINFO_FLAG_ACCEPT_INGAME (1<<16) // accepted ingame
#define NETINFO_FLAG_ACCEPT_HOST (1<<17) // accetped as host
#define NETINFO_FLAG_ACCEPT_OBSERVER (1<<18) // accepted as observer
#define NETINFO_FLAG_ACCEPT_CLIENT (1<<19) // accepted as client
#define NETINFO_FLAG_WARPING_OUT (1<<20) // clients keep track of this for themselves to know if they should be leaving
#define NETINFO_FLAG_UNUSED (1<<21) // Used to be a flag for if the player had a CD in the drive
#define NETINFO_FLAG_RELIABLE_CONNECTED (1<<22) // reliable socket is now active
#define NETINFO_FLAG_MT_GET_FAILED (1<<23) // set during MT stats update process indicating we didn't properly get his stats
#define NETINFO_FLAG_MT_SEND_FAILED (1<<24) // set during MT stats update process indicating we didn't properly send his stats
#define NETINFO_FLAG_MT_DONE (1<<25) // set when a player has been processed for stats (fail, succeed, or otherwise)
#define NETINFO_FLAG_HAXOR (1<<26) // the player has some form of hacked client data
#define NETPLAYER_IS_OBSERVER(player) (player->flags & (NETINFO_FLAG_OBSERVER|NETINFO_FLAG_OBS_PLAYER))
#define NETPLAYER_IS_DEAD(player) (player->flags & (NETINFO_FLAG_LIMBO|NETINFO_FLAG_RESPAWNING))
// netgame modes
#define NG_MODE_OPEN 1 // an open game
#define NG_MODE_CLOSED 2 // a closed game
#define NG_MODE_PASSWORD 3 // a password protected game
#define NG_MODE_RESTRICTED 4 // a restricted game
#define NG_MODE_RANK_ABOVE 5 // ranks above a certain rank are allowed
#define NG_MODE_RANK_BELOW 6 // ranks below a certain rank are allowed
// netgame option flags
#define NG_FLAG_TEMP_CLOSED (1<<0) // a forming netgame is temporarily closed (should not be checked otherwise)
#define NG_FLAG_SERVER_LOST (1<<1) // client has temporarily lost contact with the server
#define NG_FLAG_INGAME_JOINING (1<<2) // someone is ingame joining.
#define NG_FLAG_INGAME_JOINING_CRITICAL (1<<3) // someone is ingame joining and at the critical point where we cannot do certain things.
#define NG_FLAG_STORED_MT_STATS (1<<4) // stored tracker stats in the debriefing already
#define NG_FLAG_HACKED_SHIPS_TBL (1<<5) // set when the server is playing with a hacked ships.tbl (only needed to notify hosts playing on a standalone)
#define NG_FLAG_HACKED_WEAPONS_TBL (1<<6) // set when the server is playing with a hacked weapons.tbl (only needed to notify hosts playing on a standalone)
// netgame type flags
#define NG_TYPE_COOP (1<<0) // cooperative mode
#define NG_TYPE_TVT (1<<1) // team vs. team mode
#define NG_TYPE_SW (1<<2) // squad war
#define NG_TYPE_TEAM ( NG_TYPE_TVT | NG_TYPE_SW )
#define NG_TYPE_DOGFIGHT (1<<3) // plain old dogfight mode
// some quick macros for the above
#define MULTI_COOP ((Game_mode & GM_MULTIPLAYER) && (Netgame.type_flags & NG_TYPE_COOP))
#define MULTI_TEAM ((Game_mode & GM_MULTIPLAYER) && (Netgame.type_flags & NG_TYPE_TEAM))
#define MULTI_DOGFIGHT ((Game_mode & GM_MULTIPLAYER) && (Netgame.type_flags & NG_TYPE_DOGFIGHT))
// and some to handle everything but
#define MULTI_NOT_COOP ((Game_mode & GM_MULTIPLAYER) && !(Netgame.type_flags & NG_TYPE_COOP))
#define MULTI_NOT_TEAM ((Game_mode & GM_MULTIPLAYER) && !(Netgame.type_flags & NG_TYPE_TEAM))
#define MULTI_NOT_DOGFIGHT ((Game_mode & GM_MULTIPLAYER) && !(Netgame.type_flags & NG_TYPE_DOGFIGHT))
// state defines for netgame states
#define NETGAME_STATE_FORMING 1 // players are joining, host is selecting missions, etc
#define NETGAME_STATE_BRIEFING 2 // players are reading the mission briefing
#define NETGAME_STATE_IN_MISSION 3 // the mission itself is being played
#define NETGAME_STATE_SERVER_TRANSFER 4 // server status is being transferred from one computer to another
#define NETGAME_STATE_PAUSED 5 // the netgame is paused
#define NETGAME_STATE_DEBRIEF 6 // the debriefing screen
#define NETGAME_STATE_MISSION_SYNC 7 // client/server data sync screens before and after the briefing stage
#define NETGAME_STATE_ENDGAME 8 // game is moving from gameplay to the debriefing state
#define NETGAME_STATE_STD_HOST_SETUP 9 // the host is on the setup netgame screen for the standalone server
#define NETGAME_STATE_HOST_SETUP 10 // the host is on the setup netgame screen _non_ standalone
// state defines for netplayer states
#define NETPLAYER_STATE_JOINING 0 // joining the netgame
#define NETPLAYER_STATE_JOINED 1 // has joined and opened a reliable socket connection
#define NETPLAYER_STATE_MISSION_LOADING 2 // in the process of loading the mission
#define NETPLAYER_STATE_MISSION_LOADED 3 // mission loaded
#define NETPLAYER_STATE_BRIEFING 4 // in the briefing
#define NETPLAYER_STATE_SHIP_SELECT 5 // in the ship selection screen
#define NETPLAYER_STATE_WEAPON_SELECT 6 // in the weapon selection screen
#define NETPLAYER_STATE_DATA_LOAD 7 // loading specific data (textures, etc)
#define NETPLAYER_STATE_WAITING 8 // waiting to do something (like enter the mission)
#define NETPLAYER_STATE_SLOT_ACK 9 // got player ship slot packets
#define NETPLAYER_STATE_IN_MISSION 10 // in the mission itself
#define NETPLAYER_STATE_INGAME_SHIPS 11 // player is receiving ingame join ship data
#define NETPLAYER_STATE_INGAME_WINGS 12 // player is receiving ingame join wing data
#define NETPLAYER_STATE_INGAME_RPTS 13 // player is receiving ingame join respawn data
#define NETPLAYER_STATE_INGAME_SHIP_SELECT 14 // player is in the ship select screen for ingame join
#define NETPLAYER_STATE_DEBRIEF 15 // player is in the debrief state (screen)
#define NETPLAYER_STATE_MISSION_SYNC 16 // player is in the mission sync screen
#define NETPLAYER_STATE_STD_HOST_SETUP 17 // the host is on the setup netgame screen for the standalone server
#define NETPLAYER_STATE_HOST_SETUP 18 // the host is on the setup netgame screen _non_ standalone
#define NETPLAYER_STATE_SETTINGS_ACK 19 // the player has received the player settings data for all players
#define NETPLAYER_STATE_SLOTS_ACK 20 // the player has received wss slots data (ingame join only)
#define NETPLAYER_STATE_POST_DATA_ACK 21 // the player has received the post briefing data block
#define NETPLAYER_STATE_WSS_ACK 22 // have received weapon slot information
#define NETPLAYER_STATE_FLAG_ACK 23 // the player has received his flag change information
#define NETPLAYER_STATE_MT_STATS 24 // the server is in the process of requesting or updating stats from the MT
#define NETPLAYER_STATE_MISSION_XFER 25 // the player is in the process of receiving a mission file
#define NETPLAYER_STATE_INGAME_STUFF 26 // received ingame "stuff" happens just before ship selection
#define NETPLAYER_STATE_DEBRIEF_ACCEPT 27 // the player has hit the accept button in the debrief and is good to go
#define NETPLAYER_STATE_DEBRIEF_REPLAY 28 // set on the host instead of NETPLAYER_STATE_DEBRIEF_ACCEPT to indicate he wants to replay the mission
#define NETPLAYER_STATE_CPOOL_ACK 29 // player has acked all campaign pool status data
#define NETPLAYER_STATE_INGAME_CINFO 30 // player has received campaign information (ingame join only)
#define NETPLAYER_STATE_CUTSCENE 31 // watching a custscene
#define NETPLAYER_STATE_FICTION_VIEWER 32 // in the fiction viewer screen
#define NETPLAYER_STATE_CMD_BRIEFING 33 // in the command briefing
#define NETPLAYER_STATE_RED_ALERT 34 // in the red alert screen
// defines for connection speed
#define CONNECTION_SPEED_NONE -1 // not really used except for error checking
#define CONNECTION_SPEED_288 0
#define CONNECTION_SPEED_56K 1
#define CONNECTION_SPEED_SISDN 2
#define CONNECTION_SPEED_CABLE 3
#define CONNECTION_SPEED_T1 4
// use this to check and see whether a netgame is anywhere in mission (paused, etc, etc)
#define MULTI_IN_MISSION ( (Netgame.game_state == NETGAME_STATE_IN_MISSION) || (Netgame.game_state == NETGAME_STATE_PAUSED) )
extern int Multi_connection_speed;
// -------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// Multiplayer global vars
//
//
// netplayer vars
extern net_player Net_players[MAX_PLAYERS]; // array of all netplayers in the game
extern net_player *Net_player; // pointer to console's net_player entry
// network object management
#define SHIP_SIG_MIN 1
#define SHIP_SIG_MAX (0x1fef) // Cyborg17 - 8000 ships ought to be enough.
#define STANDALONE_SHIP_SIG (SHIP_SIG_MAX+1)
#define REAL_SHIP_SIG_MAX (0x1fff)
#define DEBRIS_SIG_MIN (REAL_SHIP_SIG_MAX+1)
#define DEBRIS_SIG_MAX (0x3fff) // allows for 1000 ships to be destroyed and for ~8 debris chunks to be generated for each.
#define ASTEROID_SIG_MIN (DEBRIS_SIG_MAX+1)
#define ASTEROID_SIG_MAX (0x6fff)
#define WAYPOINT_SIG_MIN (ASTEROID_SIG_MAX+1)
#define WAYPOINT_SIG_MAX (0x7fff) // required for dynamic waypoints.
#define NPERM_SIG_MIN (WAYPOINT_SIG_MAX+1)
#define NPERM_SIG_MAX (0xffff) // Allows us to have ~ 30K weapons simultaneously in a mission.
extern ushort Next_ship_signature; // next network signature to assign to an object
extern ushort Next_asteroid_signature; // next asteroid signature
extern ushort Next_non_perm_signature; // next non-permanent signature
extern ushort Next_debris_signature; // next debris signature
extern ushort Next_waypoint_signature; // next waypoint signature for dynamic waypoints in multi missions
// netgame vars
extern netgame_info Netgame; // netgame information
extern int Multi_mission_loaded; // flag, so that we don't load the mission more than once client side
extern ushort Multi_ingame_join_sig; // signature for the player obj for use when joining ingame
extern int Multi_button_info_ok; // flag saying it is ok to apply critical button info on a client machine
extern int Multi_button_info_id; // identifier of the stored button info to be applying
// low level networking vars
#define HEADER_LENGTH 1 // 1 byte (packet type)
// misc data
extern SCP_list<active_game> Active_games; // list of active games displayed on the Join screen
extern CFILE* Multi_chat_stream; // for streaming multiplayer chat strings to a file
extern int Multi_num_players_at_start; // the # of players present (kept track of only on the server) at the very start of the mission
extern short Multi_id_num; // for assigning player id #'s
// permanent server list
extern server_item* Game_server_head; // list of permanent game servers to be querying
// restricted game vars
#define MULTI_QUERY_RESTR_STAMP 5000 // 5 seconds to reply
#define MULTI_JOIN_RESTR_MODE_1 0 // mode 1 - normal restricted join
#define MULTI_JOIN_RESTR_MODE_2 1 // mode 2 - team vs. team, only team 0 has ships
#define MULTI_JOIN_RESTR_MODE_3 2 // mode 3 - team vs. team, only team 1 has ships
#define MULTI_JOIN_RESTR_MODE_4 3 // mode 4 - team vs. team, both teams have ships
extern UI_TIMESTAMP Multi_restr_query_timestamp; // timestamp for querying the host to see if he will allow a new player to join ingame
extern join_request Multi_restr_join_request; // join request for the query
extern net_addr Multi_restr_addr; // net address of the join request
extern int Multi_join_restr_mode; // what mode we're in
// non API master tracker vars
#define MULTI_TRACKER_STRING_LEN 100
extern char Multi_tracker_login[MULTI_TRACKER_STRING_LEN+1];
extern char Multi_tracker_passwd[MULTI_TRACKER_STRING_LEN+1];
extern char Multi_tracker_squad_name[MULTI_TRACKER_STRING_LEN+1];
extern int Multi_tracker_id;
extern char Multi_tracker_id_string[255];
// current file checksum
extern ushort Multi_current_file_checksum;
extern int Multi_current_file_length;
// ip address list vars
#define IP_STRING_LEN 60
#define MAX_IP_ADDRS 100
// ----------------------------------------------------------------------------------------
// Multiplayer main functions
//
//
// module handling functions -------------------
// called at game startup
void multi_init();
// called whenever a netgame is started
void multi_level_init();
// reset all relevant main networking loop timestamps
void multi_reset_timestamps();
// returns true is server hasn't been heard from in N seconds. false otherwise
int multi_client_server_dead();
// netgame data processing functions -----------
// do all network processing for this game frame
void multi_do_frame();
// analog of multi_do_frame() called when netgame is in the pause state
void multi_pause_do_frame();
// process all incoming packets
// void multi_process_bigdata(ubyte* data, int size, net_addr* from_addr);
// process all reliable socket details
void multi_process_reliable_details();
// standalone handling functions ---------------
// initialize the standalone
void standalone_main_init();
// do frame for the main standalone state
void standalone_main_do();
// close for the main standalone state
void standalone_main_close();
// reset all standalone stuff, including gui, networking, netgame, etc, and go into the main state
void multi_standalone_reset_all();
// init for the wait mode of the standalone (when waiting for players to finish the briefing)
void multi_standalone_wait_init();
// do frame for the standalone wait state (when waiting for players to finish the briefing)
void multi_standalone_wait_do();
// close for the standalone wait state (when waiting for players to finish the briefing)
void multi_standalone_wait_close();
// init for the standalone postgame state (when players are in the debriefing)
void multi_standalone_postgame_init();
// do frame for the standalone postgame state (when players are in the debriefing)
void multi_standalone_postgame_do();
// close for the standalone postgame state (when players are in the debriefing_
void multi_standalone_postgame_close();
#endif
|