mirror of
https://github.com/kevinbentley/Descent3.git
synced 2025-01-22 19:55:23 +00:00
998 lines
30 KiB
C++
998 lines
30 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/>.
|
|
|
|
--- HISTORICAL COMMENTS FOLLOW ---
|
|
|
|
* $Logfile: /DescentIII/Main/dmfc/dmfcvirtual.cpp $
|
|
* $Revision: 1.1.1.1 $
|
|
* $Date: 2003/08/26 03:57:21 $
|
|
* $Author: kevinb $
|
|
*
|
|
* Handles the interface for virtual calls/overriding event handlers
|
|
*
|
|
* $Log: dmfcvirtual.cpp,v $
|
|
* Revision 1.1.1.1 2003/08/26 03:57:21 kevinb
|
|
* initial 1.5 import
|
|
*
|
|
*
|
|
* 10 7/13/99 10:05a Jeff
|
|
* text taunt token decoding
|
|
*
|
|
* 9 7/08/99 9:55p Jeff
|
|
* added event handler for weapon fired event
|
|
*
|
|
* 8 5/10/99 2:44a Jeff
|
|
* handle new scheme of player's joining in a team game, where the team is
|
|
* set before player enters game in the main code, but the team is
|
|
* determined via event call to dmfc
|
|
*
|
|
* 7 5/08/99 4:31a Jeff
|
|
* fixed sequencing bug where clients never got a level end event for the
|
|
* multiplayer games
|
|
*
|
|
* 6 4/14/99 1:15a Jeff
|
|
* fixed case mismatched #includes
|
|
*
|
|
* 5 3/24/99 1:41p Jeff
|
|
* some dedicated server fixups...ability to set number of teams
|
|
*
|
|
* 4 3/22/99 6:21p Jeff
|
|
* added 2 more audio taunts. a mulitplayer event when someone plays an
|
|
* audio taunt. option to disable audio taunts.
|
|
*
|
|
* 3 3/22/99 5:51p Matt
|
|
* Removed some includes from one file and added some to other files, to
|
|
* reduce the amount of rebuilding when headers change.
|
|
*
|
|
* 2 3/17/99 12:25p Jeff
|
|
* converted DMFC to be COM interface
|
|
*
|
|
* 1 3/17/99 11:54a Jeff
|
|
*
|
|
* $NoKeywords: $
|
|
*/
|
|
|
|
#include "DMFC.h"
|
|
#include "dmfcinternal.h"
|
|
#include "d3events.h"
|
|
|
|
// DMFCBase::InitializeVirtualHandles
|
|
// Prepares the virtual handles
|
|
void DMFCBase::InitializeVirtualHandles(void) {
|
|
UserOnServerPlayerKilled = NULL;
|
|
UserOnServerPlayerExploded = NULL;
|
|
UserOnServerCollide = NULL;
|
|
UserOnServerCollide2 = NULL;
|
|
UserOnServerPlayerChangeSegment = NULL;
|
|
UserOnServerObjectChangeSegment = NULL;
|
|
UserOnServerPlayerEntersGame = NULL;
|
|
UserOnServerPlayerDisconnect = NULL;
|
|
UserOnServerGameCreated = NULL;
|
|
UserOnServerLevelChange = NULL;
|
|
UserOnServerLevelStart = NULL;
|
|
UserOnServerLevelEnd = NULL;
|
|
UserOnServerObjectShieldsChanged = NULL;
|
|
UserOnServerIsAddressBanned = NULL;
|
|
UserOnServerWallCollide = NULL;
|
|
UserOnServerObjectKilled = NULL;
|
|
UserOnServerObjectDestroyed = NULL;
|
|
UserOnClientPlayerKilled = NULL;
|
|
UserOnClientPlayerExploded = NULL;
|
|
UserOnClientCollide = NULL;
|
|
UserOnClientCollide2 = NULL;
|
|
UserOnClientPlayerChangeSegment = NULL;
|
|
UserOnClientObjectChangeSegment = NULL;
|
|
UserOnClientPlayerEntersGame = NULL;
|
|
UserOnClientPlayerDisconnect = NULL;
|
|
UserOnMeDisconnectFromServer = NULL;
|
|
UserOnClientGameCreated = NULL;
|
|
UserOnClientObjectShieldsChanged = NULL;
|
|
UserOnWeaponFired = NULL;
|
|
UserOnClientLevelChange = NULL;
|
|
UserOnClientLevelStart = NULL;
|
|
UserOnClientLevelEnd = NULL;
|
|
UserOnClientWallCollide = NULL;
|
|
UserOnClientObjectKilled = NULL;
|
|
UserOnClientObjectDestroyed = NULL;
|
|
UserOnPlayerEntersObserver = NULL;
|
|
UserOnPlayerExitsObserver = NULL;
|
|
UserOnCanChangeTeam = NULL;
|
|
UserOnSpecialPacket = NULL;
|
|
UserOnInterval = NULL;
|
|
UserOnHUDInterval = NULL;
|
|
UserOnPLRInterval = NULL;
|
|
UserOnPLRInit = NULL;
|
|
UserOnKeypress = NULL;
|
|
UserOnInputString = NULL;
|
|
UserOnPlayerChangeTeam = NULL;
|
|
UserOnGameStateRequest = NULL;
|
|
UserOnSaveStatsToFile = NULL;
|
|
UserOnPlayerReconnect = NULL;
|
|
UserOnPlayerConnect = NULL;
|
|
UserOnControlMessage = NULL;
|
|
UserOnAllowObserverChange = NULL;
|
|
UserOnClientShowUI = NULL;
|
|
UserOnPrintScores = NULL;
|
|
UserOnDisconnectSaveStatsToFile = NULL;
|
|
UserOnLevelEndSaveStatsToFile = NULL;
|
|
UserOnGetHudCallSignColor = NULL;
|
|
UserOnTeamChangeName = NULL;
|
|
UserOnDoControls = NULL;
|
|
UserOnPlayAudioTaunt = NULL;
|
|
UserOnGetTokenString = NULL;
|
|
}
|
|
|
|
void DMFCBase::Set_OnServerPlayerKilled(void (*callback)(object *killer_obj, int victim_pnum)) {
|
|
UserOnServerPlayerKilled = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnServerPlayerExploded(void (*callback)(int player_num)) { UserOnServerPlayerExploded = callback; }
|
|
|
|
void DMFCBase::Set_OnServerCollide(void (*callback)(object *me_obj, object *it_obj)) { UserOnServerCollide = callback; }
|
|
|
|
void DMFCBase::Set_OnServerCollide(void (*callback)(object *me_obj, object *it_obj, vector *point, vector *normal)) {
|
|
UserOnServerCollide2 = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnServerPlayerChangeSegment(void (*callback)(int player_num, int newseg, int oldseg)) {
|
|
UserOnServerPlayerChangeSegment = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnServerObjectChangeSegment(void (*callback)(object *obj, int newseg, int oldseg)) {
|
|
UserOnServerObjectChangeSegment = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnServerPlayerEntersGame(void (*callback)(int player_num)) {
|
|
UserOnServerPlayerEntersGame = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnServerPlayerDisconnect(void (*callback)(int player_num)) {
|
|
UserOnServerPlayerDisconnect = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnServerGameCreated(void (*callback)(void)) { UserOnServerGameCreated = callback; }
|
|
|
|
void DMFCBase::Set_OnServerLevelChange(void (*callback)(void)) { UserOnServerLevelChange = callback; }
|
|
|
|
void DMFCBase::Set_OnServerLevelStart(void (*callback)(void)) { UserOnServerLevelStart = callback; }
|
|
|
|
void DMFCBase::Set_OnServerLevelEnd(void (*callback)(void)) { UserOnServerLevelEnd = callback; }
|
|
|
|
void DMFCBase::Set_OnServerObjectShieldsChanged(void (*callback)(object *obj, float amount)) {
|
|
UserOnServerObjectShieldsChanged = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnServerIsAddressBanned(bool (*callback)(network_address *addr, const char *tracker_id)) {
|
|
UserOnServerIsAddressBanned = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnServerWallCollide(void (*callback)(object *obj, float hitspeed, int hitseg, int hitwall,
|
|
vector *hitpt, vector *wall_normal, float hit_dot)) {
|
|
UserOnServerWallCollide = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnServerObjectKilled(void (*callback)(object *obj, object *killer)) {
|
|
UserOnServerObjectKilled = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnServerObjectDestroyed(void (*callback)(object *obj)) { UserOnServerObjectDestroyed = callback; }
|
|
|
|
void DMFCBase::Set_OnClientPlayerKilled(void (*callback)(object *killer_obj, int victim_pnum)) {
|
|
UserOnClientPlayerKilled = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnClientPlayerExploded(void (*callback)(int player_num)) { UserOnClientPlayerExploded = callback; }
|
|
|
|
void DMFCBase::Set_OnClientCollide(void (*callback)(object *me_obj, object *it_obj)) { UserOnClientCollide = callback; }
|
|
|
|
void DMFCBase::Set_OnClientCollide(void (*callback)(object *me_obj, object *it_obj, vector *point, vector *normal)) {
|
|
UserOnClientCollide2 = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnClientPlayerChangeSegment(void (*callback)(int player_num, int newseg, int oldseg)) {
|
|
UserOnClientPlayerChangeSegment = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnClientObjectChangeSegment(void (*callback)(object *obj, int newseg, int oldseg)) {
|
|
UserOnClientObjectChangeSegment = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnClientPlayerEntersGame(void (*callback)(int player_num)) {
|
|
UserOnClientPlayerEntersGame = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnClientPlayerDisconnect(void (*callback)(int player_num)) {
|
|
UserOnClientPlayerDisconnect = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnMeDisconnectFromServer(void (*callback)(void)) { UserOnMeDisconnectFromServer = callback; }
|
|
|
|
void DMFCBase::Set_OnClientGameCreated(void (*callback)(void)) { UserOnClientGameCreated = callback; }
|
|
|
|
void DMFCBase::Set_OnClientObjectShieldsChanged(void (*callback)(object *obj, float amount)) {
|
|
UserOnClientObjectShieldsChanged = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnWeaponFired(void (*callback)(object *weapon_obj, object *shooter)) {
|
|
UserOnWeaponFired = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnClientLevelChange(void (*callback)(void)) { UserOnClientLevelChange = callback; }
|
|
|
|
void DMFCBase::Set_OnClientLevelStart(void (*callback)(void)) { UserOnClientLevelStart = callback; }
|
|
|
|
void DMFCBase::Set_OnClientLevelEnd(void (*callback)(void)) { UserOnClientLevelEnd = callback; }
|
|
|
|
void DMFCBase::Set_OnClientWallCollide(void (*callback)(object *obj, float hitspeed, int hitseg, int hitwall,
|
|
vector *hitpt, vector *wall_normal, float hit_dot)) {
|
|
UserOnClientWallCollide = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnClientObjectKilled(void (*callback)(object *obj, object *killer)) {
|
|
UserOnClientObjectKilled = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnClientObjectDestroyed(void (*callback)(object *obj)) { UserOnClientObjectDestroyed = callback; }
|
|
|
|
void DMFCBase::Set_OnPlayerEntersObserver(void (*callback)(int pnum, object *piggy)) {
|
|
UserOnPlayerEntersObserver = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnPlayerExitsObserver(void (*callback)(int pnum)) { UserOnPlayerExitsObserver = callback; }
|
|
|
|
void DMFCBase::Set_OnCanChangeTeam(bool (*callback)(int pnum, int newteam)) { UserOnCanChangeTeam = callback; }
|
|
|
|
void DMFCBase::Set_OnSpecialPacket(void (*callback)(void)) { UserOnSpecialPacket = callback; }
|
|
|
|
void DMFCBase::Set_OnInterval(void (*callback)(void)) { UserOnInterval = callback; }
|
|
|
|
void DMFCBase::Set_OnHUDInterval(void (*callback)(void)) { UserOnHUDInterval = callback; }
|
|
|
|
void DMFCBase::Set_OnPLRInterval(void (*callback)(void)) { UserOnPLRInterval = callback; }
|
|
|
|
void DMFCBase::Set_OnPLRInit(void (*callback)(void)) { UserOnPLRInit = callback; }
|
|
|
|
void DMFCBase::Set_OnKeypress(void (*callback)(int key)) { UserOnKeypress = callback; }
|
|
|
|
void DMFCBase::Set_OnInputString(void (*callback)(char *input_string)) { UserOnInputString = callback; }
|
|
|
|
void DMFCBase::Set_OnPlayerChangeTeam(void (*callback)(int player_num, int newteam, bool announce,
|
|
bool spew_everything)) {
|
|
UserOnPlayerChangeTeam = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnGameStateRequest(void (*callback)(int pnum)) { UserOnGameStateRequest = callback; }
|
|
|
|
void DMFCBase::Set_OnSaveStatsToFile(void (*callback)(void)) { UserOnSaveStatsToFile = callback; }
|
|
|
|
void DMFCBase::Set_OnPlayerReconnect(void (*callback)(int player_num)) { UserOnPlayerReconnect = callback; }
|
|
|
|
void DMFCBase::Set_OnPlayerConnect(void (*callback)(int player_num)) { UserOnPlayerConnect = callback; }
|
|
|
|
void DMFCBase::Set_OnControlMessage(void (*callback)(uint8_t msg, int from_pnum)) { UserOnControlMessage = callback; }
|
|
|
|
void DMFCBase::Set_OnAllowObserverChange(bool (*callback)(bool turnonobserver)) {
|
|
UserOnAllowObserverChange = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnClientShowUI(void (*callback)(int id, void *user_data)) { UserOnClientShowUI = callback; }
|
|
|
|
void DMFCBase::Set_OnPrintScores(void (*callback)(int level)) { UserOnPrintScores = callback; }
|
|
|
|
void DMFCBase::Set_OnDisconnectSaveStatsToFile(void (*callback)(void)) { UserOnDisconnectSaveStatsToFile = callback; }
|
|
|
|
void DMFCBase::Set_OnLevelEndSaveStatsToFile(void (*callback)(void)) { UserOnLevelEndSaveStatsToFile = callback; }
|
|
|
|
void DMFCBase::Set_OnGetHudCallSignColor(ddgr_color (*callback)(int playernum)) {
|
|
UserOnGetHudCallSignColor = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnTeamChangeName(void (*callback)(int team, char *oldname, char *newname)) {
|
|
UserOnTeamChangeName = callback;
|
|
}
|
|
|
|
void DMFCBase::Set_OnDoControls(void (*callback)(game_controls *controls)) { UserOnDoControls = callback; }
|
|
|
|
void DMFCBase::Set_OnPlayAudioTaunt(void (*callback)(int pnum)) { UserOnPlayAudioTaunt = callback; }
|
|
|
|
void DMFCBase::Set_OnGetTokenString(void (*callback)(char *src, char *dest, int dest_size)) {
|
|
UserOnGetTokenString = callback;
|
|
}
|
|
///////////////////////////////////////////////////////
|
|
|
|
void DMFCBase::CallOnServerPlayerKilled(object *killer_obj, int victim_pnum) {
|
|
if (UserOnServerPlayerKilled)
|
|
(*UserOnServerPlayerKilled)(killer_obj, victim_pnum);
|
|
else
|
|
OnServerPlayerKilled(killer_obj, victim_pnum);
|
|
}
|
|
|
|
void DMFCBase::CallOnServerPlayerExploded(int player_num) {
|
|
if (UserOnServerPlayerExploded)
|
|
(*UserOnServerPlayerExploded)(player_num);
|
|
else
|
|
OnServerPlayerExploded(player_num);
|
|
}
|
|
|
|
void DMFCBase::CallOnServerCollide(object *me_obj, object *it_obj) {
|
|
if (UserOnServerCollide)
|
|
(*UserOnServerCollide)(me_obj, it_obj);
|
|
else
|
|
OnServerCollide(me_obj, it_obj);
|
|
}
|
|
|
|
void DMFCBase::CallOnServerCollide(object *me_obj, object *it_obj, vector *point, vector *normal) {
|
|
if (UserOnServerCollide2)
|
|
(*UserOnServerCollide2)(me_obj, it_obj, point, normal);
|
|
else
|
|
OnServerCollide(me_obj, it_obj, point, normal);
|
|
}
|
|
|
|
void DMFCBase::CallOnServerPlayerChangeSegment(int player_num, int newseg, int oldseg) {
|
|
if (UserOnServerPlayerChangeSegment)
|
|
(*UserOnServerPlayerChangeSegment)(player_num, newseg, oldseg);
|
|
else
|
|
OnServerPlayerChangeSegment(player_num, newseg, oldseg);
|
|
}
|
|
|
|
void DMFCBase::CallOnServerObjectChangeSegment(object *obj, int newseg, int oldseg) {
|
|
if (UserOnServerObjectChangeSegment)
|
|
(*UserOnServerObjectChangeSegment)(obj, newseg, oldseg);
|
|
else
|
|
OnServerObjectChangeSegment(obj, newseg, oldseg);
|
|
}
|
|
|
|
void DMFCBase::CallOnServerPlayerEntersGame(int player_num) {
|
|
if (UserOnServerPlayerEntersGame)
|
|
(*UserOnServerPlayerEntersGame)(player_num);
|
|
else
|
|
OnServerPlayerEntersGame(player_num);
|
|
}
|
|
|
|
void DMFCBase::CallOnServerPlayerDisconnect(int player_num) {
|
|
if (UserOnServerPlayerDisconnect)
|
|
(*UserOnServerPlayerDisconnect)(player_num);
|
|
else
|
|
OnServerPlayerDisconnect(player_num);
|
|
}
|
|
|
|
void DMFCBase::CallOnServerGameCreated(void) {
|
|
if (UserOnServerGameCreated)
|
|
(*UserOnServerGameCreated)();
|
|
else
|
|
OnServerGameCreated();
|
|
}
|
|
|
|
void DMFCBase::CallOnServerLevelChange(void) {
|
|
if (UserOnServerLevelChange)
|
|
(*UserOnServerLevelChange)();
|
|
else
|
|
OnServerLevelChange();
|
|
}
|
|
|
|
void DMFCBase::CallOnServerLevelStart(void) {
|
|
if (UserOnServerLevelStart)
|
|
(*UserOnServerLevelStart)();
|
|
else
|
|
OnServerLevelStart();
|
|
}
|
|
|
|
void DMFCBase::CallOnServerLevelEnd(void) {
|
|
if (UserOnServerLevelEnd)
|
|
(*UserOnServerLevelEnd)();
|
|
else
|
|
OnServerLevelEnd();
|
|
}
|
|
|
|
void DMFCBase::CallOnServerObjectShieldsChanged(object *obj, float amount) {
|
|
if (UserOnServerObjectShieldsChanged)
|
|
(*UserOnServerObjectShieldsChanged)(obj, amount);
|
|
else
|
|
OnServerObjectShieldsChanged(obj, amount);
|
|
}
|
|
|
|
bool DMFCBase::CallOnServerIsAddressBanned(network_address *addr, const char *tracker_id) {
|
|
if (UserOnServerIsAddressBanned)
|
|
return (*UserOnServerIsAddressBanned)(addr, tracker_id);
|
|
else
|
|
return OnServerIsAddressBanned(addr, tracker_id);
|
|
}
|
|
|
|
void DMFCBase::CallOnServerWallCollide(object *obj, float hitspeed, int hitseg, int hitwall, vector *hitpt,
|
|
vector *wall_normal, float hit_dot) {
|
|
if (UserOnServerWallCollide)
|
|
(*UserOnServerWallCollide)(obj, hitspeed, hitseg, hitwall, hitpt, wall_normal, hit_dot);
|
|
else
|
|
OnServerWallCollide(obj, hitspeed, hitseg, hitwall, hitpt, wall_normal, hit_dot);
|
|
}
|
|
|
|
void DMFCBase::CallOnServerObjectKilled(object *obj, object *killer) {
|
|
if (UserOnServerObjectKilled)
|
|
(*UserOnServerObjectKilled)(obj, killer);
|
|
else
|
|
OnServerObjectKilled(obj, killer);
|
|
}
|
|
|
|
void DMFCBase::CallOnServerObjectDestroyed(object *obj) {
|
|
if (UserOnServerObjectDestroyed)
|
|
(*UserOnServerObjectDestroyed)(obj);
|
|
else
|
|
OnServerObjectDestroyed(obj);
|
|
}
|
|
|
|
void DMFCBase::CallOnClientPlayerKilled(object *killer_obj, int victim_pnum) {
|
|
if (UserOnClientPlayerKilled)
|
|
(*UserOnClientPlayerKilled)(killer_obj, victim_pnum);
|
|
else
|
|
OnClientPlayerKilled(killer_obj, victim_pnum);
|
|
}
|
|
|
|
void DMFCBase::CallOnClientPlayerExploded(int player_num) {
|
|
if (UserOnClientPlayerExploded)
|
|
(*UserOnClientPlayerExploded)(player_num);
|
|
else
|
|
OnClientPlayerExploded(player_num);
|
|
}
|
|
|
|
void DMFCBase::CallOnClientCollide(object *me_obj, object *it_obj) {
|
|
if (UserOnClientCollide)
|
|
(*UserOnClientCollide)(me_obj, it_obj);
|
|
else
|
|
OnClientCollide(me_obj, it_obj);
|
|
}
|
|
|
|
void DMFCBase::CallOnClientCollide(object *me_obj, object *it_obj, vector *point, vector *normal) {
|
|
if (UserOnClientCollide2)
|
|
(*UserOnClientCollide2)(me_obj, it_obj, point, normal);
|
|
else
|
|
OnClientCollide(me_obj, it_obj, point, normal);
|
|
}
|
|
|
|
void DMFCBase::CallOnClientPlayerChangeSegment(int player_num, int newseg, int oldseg) {
|
|
if (UserOnClientPlayerChangeSegment)
|
|
(*UserOnClientPlayerChangeSegment)(player_num, newseg, oldseg);
|
|
else
|
|
OnClientPlayerChangeSegment(player_num, newseg, oldseg);
|
|
}
|
|
|
|
void DMFCBase::CallOnClientObjectChangeSegment(object *obj, int newseg, int oldseg) {
|
|
if (UserOnClientObjectChangeSegment)
|
|
(*UserOnClientObjectChangeSegment)(obj, newseg, oldseg);
|
|
else
|
|
OnClientObjectChangeSegment(obj, newseg, oldseg);
|
|
}
|
|
|
|
void DMFCBase::CallOnClientPlayerEntersGame(int player_num) {
|
|
if (UserOnClientPlayerEntersGame)
|
|
(*UserOnClientPlayerEntersGame)(player_num);
|
|
else
|
|
OnClientPlayerEntersGame(player_num);
|
|
}
|
|
|
|
void DMFCBase::CallOnClientPlayerDisconnect(int player_num) {
|
|
if (UserOnClientPlayerDisconnect)
|
|
(*UserOnClientPlayerDisconnect)(player_num);
|
|
else
|
|
OnClientPlayerDisconnect(player_num);
|
|
}
|
|
|
|
void DMFCBase::CallOnMeDisconnectFromServer(void) {
|
|
if (UserOnMeDisconnectFromServer)
|
|
(*UserOnMeDisconnectFromServer)();
|
|
else
|
|
OnMeDisconnectFromServer();
|
|
}
|
|
|
|
void DMFCBase::CallOnClientGameCreated(void) {
|
|
if (UserOnClientGameCreated)
|
|
(*UserOnClientGameCreated)();
|
|
else
|
|
OnClientGameCreated();
|
|
}
|
|
|
|
void DMFCBase::CallOnClientObjectShieldsChanged(object *obj, float amount) {
|
|
if (UserOnClientObjectShieldsChanged)
|
|
(*UserOnClientObjectShieldsChanged)(obj, amount);
|
|
else
|
|
OnClientObjectShieldsChanged(obj, amount);
|
|
}
|
|
|
|
void DMFCBase::CallOnWeaponFired(object *weapon_obj, object *shooter) {
|
|
if (UserOnWeaponFired)
|
|
(*UserOnWeaponFired)(weapon_obj, shooter);
|
|
else
|
|
OnWeaponFired(weapon_obj, shooter);
|
|
}
|
|
|
|
void DMFCBase::CallOnClientLevelChange(void) {
|
|
if (UserOnClientLevelChange)
|
|
(*UserOnClientLevelChange)();
|
|
else
|
|
OnClientLevelChange();
|
|
}
|
|
|
|
void DMFCBase::CallOnClientLevelStart(void) {
|
|
if (UserOnClientLevelStart)
|
|
(*UserOnClientLevelStart)();
|
|
else
|
|
OnClientLevelStart();
|
|
}
|
|
|
|
void DMFCBase::CallOnClientLevelEnd(void) {
|
|
if (UserOnClientLevelEnd)
|
|
(*UserOnClientLevelEnd)();
|
|
else
|
|
OnClientLevelEnd();
|
|
}
|
|
|
|
void DMFCBase::CallOnClientWallCollide(object *obj, float hitspeed, int hitseg, int hitwall, vector *hitpt,
|
|
vector *wall_normal, float hit_dot) {
|
|
if (UserOnClientWallCollide)
|
|
(*UserOnClientWallCollide)(obj, hitspeed, hitseg, hitwall, hitpt, wall_normal, hit_dot);
|
|
else
|
|
OnClientWallCollide(obj, hitspeed, hitseg, hitwall, hitpt, wall_normal, hit_dot);
|
|
}
|
|
|
|
void DMFCBase::CallOnClientObjectKilled(object *obj, object *killer) {
|
|
if (UserOnClientObjectKilled)
|
|
(*UserOnClientObjectKilled)(obj, killer);
|
|
else
|
|
OnClientObjectKilled(obj, killer);
|
|
}
|
|
|
|
void DMFCBase::CallOnClientObjectDestroyed(object *obj) {
|
|
if (UserOnClientObjectDestroyed)
|
|
(*UserOnClientObjectDestroyed)(obj);
|
|
else
|
|
OnClientObjectDestroyed(obj);
|
|
}
|
|
|
|
void DMFCBase::CallOnPlayerEntersObserver(int pnum, object *piggy) {
|
|
if (UserOnPlayerEntersObserver)
|
|
(*UserOnPlayerEntersObserver)(pnum, piggy);
|
|
else
|
|
OnPlayerEntersObserver(pnum, piggy);
|
|
}
|
|
|
|
void DMFCBase::CallOnPlayerExitsObserver(int pnum) {
|
|
if (UserOnPlayerExitsObserver)
|
|
(*UserOnPlayerExitsObserver)(pnum);
|
|
else
|
|
OnPlayerExitsObserver(pnum);
|
|
}
|
|
|
|
bool DMFCBase::CallOnCanChangeTeam(int pnum, int newteam) {
|
|
if (UserOnCanChangeTeam)
|
|
return (*UserOnCanChangeTeam)(pnum, newteam);
|
|
else
|
|
return OnCanChangeTeam(pnum, newteam);
|
|
}
|
|
|
|
void DMFCBase::CallOnSpecialPacket(void) {
|
|
if (UserOnSpecialPacket)
|
|
(*UserOnSpecialPacket)();
|
|
else
|
|
OnSpecialPacket();
|
|
}
|
|
|
|
void DMFCBase::CallOnInterval(void) {
|
|
if (UserOnInterval)
|
|
(*UserOnInterval)();
|
|
else
|
|
OnInterval();
|
|
}
|
|
|
|
void DMFCBase::CallOnHUDInterval(void) {
|
|
if (UserOnHUDInterval)
|
|
(*UserOnHUDInterval)();
|
|
else
|
|
OnHUDInterval();
|
|
}
|
|
|
|
void DMFCBase::CallOnPLRInterval(void) {
|
|
if (UserOnPLRInterval)
|
|
(*UserOnPLRInterval)();
|
|
else
|
|
OnPLRInterval();
|
|
}
|
|
|
|
void DMFCBase::CallOnPLRInit(void) {
|
|
if (UserOnPLRInit)
|
|
(*UserOnPLRInit)();
|
|
else
|
|
OnPLRInit();
|
|
}
|
|
|
|
void DMFCBase::CallOnKeypress(int key) {
|
|
if (UserOnKeypress)
|
|
(*UserOnKeypress)(key);
|
|
else
|
|
OnKeypress(key);
|
|
}
|
|
|
|
void DMFCBase::CallOnInputString(char *input_string) {
|
|
if (UserOnInputString)
|
|
(*UserOnInputString)(input_string);
|
|
else
|
|
OnInputString(input_string);
|
|
}
|
|
|
|
void DMFCBase::CallOnPlayerChangeTeam(int player_num, int newteam, bool announce, bool spew_everything) {
|
|
if (UserOnPlayerChangeTeam)
|
|
(*UserOnPlayerChangeTeam)(player_num, newteam, announce, spew_everything);
|
|
else
|
|
OnPlayerChangeTeam(player_num, newteam, announce, spew_everything);
|
|
}
|
|
|
|
void DMFCBase::CallOnGameStateRequest(int pnum) {
|
|
if (UserOnGameStateRequest)
|
|
(*UserOnGameStateRequest)(pnum);
|
|
else
|
|
OnGameStateRequest(pnum);
|
|
}
|
|
|
|
void DMFCBase::CallOnSaveStatsToFile(void) {
|
|
if (UserOnSaveStatsToFile)
|
|
(*UserOnSaveStatsToFile)();
|
|
else
|
|
OnSaveStatsToFile();
|
|
}
|
|
|
|
void DMFCBase::CallOnPlayerReconnect(int player_num) {
|
|
if (UserOnPlayerReconnect)
|
|
(*UserOnPlayerReconnect)(player_num);
|
|
else
|
|
OnPlayerReconnect(player_num);
|
|
}
|
|
|
|
void DMFCBase::CallOnPlayerConnect(int player_num) {
|
|
if (UserOnPlayerConnect)
|
|
(*UserOnPlayerConnect)(player_num);
|
|
else
|
|
OnPlayerConnect(player_num);
|
|
}
|
|
|
|
void DMFCBase::CallOnControlMessage(uint8_t msg, int from_pnum) {
|
|
if (UserOnControlMessage)
|
|
(*UserOnControlMessage)(msg, from_pnum);
|
|
else
|
|
OnControlMessage(msg, from_pnum);
|
|
}
|
|
|
|
bool DMFCBase::CallOnAllowObserverChange(bool turnonobserver) {
|
|
if (UserOnAllowObserverChange)
|
|
return (*UserOnAllowObserverChange)(turnonobserver);
|
|
else
|
|
return OnAllowObserverChange(turnonobserver);
|
|
}
|
|
|
|
void DMFCBase::CallOnClientShowUI(int id, void *user_data) {
|
|
if (UserOnClientShowUI)
|
|
(*UserOnClientShowUI)(id, user_data);
|
|
else
|
|
OnClientShowUI(id, user_data);
|
|
}
|
|
|
|
void DMFCBase::CallOnPrintScores(int level) {
|
|
if (UserOnPrintScores)
|
|
(*UserOnPrintScores)(level);
|
|
else
|
|
OnPrintScores(level);
|
|
}
|
|
|
|
void DMFCBase::CallOnDisconnectSaveStatsToFile(void) {
|
|
if (UserOnDisconnectSaveStatsToFile)
|
|
(*UserOnDisconnectSaveStatsToFile)();
|
|
else
|
|
OnDisconnectSaveStatsToFile();
|
|
}
|
|
|
|
void DMFCBase::CallOnLevelEndSaveStatsToFile(void) {
|
|
if (UserOnLevelEndSaveStatsToFile)
|
|
(*UserOnLevelEndSaveStatsToFile)();
|
|
else
|
|
OnLevelEndSaveStatsToFile();
|
|
}
|
|
|
|
ddgr_color DMFCBase::CallOnGetHudCallSignColor(int playernum) {
|
|
if (UserOnGetHudCallSignColor)
|
|
return (*UserOnGetHudCallSignColor)(playernum);
|
|
else
|
|
return OnGetHudCallSignColor(playernum);
|
|
}
|
|
|
|
void DMFCBase::CallOnTeamChangeName(int team, char *oldname, char *newname) {
|
|
if (UserOnTeamChangeName)
|
|
(*UserOnTeamChangeName)(team, oldname, newname);
|
|
else
|
|
OnTeamChangeName(team, oldname, newname);
|
|
}
|
|
|
|
void DMFCBase::CallOnDoControls(game_controls *controls) {
|
|
if (UserOnDoControls)
|
|
(*UserOnDoControls)(controls);
|
|
else
|
|
OnDoControls(controls);
|
|
}
|
|
|
|
void DMFCBase::CallOnPlayAudioTaunt(int pnum) {
|
|
if (UserOnPlayAudioTaunt)
|
|
(*UserOnPlayAudioTaunt)(pnum);
|
|
else
|
|
OnPlayAudioTaunt(pnum);
|
|
}
|
|
|
|
void DMFCBase::CallOnGetTokenString(char *src, char *dest, int dest_size) {
|
|
if (UserOnGetTokenString)
|
|
(*UserOnGetTokenString)(src, dest, dest_size);
|
|
else
|
|
OnGetTokenString(src, dest, dest_size);
|
|
}
|
|
|
|
// DMFCBase::TranslateEvent
|
|
//
|
|
// Translates the event passed in to handle, calls the appropriate handler function. If a function isn't
|
|
// created to handle the event, then it calls the default handler. Handler functions should call the default
|
|
// handler unless it absolutly shouldn't
|
|
void DMFCBase::TranslateEvent(int eventnum, dllinfo *data) {
|
|
// set the Data pointer to point to the current event's data
|
|
Data = data;
|
|
|
|
// extract this info out here since it has to be done through most of the events
|
|
int me_objnum;
|
|
int it_objnum;
|
|
object *me_objp;
|
|
object *it_objp;
|
|
|
|
if (data->me_handle > OBJECT_HANDLE_NONE) {
|
|
me_objnum = data->me_handle & HANDLE_OBJNUM_MASK;
|
|
me_objp = &Objects[me_objnum];
|
|
} else {
|
|
me_objnum = -1;
|
|
me_objp = NULL;
|
|
}
|
|
|
|
if (data->it_handle > OBJECT_HANDLE_NONE) {
|
|
it_objnum = data->it_handle & HANDLE_OBJNUM_MASK;
|
|
it_objp = &Objects[it_objnum];
|
|
} else {
|
|
it_objnum = -1;
|
|
it_objp = NULL;
|
|
}
|
|
|
|
// handle the event
|
|
switch (eventnum) {
|
|
case EVT_GAMEPLAYERKILLED: {
|
|
CallOnServerPlayerKilled(it_objp, (me_objp) ? me_objp->id : -1);
|
|
} break;
|
|
|
|
case EVT_GAMEPLAYEREXPLODED: {
|
|
CallOnServerPlayerExploded((me_objp) ? me_objp->id : -1);
|
|
} break;
|
|
|
|
case EVT_GAMECOLLIDE: {
|
|
CallOnServerCollide(me_objp, it_objp);
|
|
CallOnServerCollide(me_objp, it_objp, &data->collide_info.point, &data->collide_info.normal);
|
|
} break;
|
|
|
|
case EVT_GAMEPLAYERCHANGESEG: {
|
|
CallOnServerPlayerChangeSegment((me_objp) ? me_objp->id : -1, data->newseg, data->oldseg);
|
|
} break;
|
|
|
|
case EVT_GAMEOBJCHANGESEG: {
|
|
CallOnServerObjectChangeSegment(me_objp, data->newseg, data->oldseg);
|
|
} break;
|
|
|
|
case EVT_GAMEPLAYERENTERSGAME: {
|
|
CallOnServerPlayerEntersGame((me_objp) ? me_objp->id : -1);
|
|
} break;
|
|
|
|
case EVT_GAMEPLAYERDISCONNECT: {
|
|
CallOnServerPlayerDisconnect((me_objp) ? me_objp->id : -1);
|
|
} break;
|
|
|
|
case EVT_GAMECREATED: {
|
|
CallOnServerGameCreated();
|
|
} break;
|
|
|
|
case EVT_GAMELEVELCHANGE: {
|
|
CallOnServerLevelChange();
|
|
} break;
|
|
|
|
case EVT_GAMELEVELSTART: {
|
|
CallOnServerLevelStart();
|
|
} break;
|
|
|
|
case EVT_GAMEOBJECTSHIELDSCHANGED: {
|
|
CallOnServerObjectShieldsChanged(me_objp, data->fParam);
|
|
} break;
|
|
|
|
case EVT_GAMEOBJDESTROYED: {
|
|
CallOnServerObjectDestroyed(me_objp);
|
|
} break;
|
|
|
|
case EVT_GAMEOBJKILLED: {
|
|
CallOnServerObjectKilled(me_objp, it_objp);
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMELEVELEND: {
|
|
if (GetLocalRole() == LR_SERVER)
|
|
CallOnServerLevelEnd();
|
|
CallOnClientLevelEnd();
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMEPLAYERKILLED: {
|
|
CallOnClientPlayerKilled(it_objp, (me_objp) ? me_objp->id : -1);
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMEPLAYEREXPLODED: {
|
|
CallOnClientPlayerExploded((me_objp) ? me_objp->id : -1);
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMECOLLIDE: {
|
|
CallOnClientCollide(me_objp, it_objp);
|
|
CallOnClientCollide(me_objp, it_objp, &data->collide_info.point, &data->collide_info.normal);
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMEPLAYERCHANGESEG: {
|
|
CallOnClientPlayerChangeSegment((me_objp) ? me_objp->id : -1, data->newseg, data->oldseg);
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMEOBJCHANGESEG: {
|
|
CallOnClientObjectChangeSegment(me_objp, data->newseg, data->oldseg);
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMEPLAYERENTERSGAME: {
|
|
CallOnClientPlayerEntersGame((me_objp) ? me_objp->id : -1);
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMEPLAYERDISCONNECT: {
|
|
CallOnClientPlayerDisconnect((me_objp) ? me_objp->id : -1);
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMECREATED: {
|
|
CallOnClientGameCreated();
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMELEVELCHANGE: {
|
|
CallOnClientLevelChange();
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMESPECIALPACKET: {
|
|
CallOnSpecialPacket();
|
|
} break;
|
|
|
|
case EVT_CLIENT_HUD_INTERVAL: {
|
|
CallOnHUDInterval();
|
|
} break;
|
|
|
|
case EVT_GAME_INTERVAL: {
|
|
CallOnInterval();
|
|
} break;
|
|
|
|
case EVT_CLIENT_KEYPRESS: {
|
|
CallOnKeypress(data->input_key);
|
|
} break;
|
|
|
|
case EVT_CLIENT_INPUT_STRING: {
|
|
CallOnInputString(data->input_string);
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMELEVELSTART: {
|
|
CallOnClientLevelStart();
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMEPOSTLEVELRESULTS: {
|
|
CallOnPLRInterval();
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMEOBJECTSHIELDSCHANGED: {
|
|
CallOnClientObjectShieldsChanged(me_objp, data->fParam);
|
|
} break;
|
|
|
|
case EVT_WEAPONFIRED: {
|
|
CallOnWeaponFired(me_objp, it_objp);
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMEPLAYERENTERSOBSERVER:
|
|
if (me_objp) {
|
|
CallOnPlayerEntersObserver(me_objp->id, it_objp);
|
|
}
|
|
break;
|
|
|
|
case EVT_CLIENT_GAMEPLAYEREXITSOBSERVER:
|
|
if (me_objp) {
|
|
CallOnPlayerExitsObserver(me_objp->id);
|
|
}
|
|
break;
|
|
|
|
case EVT_CLIENT_GETCOLOREDNAME: {
|
|
ddgr_color color = GR_RGB(255, 255, 255);
|
|
|
|
if (me_objp) {
|
|
if (ShouldIDisplayHUDName(me_objp->id)) {
|
|
// ok we should display the hud name
|
|
color = CallOnGetHudCallSignColor(me_objp->id);
|
|
|
|
} else {
|
|
// don't display HUD name
|
|
color = -1;
|
|
}
|
|
}
|
|
data->iRet = (int)color;
|
|
} break;
|
|
|
|
case EVT_GAME_DISCONNECTED: {
|
|
CallOnMeDisconnectFromServer();
|
|
} break;
|
|
|
|
case EVT_GAMECHECKBAN: {
|
|
network_address *addr = (network_address *)data->special_data;
|
|
const char *tracker_id = (const char *) data->iParam;
|
|
|
|
data->iRet = (CallOnServerIsAddressBanned(addr, tracker_id)) ? 1 : 0;
|
|
} break;
|
|
|
|
case EVT_GAME_GET_PLAYER_TEAM: {
|
|
data->iRet = GetConnectingPlayerTeam(data->iParam);
|
|
} break;
|
|
|
|
case EVT_CLIENT_SHOWUI: {
|
|
if (m_iUIWindowID != -1) {
|
|
CallOnClientShowUI(m_iUIWindowID, m_UIUserData);
|
|
}
|
|
|
|
m_iUIWindowID = -1;
|
|
m_UIUserData = NULL;
|
|
} break;
|
|
|
|
case EVT_GAMEDOCONTROLS: {
|
|
CallOnDoControls((game_controls *)data->special_data);
|
|
} break;
|
|
|
|
case EVT_GAMEWALLCOLLIDE: {
|
|
CallOnServerWallCollide(me_objp, data->collide_info.hitspeed, data->collide_info.hitseg, data->collide_info.hitwall,
|
|
&data->collide_info.point, &data->collide_info.normal, data->collide_info.hit_dot);
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMEWALLCOLLIDE: {
|
|
CallOnClientWallCollide(me_objp, data->collide_info.hitspeed, data->collide_info.hitseg, data->collide_info.hitwall,
|
|
&data->collide_info.point, &data->collide_info.normal, data->collide_info.hit_dot);
|
|
} break;
|
|
|
|
case EVT_CLIENT_GAMEOBJDESTROYED: {
|
|
CallOnClientObjectDestroyed(me_objp);
|
|
} break;
|
|
case EVT_CLIENT_GAMEOBJKILLED: {
|
|
CallOnClientObjectKilled(me_objp, it_objp);
|
|
} break;
|
|
case EVT_CLIENT_PLAYERPLAYSAUDIOTAUNT: {
|
|
CallOnPlayAudioTaunt(me_objp->id);
|
|
} break;
|
|
case EVT_CLIENT_DECODETEXTMACRO: {
|
|
char *dest_string = (char *)data->special_data;
|
|
char *src_string = data->input_string;
|
|
const ptrdiff_t dest_size = data->iParam;
|
|
|
|
TranslateTextMacro(src_string, dest_string, dest_size);
|
|
} break;
|
|
default:
|
|
DLLmprintf(0, "DMFC Warning: Unhandled Event #%X\n", eventnum);
|
|
break;
|
|
}
|
|
}
|