mirror of
https://github.com/kevinbentley/Descent3.git
synced 2025-01-22 11:28:56 +00:00
285 lines
9.9 KiB
C++
285 lines
9.9 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/dmfcserver.cpp $
|
|
* $Revision: 1.1.1.1 $
|
|
* $Date: 2003/08/26 03:57:21 $
|
|
* $Author: kevinb $
|
|
*
|
|
* DMFC Server event handlers
|
|
*
|
|
* $Log: dmfcserver.cpp,v $
|
|
* Revision 1.1.1.1 2003/08/26 03:57:21 kevinb
|
|
* initial 1.5 import
|
|
*
|
|
*
|
|
* 29 7/09/99 6:18p Jeff
|
|
* added $remoteadminlogout and $wait commands
|
|
*
|
|
* 28 7/09/99 2:54p Jeff
|
|
* handle gametime better (pause it when needed) if the server is 'waiting
|
|
* for players'
|
|
*
|
|
* 27 7/08/99 6:25p Jeff
|
|
* remote admin in and working
|
|
*
|
|
* 26 5/08/99 4:31a Jeff
|
|
* fixed sequencing bug where clients never got a level end event for the
|
|
* multiplayer games
|
|
*
|
|
* 25 5/04/99 8:46p Jeff
|
|
* display icon when someone plays an audio taunt
|
|
*
|
|
* 24 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.
|
|
*
|
|
* 23 3/17/99 12:25p Jeff
|
|
* converted DMFC to be COM interface
|
|
*
|
|
* 22 2/11/99 12:51a Jeff
|
|
* changed names of exported variables
|
|
*
|
|
* 21 2/07/99 1:20a Jeff
|
|
* added new multiplayer game events EVT_GAMEOBJKILLED and
|
|
* EVT_GAMEOBJDESTROYED
|
|
*
|
|
* 20 1/17/99 11:52p Jeff
|
|
* added some new events, and changed a couple event handlers
|
|
*
|
|
* 19 1/15/99 3:54a Jeff
|
|
* exported a couple more functions. Added event handlers for Weapon
|
|
* collide event
|
|
*
|
|
* 18 11/16/98 5:35p Jeff
|
|
* removed log functions, added support for changing team names, fixed ctf
|
|
* to work better with different team names
|
|
*
|
|
* 17 10/23/98 11:22a Jeff
|
|
* changes to handle mixcase, and display the client netgame info
|
|
* correctly
|
|
*
|
|
* 16 10/18/98 7:59p Jeff
|
|
* functions added to dmfc for client->server objnum matching. Banning
|
|
* now uses tracker id when available.
|
|
*
|
|
* 15 10/15/98 6:18p Jeff
|
|
* created the is player banned event, removed prejoin event
|
|
*
|
|
* 14 10/15/98 1:34p Jeff
|
|
* added scrollable onscreen menu. Remove ban in dmfc. prejoin event
|
|
*
|
|
* 13 10/01/98 11:30a Jeff
|
|
* made the observer mode events into just a client event
|
|
*
|
|
* 12 9/30/98 3:50p Jeff
|
|
* general improvements (many)
|
|
*
|
|
* 11 9/21/98 7:11p Jeff
|
|
* made InputCommand interface API and moved existing input commands to
|
|
* the interface. Changed mprintf/ASSERT so they are valid in DMFC
|
|
*
|
|
* $NoKeywords: $
|
|
*/
|
|
|
|
#include "gamedll_header.h"
|
|
#include "DMFC.h"
|
|
#include "dmfcinternal.h"
|
|
#include "d3events.h"
|
|
|
|
// ###################Server Only functions################################
|
|
|
|
// DMFCBase::OnServerPlayerKilled
|
|
//
|
|
// Event handler for when a player gets killed, either by another player or some other way
|
|
// killer_obj = object pointer to the object that killed the player
|
|
// victim_pnum = player number of the player that got killed
|
|
void DMFCBase::OnServerPlayerKilled(object *killer_obj, int victim_pnum) {
|
|
if (Data->iParam == 255)
|
|
Data->iParam = -1;
|
|
else {
|
|
Data->iParam = (int)DLLMultiGetMatchChecksum(OBJ_WEAPON, Data->iParam);
|
|
if (Data->iParam == -1) {
|
|
mprintf(0, "Unable to generate checksum for weapon id\n");
|
|
}
|
|
}
|
|
|
|
// send this event to the clients so they can handle it
|
|
CallClientEvent(EVT_CLIENT_GAMEPLAYERKILLED, GetMeObjNum(), GetItObjNum(), -1, true);
|
|
CallOnClientPlayerKilled(killer_obj, victim_pnum);
|
|
}
|
|
|
|
// DMFCBase::OnServerPlayerExploded
|
|
//
|
|
// Event handler for when a player explodes. Gets called after a EVT_GAMEPLAYERKILLED event.
|
|
// player_num = player number of the player exploding
|
|
void DMFCBase::OnServerPlayerExploded(int player_num) {}
|
|
|
|
// DMFCBase::OnServerCollide
|
|
//
|
|
// Event handler for when two objects collide. At least one of the two objects is a player or a robot.
|
|
// Be aware that this event will be called twice per collision, the second time it is called the me and
|
|
// it objects will be flipped.
|
|
// me_obj = object pointer to the me object
|
|
// it_obj = object pointer to the it object
|
|
void DMFCBase::OnServerCollide(object *me_obj, object *it_obj) {}
|
|
void DMFCBase::OnServerCollide(object *me_obj, object *it_obj, vector *point, vector *normal) {}
|
|
|
|
// DMFCBase::OnServerPlayerChangeSegment
|
|
//
|
|
// Event handler for when a player changes rooms or a "large" terrain cell
|
|
// (8x8 Terrain block).
|
|
// player_num = player number of the player who just changed the room/segment
|
|
// newseg = New room/cell location
|
|
void DMFCBase::OnServerPlayerChangeSegment(int player_num, int newseg, int oldseg) {}
|
|
|
|
// DMFCBase::OnServerObjectChangeSegment (Only called if server tells client to execute)
|
|
//
|
|
// Event handler for when a player changes rooms or a "large" terrain cell
|
|
// (8x8 Terrain block).
|
|
// obj = Object pointer of the object who just changed the room/segment
|
|
// newseg = New room/cell location
|
|
// oldseg = Old room/cell location
|
|
void DMFCBase::OnServerObjectChangeSegment(object *obj, int newseg, int oldseg) {}
|
|
|
|
// DMFCBase::OnServerPlayerEntersGame
|
|
//
|
|
// Event handler for when a player enters the game. This will only get called once per
|
|
// player, it usually gets called right after they connect to the server to start playing.
|
|
// player_num = player number of the player entering the game
|
|
void DMFCBase::OnServerPlayerEntersGame(int player_num) {
|
|
if (player_num == -1)
|
|
return;
|
|
|
|
VersionCheck(player_num);
|
|
|
|
// see if they are banned, if so, give em the boot
|
|
if (IsPlayerBanned(player_num)) {
|
|
SendControlMessageToPlayer(player_num, CM_BANNED);
|
|
DLLMultiDisconnectPlayer(player_num);
|
|
return;
|
|
}
|
|
|
|
SendDMFCGameInfo(player_num);
|
|
|
|
SendNetGameInfoSync(player_num);
|
|
|
|
// Since clients won't ever get the OnClientLevelStart, send it here so they get it before PlayerEntersGame
|
|
CallClientEvent(EVT_CLIENT_GAMELEVELSTART, GetMeObjNum(), GetItObjNum(), player_num);
|
|
|
|
CallClientEvent(EVT_CLIENT_GAMEPLAYERENTERSGAME, GetMeObjNum(), GetItObjNum(), -1);
|
|
CallOnClientPlayerEntersGame(player_num);
|
|
}
|
|
|
|
// DMFCBase::OnServerPlayerDisconnect
|
|
//
|
|
// Event handler for when a player disconnects from the server.
|
|
// player_num = player number of the player that just disconnected
|
|
void DMFCBase::OnServerPlayerDisconnect(int player_num) {
|
|
if (player_num == -1)
|
|
return;
|
|
|
|
// send this event to the clients so they can handle it
|
|
CallClientEvent(EVT_CLIENT_GAMEPLAYERDISCONNECT, GetMeObjNum(), GetItObjNum(), -1);
|
|
CallOnClientPlayerDisconnect(player_num);
|
|
}
|
|
|
|
// DMFCBase::OnServerGameCreated
|
|
//
|
|
// Event handler when the server's game first gets started. This will only be called once
|
|
// while the server is running, and that is when the server first starts up.
|
|
void DMFCBase::OnServerGameCreated(void) {}
|
|
|
|
// DMFCBase::OnServerLevelChange
|
|
//
|
|
// Event handler when the server changes levels. This will get called after a level ends and a server
|
|
// is starting a new level.
|
|
void DMFCBase::OnServerLevelChange(void) {}
|
|
|
|
// DMFCBase::OnServerLevelStart
|
|
//
|
|
// Event handler for when a multiplayer level is starting up. This will get called right before the level
|
|
// starts.
|
|
void DMFCBase::OnServerLevelStart(void) {
|
|
RealGametime = 0.0f; // zero out real gametime
|
|
|
|
// Let the server get the OnLevelStart
|
|
CallOnClientLevelStart();
|
|
|
|
// send a fake EVT_GAMEPLAYERENTERSGAME to the server so he gets that event
|
|
Data->me_handle = Data->it_handle = Objects[Players[GetPlayerNum()].objnum].handle;
|
|
Data->it_handle = Data->me_handle;
|
|
CallOnServerPlayerEntersGame(GetPlayerNum());
|
|
|
|
DisplayTauntIndicator = false;
|
|
|
|
// If we are a dedicated server, and there is a wait time make everyone wait
|
|
if (GetLocalRole() == LR_SERVER && IAmDedicatedServer()) {
|
|
if (DedicatedLevelWait > 0) {
|
|
// time to stop waiting!
|
|
mprintf(0, "Telling clients to wait\n");
|
|
DPrintf("\nMaking Clients Wait %.2f seconds\n", DedicatedLevelWait);
|
|
PauseRealGameTime(true);
|
|
MakeClientsWait(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
// DMFCBase::OnServerLevelEnd
|
|
//
|
|
// Event handler for when a multiplayer level is ending.
|
|
void DMFCBase::OnServerLevelEnd(void) {
|
|
// send this event to the clients so they can handle it
|
|
// JEFF - since Jason mucked with sequencing, all clients at this point are
|
|
// at some weird sequence, so we can't send packets to them
|
|
// CallClientEvent(EVT_CLIENT_GAMELEVELEND,GetMeObjNum(),GetItObjNum(),-1);
|
|
// CallOnClientLevelEnd();
|
|
}
|
|
|
|
// DMFCBase::OnServerObjectShieldsChanged
|
|
//
|
|
// Event handler for when an objects shield's change
|
|
void DMFCBase::OnServerObjectShieldsChanged(object *obj, float amount) {}
|
|
|
|
// DMFCBase::OnServerIsAddressBanned
|
|
//
|
|
// Called by the game to determine if the given network address is banned from the game
|
|
bool DMFCBase::OnServerIsAddressBanned(network_address *addr, const char *tracker_id) {
|
|
return IsAddressBanned(addr, tracker_id);
|
|
}
|
|
|
|
// DMFCBase::OnServerWallCollide
|
|
//
|
|
// Called by the game when their is a collision between an object and a wall
|
|
void DMFCBase::OnServerWallCollide(object *obj, float hitspeed, int hitseg, int hitwall, vector *hitpt,
|
|
vector *wall_normal, float hit_dot) {}
|
|
|
|
// DMFCBase::OnServerObjectKilled
|
|
//
|
|
// Called when an object is being killed
|
|
// Not automatically sent to clients (OnClientObjectKilled)
|
|
// killer might not be valid (NULL)
|
|
void DMFCBase::OnServerObjectKilled(object *obj, object *killer) {}
|
|
|
|
// DMFCBase::OnServerObjectDestroyed
|
|
//
|
|
// Called when an object is about to be deleted
|
|
// Not automatically sent to clients
|
|
void DMFCBase::OnServerObjectDestroyed(object *obj) {}
|