Descent3/netcon/mtclient/mtpilottrack.h
Azamat H. Hackimov 6057694b56 Replace non-functional PXO server with new one
Replacing ut.parallaxonline.com with tracker.pxo.nottheeye.com.
2024-06-03 22:45:51 +03:00

328 lines
11 KiB
C

/*
* Descent 3
* Copyright (C) 2024 Parallax Software
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* $Logfile: /DescentIII/Main/mtclient/mtpilottrack.h $
* $Revision: 1.1.1.1 $
* $Date: 2003-08-26 03:58:40 $
* $Author: kevinb $
*
* Pilot tracker client header
*
* $Log: not supported by cvs2svn $
*
* 13 4/20/99 8:57p Jeff
* compile for Linux
*
* 12 4/17/99 3:44p Kevin
* Demo2 changes & fixes
*
* 11 4/07/99 9:15a Kevin
* Changed PXO server addresses for release builds
*
* 10 3/02/99 5:50p Kevin
* Ouch. Duplicate structures existed and were conflicting.
*
* 9 2/16/99 12:36a Kevin
* Fixes for release builds of OEM V3 and KAtmai
*
* 8 2/03/99 6:14p Kevin
* OEM changes
*
* 7 12/23/98 6:38p Kevin
* All UDP data (except gamespy) now uses one (registered) port number
*
* 6 10/30/98 11:25a Kevin
* Message of the day for PXO
*
* 5 10/09/98 2:56p Kevin
* Changed IP addresses for PXO demo
*
* 4 10/01/98 11:37a Kevin
* UI fixes and stuff
*
* 3 9/03/98 11:12a Kevin
* Fixed bug in #define
*
* 2 6/01/98 10:10a Kevin
* Added DLL connection interface and auto update DLL
*
* 1 5/25/98 4:12p Kevin
*
* 11 5/14/98 6:08p Kevin
* fixed encryption bug
*
* 10 5/14/98 5:19p Kevin
* Encrypted pilot data
*
* 9 5/13/98 4:06p Kevin
* Added more mastertracker info
*
* 8 5/12/98 5:12p Kevin
* added virgin_pilot field
*
* 7 5/12/98 5:10p Kevin
* added lateral and rotational thrust
*
* 6 5/07/98 9:47a Kevin
* Made pilot reading more robust
*
* 5 5/04/98 12:53p Kevin
* Fixed mastertracker resend stuff
*
* 4 5/04/98 10:56a Kevin
* Mastertracker fixes/enhancements
*
* 3 4/30/98 3:50p Kevin
* Mastertracker pilot stats
*
* 2 4/27/98 7:12p Kevin
* Mastertracker pilot tracker
*
* 1 4/27/98 5:27p Kevin
* Initial version
*
* $NoKeywords: $
*/
#ifndef _PILOT_TRACKER_HEADER
#define _PILOT_TRACKER_HEADER
// Pilot tracker client header
#ifdef WIN32
#pragma pack(push, r_udp)
#endif
#pragma pack(1)
// Definitions
#define STATE_IDLE 0
#define STATE_SENDING_PILOT 1
#define STATE_READING_PILOT 2
#define STATE_RECEIVED_PILOT 3
#define STATE_WROTE_PILOT 4
#define STATE_TIMED_OUT 5
#define STATE_PILOT_NOT_FOUND 6
#define STATE_WRITE_PILOT_FAILED 7
#define REGPORT 2092 // The UDP port
#define PILOTTRACKERNAME "tracker.pxo.nottheeye.com"
#define PILOT_REQ_TIMEOUT 30.000
#define PILOT_REQ_RESEND_TIME 2.0
#define MAX_NET_RETRIES 30
#define NET_ACK_TIMEOUT 1.5
// This is for type
#define UNT_CONTROL 0
#define UNT_NEW_ID_REQUEST 1
#define UNT_VALIDAT_ID_REQUEST 2
#define UNT_LOOKUP_ID_REQUEST 3
#define UNT_UPDATE_ID_REQUEST 4
#define UNT_MOTD_REQUEST 5
#define UNT_MOTD_RESPONSE 6
#define UNT_PILOT_DATA_READ 7 // Request from the game for pilot info
#define UNT_PILOT_DATA_RESPONSE 8 // Mastertracker's response to a read request (has pilot data in this packet)
#define UNT_PILOT_DATA_WRITE 9 // Request from the server to write a user record
#define UNT_PILOT_WRITE_FAILED 10 // Server didn't update the pilots record for some reason
#define UNT_PILOT_WRITE_SUCCESS 11 // Server updated the pilots record
#define UNT_PILOT_READ_FAILED 12 // Couldn't find the record
#define UNT_LOGIN_AUTH_REQUEST 13 // Request login authentication by login/password only (returns tracker id)
#define UNT_LOGIN_NO_AUTH 14 // Couldn't login this user (code has reason)
#define UNT_LOGIN_AUTHENTICATED 15 // User was authenticated (data has sz string with tracker id)
#define UNT_TRACKER_VERSION_REQ 16 // Request the latest MT version (xcode has game type) code has present version
#define UNT_TRACKER_VERSION_RSP \
17 // Response for the latest MT version (xcode has game type) code has version data has null term string with url for
// dll to download
// This is for code
#define CMD_NEW_USER_ACK 1
#define CMD_NEW_USER_NAK 2
#define CMD_VALIDATED_USER_ACK 3
#define CMD_UPDATED_USER_ACK 4
#define CMD_CLIENT_RECEIVED 5
#define CMD_FIND_USER_NAK 6
#define CMD_FIND_USER_ACK 7
#define CMD_UPDATED_USER_NAK 8
#define CMD_VALIDATED_USER_NAK 9
// Game designators for UNT_PILOT_DATA_REQUEST and UNT_PILOT_DATA_RESPONSE
#define CMD_GAME_FREESPACE 10
#define CMD_GAME_DESCENT3 11
// This is for xcode
#define REG_NAK_EMAIL 0 // failed to register the guy because of an invalid email address
#define REG_NAK_LOGIN 1 // failed to register the guy because an existing login exists
#define REG_NAK_ERROR 2 // failed to register because of an error on the tracker
#define REG_NAK_STRINGS 3 // failed to validate because of invalid password/login match
#define REG_NAK_UNKNOWN 4 // failed to validate because the player is unknown
#define REG_NAK_UPDATE_PL 5 // update info failed because login/passwd were not correct
#define REG_NAK_UPDATE_GEN 6 // update info failed in general (tracker problem)
#define REG_NAK_UPDATE_LOG 7 // update failed because login not found
#define REG_ACK_NEW_ID 8 // New id created, just used for return code, not net packets.
#define MAX_UDP_DATA_LENGH 500
#define PACKED_HEADER_ONLY_SIZE (sizeof(udp_packet_header) - MAX_UDP_DATA_LENGH)
// sizeof(update_id_request) //The largest packet
// data could be one of the following:
// type == UNT_NEW_ID_REQUEST
// Respond with ACK
struct new_id_request {
char first_name[REAL_NAME_LEN]; // Real Name
char last_name[REAL_NAME_LEN]; // Real Name
char login[LOGIN_LEN]; // Login id
char password[PASSWORD_LEN]; // password
char email[EMAIL_LEN]; // Email Address
uint8_t showemail; // 0==don't show 1 == show
uint8_t showname; // 0==don't show 1 == show
};
// type == UNT_VALIDAT_ID_REQUEST or UNT_LOOKUP_ID_REQUEST
struct validate_id_request {
char login[LOGIN_LEN]; // Login id
char password[PASSWORD_LEN]; // password
char tracker_id[TRACKER_ID_LEN]; // Tracker ID
};
// type == UNT_UPDATE_ID_REQUEST
struct update_id_request {
char old_login[LOGIN_LEN]; // Login before it's changed.
char old_password[PASSWORD_LEN]; // Password before it's changed
char tracker_id[TRACKER_ID_LEN]; // Tracker ID (not sure if we need it for updating, but maybe)
char first_name[REAL_NAME_LEN]; // Real Name
char last_name[REAL_NAME_LEN]; // Real Name
char login[LOGIN_LEN]; // Login id (new)
char password[PASSWORD_LEN]; // password (new)
char email[EMAIL_LEN]; // Email Address (new)
uint8_t showemail; // 0==don't show 1 == show
uint8_t showname; // 0==don't show 1 == show
};
struct pilot_request {
char pilot_name[PILOT_NAME_LEN]; // Login id
char tracker_id[TRACKER_ID_LEN]; // Tracker ID
};
struct udp_packet_header {
uint8_t type; // Type of request
uint16_t len; // Length of total packet, including this header
uint32_t code; // For control messages
uint16_t xcode; // For control/NAK messages and for sigs.
uint32_t sig; // To identify unique return ACKs
uint32_t security; // Just a random value, we store the last value used in the user record
// So we don't process the same request twice.
uint8_t data[MAX_UDP_DATA_LENGH];
};
#ifdef WIN32
// Queue -- We need a queue to put responses in, so after a certain amount of time
// If we don't get an ACK back from the client, we resend the packet, until eventually
// We give up.
struct net_reg_queue {
char login[LOGIN_LEN]; // Login id
uint32_t time_last_sent; // Time in milliseconds since we last sent this packet
int retries; // Number of times this has been sent
udp_packet_header packet; // Packet containing the actual data to resend, etc.
struct net_reg_queue *next; // Pointer to next item in the list
SOCKADDR netaddr;
uint32_t sig; // Signature to be used by the client to ACK our response.
};
#endif
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// GAME SPECIFIC structures
/*
#pragma pack(1)
struct vmt_descent3_struct {
char tracker_id[TRACKER_ID_LEN];
char pilot_name[PILOT_NAME_LEN];
int rank;
int kills;
int deaths;
int suicides;
int online_time;
int games_played;
uint32_t security;
uint8_t virgin_pilot; //This pilot was just created if TRUE
uint32_t lateral_thrust;
uint32_t rotational_thrust;
uint32_t sliding_pct; //Percentage of the time you were sliding
uint32_t checksum; //This value needs to be equal to whatever the checksum is once the
packet is decoded uint32_t pad; //just to provide room for out 4 byte encryption boundry only needed on
the client side for now
};
*/
//
// -------------------------------------------------------------------------------------------------------------
/**
* Get MOTD from remote. Call with NULL to poll. Call with valid pointer and maxlen to get the message of the day.
* @param szmotd
* @param maxlen
* @return
* -3 - Error, called with NULL, but no request is waiting;
* -2 - Error, already waiting on message of the day (hasn't timed out yet);
* -1 - Timeout waiting for message of the day;
* 0 - Waiting for data;
* 1 - Data received.
*/
int GetD3MOTD(char *szmotd, int maxlen);
/**
* Cancel previous MOTD request
* @return
* -3 Error, called with NULL, but no request is waiting
* 2 Request successfully cancelled
*/
int GetD3MOTDCancel();
// Function prototypes
int InitPilotTrackerClient();
void AckServer(uint32_t sig);
int SendD3PilotData(vmt_descent3_struct *d3_pilot);
int GetD3PilotData(vmt_descent3_struct *d3_pilot, char *pilot_name, char *tracker_id);
/**
* Cancel previous GetD3PilotData() wait
* @return
* -3: Error - Called GetD3PilotData with NULL, but no request is waiting;
* 2: Request successfully canceled;
*/
int GetD3PilotDataCancel();
void PollPTrackNet();
void ValidIdle();
// int ValidateUser(validate_id_request *valid_id);
int ValidateUser(validate_id_request *valid_id, char *trackerid);
void xorcode(void *data, uint32_t len, uint32_t hash);
extern int MTAVersionCheck(uint32_t oldver, char *URL);
void VersionIdle();
void HandlePilotData(uint8_t *data, int len, network_address *from);
#ifdef WIN32
#pragma pack(pop, r_udp)
#else
#pragma pack()
#endif
#endif