diff --git a/src/game/g_game.pas b/src/game/g_game.pas
index 981082d949b8aa4b5766dc98757319001b108dda..8e3f80845b6be7acf54a4a67544da68c3b1e0c19 100644 (file)
--- a/src/game/g_game.pas
+++ b/src/game/g_game.pas
procedure g_Game_LoadData();
procedure g_Game_FreeData();
procedure g_Game_Update();
+procedure g_Game_PreUpdate();
procedure g_Game_Draw();
procedure g_Game_Quit();
procedure g_Game_SetupScreenSize();
gShowFPS: Boolean = False;
gShowGoals: Boolean = True;
gShowStat: Boolean = True;
+ gShowPIDs: Boolean = False;
gShowKillMsg: Boolean = True;
gShowLives: Boolean = True;
gShowPing: Boolean = False;
stat: TPlayerStatArray;
wad, map: string;
mapstr: string;
+ namestr: string;
begin
s1 := '';
s2 := '';
gg := g;
bb := b;
end;
+ if gShowPIDs then
+ namestr := Format('[%5d] %s', [UID, Name])
+ else
+ namestr := Name;
// Èìÿ
- e_TextureFontPrintEx(x+16, _y, Name, gStdFont, rr, gg, bb, 1);
+ e_TextureFontPrintEx(x+16, _y, namestr, gStdFont, rr, gg, bb, 1);
// Ïèíã/ïîòåðè
e_TextureFontPrintEx(x+w1+16, _y, Format(_lc[I_GAME_PING_MS], [Ping, Loss]), gStdFont, rr, gg, bb, 1);
// Ôðàãè
r := 255;
g := 127;
end;
+ if gShowPIDs then
+ namestr := Format('[%5d] %s', [UID, Name])
+ else
+ namestr := Name;
// Öâåò èãðîêà
e_DrawFillQuad(x+16, _y+4, x+32-1, _y+16+4-1, Color.R, Color.G, Color.B, 0);
e_DrawQuad(x+16, _y+4, x+32-1, _y+16+4-1, 192, 192, 192);
// Èìÿ
- e_TextureFontPrintEx(x+16+16+8, _y+4, Name, gStdFont, r, g, 0, 1);
+ e_TextureFontPrintEx(x+16+16+8, _y+4, namestr, gStdFont, r, g, 0, 1);
// Ïèíã/ïîòåðè
e_TextureFontPrintEx(x+w1+16, _y+4, Format(_lc[I_GAME_PING_MS], [Ping, Loss]), gStdFont, r, g, 0, 1);
// Ôðàãè
MC_SEND_CheatRequest(NET_CHEAT_READY);
end;
+procedure g_Game_PreUpdate();
+begin
+ // these are in separate PreUpdate functions because they can interact during Update()
+ // and are synced over the net
+ // we don't care that much about corpses and gibs
+ g_Player_PreUpdate();
+ g_Monsters_PreUpdate();
+ g_Items_PreUpdate();
+ g_Weapon_PreUpdate();
+end;
+
procedure g_Game_Update();
var
Msg: g_gui.TMessage;
end;
end;
- // these are in separate PreUpdate functions because they can interact during Update()
- // we don't care that much about corpses and gibs
- g_Player_PreUpdate();
- g_Monsters_PreUpdate();
- g_Items_PreUpdate();
- g_Weapon_PreUpdate();
-
// Îáíîâëÿåì âñå îñòàëüíîå:
g_Map_Update();
g_Items_Update();
e_WriteLog(Format(_lc[I_FATAL_ERROR], [Text]), TMsgType.Warning);
gExit := EXIT_SIMPLE;
+ if gGameOn then EndGame;
end;
procedure g_SimpleError(Text: String);
end else
g_Console_Add(_lc[I_MSG_SERVERONLY]);
end
+ else if cmd = 'kick_pid' then
+ begin
+ if g_Game_IsServer and g_Game_IsNet then
+ begin
+ if Length(P) < 2 then
+ begin
+ g_Console_Add('kick_pid <player ID>');
+ Exit;
+ end;
+ if P[1] = '' then
+ begin
+ g_Console_Add('kick_pid <player ID>');
+ Exit;
+ end;
+
+ a := StrToIntDef(P[1], 0);
+ pl := g_Net_Client_ByPlayer(a);
+ if (pl <> nil) and pl^.Used and (pl^.Peer <> nil) then
+ begin
+ s := g_Net_ClientName_ByID(pl^.ID);
+ enet_peer_disconnect(pl^.Peer, NET_DISC_KICK);
+ g_Console_Add(Format(_lc[I_PLAYER_KICK], [s]));
+ MH_SEND_GameEvent(NET_EV_PLAYER_KICK, 0, s);
+ g_Net_Slist_ServerPlayerLeaves();
+ end;
+ end else
+ g_Console_Add(_lc[I_MSG_SERVERONLY]);
+ end
else if cmd = 'ban' then
begin
if g_Game_IsServer and g_Game_IsNet then
end else
g_Console_Add(_lc[I_MSG_SERVERONLY]);
end
+ else if cmd = 'ban_pid' then
+ begin
+ if g_Game_IsServer and g_Game_IsNet then
+ begin
+ if Length(P) < 2 then
+ begin
+ g_Console_Add('ban_pid <player ID>');
+ Exit;
+ end;
+ if P[1] = '' then
+ begin
+ g_Console_Add('ban_pid <player ID>');
+ Exit;
+ end;
+
+ a := StrToIntDef(P[1], 0);
+ pl := g_Net_Client_ByPlayer(a);
+ if (pl <> nil) and pl^.Used and (pl^.Peer <> nil) then
+ begin
+ s := g_Net_ClientName_ByID(pl^.ID);
+ g_Net_BanHost(pl^.Peer^.address.host, False);
+ enet_peer_disconnect(pl^.Peer, NET_DISC_TEMPBAN);
+ g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
+ MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
+ g_Net_Slist_ServerPlayerLeaves();
+ end;
+ end else
+ g_Console_Add(_lc[I_MSG_SERVERONLY]);
+ end
else if cmd = 'permban' then
begin
if g_Game_IsServer and g_Game_IsNet then
end else
g_Console_Add(_lc[I_MSG_SERVERONLY]);
end
+ else if cmd = 'permban_pid' then
+ begin
+ if g_Game_IsServer and g_Game_IsNet then
+ begin
+ if Length(P) < 2 then
+ begin
+ g_Console_Add('permban_pid <player ID>');
+ Exit;
+ end;
+ if P[1] = '' then
+ begin
+ g_Console_Add('permban_pid <player ID>');
+ Exit;
+ end;
+
+ a := StrToIntDef(P[1], 0);
+ pl := g_Net_Client_ByPlayer(a);
+ if (pl <> nil) and pl^.Used and (pl^.Peer <> nil) then
+ begin
+ s := g_Net_ClientName_ByID(pl^.ID);
+ g_Net_BanHost(pl^.Peer^.address.host);
+ enet_peer_disconnect(pl^.Peer, NET_DISC_BAN);
+ g_Net_SaveBanList();
+ g_Console_Add(Format(_lc[I_PLAYER_BAN], [s]));
+ MH_SEND_GameEvent(NET_EV_PLAYER_BAN, 0, s);
+ g_Net_Slist_ServerPlayerLeaves();
+ end;
+ end else
+ g_Console_Add(_lc[I_MSG_SERVERONLY]);
+ end
+ else if cmd = 'permban_ip' then
+ begin
+ if g_Game_IsServer and g_Game_IsNet then
+ begin
+ if Length(P) < 2 then
+ begin
+ g_Console_Add('permban_ip <IP address>');
+ Exit;
+ end;
+ if P[1] = '' then
+ begin
+ g_Console_Add('permban_ip <IP address>');
+ Exit;
+ end;
+
+ g_Net_BanHost(P[1]);
+ g_Net_SaveBanList();
+ g_Console_Add(Format(_lc[I_PLAYER_BAN], [P[1]]));
+ end else
+ g_Console_Add(_lc[I_MSG_SERVERONLY]);
+ end
else if cmd = 'unban' then
begin
if g_Game_IsServer and g_Game_IsNet then
g_Game_Free();
with gGameSettings do
begin
+ Options := gsGameFlags;
GameMode := g_Game_TextToMode(gsGameMode);
if gSwitchGameMode <> GM_NONE then
GameMode := gSwitchGameMode;
g_Game_Free();
with gGameSettings do
begin
+ Options := gsGameFlags;
GameMode := g_Game_TextToMode(gsGameMode);
if gSwitchGameMode <> GM_NONE then GameMode := gSwitchGameMode;
if GameMode = GM_NONE then GameMode := GM_DM;
case gAnnouncer of
ANNOUNCE_NONE:
Exit;
- ANNOUNCE_ME,
- ANNOUNCE_MEPLUS:
+ ANNOUNCE_ME:
if not g_Game_IsWatchedPlayer(SpawnerUID) then
Exit;
end;
// Options:
s := Find_Param_Value(pars, '-opt');
if (s = '') then
- Opt := GAME_OPTION_ALLOWEXIT or GAME_OPTION_BOTVSPLAYER or
- GAME_OPTION_BOTVSMONSTER or GAME_OPTION_DMKEYS
+ Opt := gsGameFlags
else
Opt := StrToIntDef(s, 0);
conRegVar('r_showlives', @gShowLives, 'show lives', 'show lives');
conRegVar('r_showspect', @gSpectHUD, 'show spectator hud', 'show spectator hud');
conRegVar('r_showstat', @gShowStat, 'show stats', 'show stats');
+ conRegVar('r_showpids', @gShowPIDs, 'show PIDs', 'show PIDs');
end.