- the server log view is not cleared when saving the log (but old messages are removed when going over the max number of lines)
- log can be viewed in the server lobby, not just in-game - logging pump, reactor & battery state usage - GUIListBox.MouseRect doesn't return an empty rect anymore -> listboxes without selectable content can be scrolled with the mouse wheel
This commit is contained in:
@@ -271,7 +271,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return Rectangle.Empty;
|
return rect;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ namespace Barotrauma.Items.Components
|
|||||||
if (GameMain.Server != null)
|
if (GameMain.Server != null)
|
||||||
{
|
{
|
||||||
item.CreateServerEvent(this);
|
item.CreateServerEvent(this);
|
||||||
|
GameServer.Log(Character.Controlled + (IsActive ? " turned on " : " turned off ") + item.Name, Color.Orange);
|
||||||
}
|
}
|
||||||
else if (GameMain.Client != null)
|
else if (GameMain.Client != null)
|
||||||
{
|
{
|
||||||
@@ -95,6 +96,7 @@ namespace Barotrauma.Items.Components
|
|||||||
if (GameMain.Server != null)
|
if (GameMain.Server != null)
|
||||||
{
|
{
|
||||||
item.CreateServerEvent(this);
|
item.CreateServerEvent(this);
|
||||||
|
GameServer.Log(Character.Controlled + " set the pumping speed of " + item.Name + " to " + (int)(flowPercentage) + " %", Color.Orange);
|
||||||
}
|
}
|
||||||
else if (GameMain.Client != null)
|
else if (GameMain.Client != null)
|
||||||
{
|
{
|
||||||
@@ -113,6 +115,7 @@ namespace Barotrauma.Items.Components
|
|||||||
if (GameMain.Server != null)
|
if (GameMain.Server != null)
|
||||||
{
|
{
|
||||||
item.CreateServerEvent(this);
|
item.CreateServerEvent(this);
|
||||||
|
GameServer.Log(Character.Controlled + " set the pumping speed of " + item.Name + " to " + (int)(flowPercentage) + " %", Color.Orange);
|
||||||
}
|
}
|
||||||
else if (GameMain.Client != null)
|
else if (GameMain.Client != null)
|
||||||
{
|
{
|
||||||
@@ -239,14 +242,24 @@ namespace Barotrauma.Items.Components
|
|||||||
|
|
||||||
public void ServerRead(ClientNetObject type, Lidgren.Network.NetBuffer msg, Client c)
|
public void ServerRead(ClientNetObject type, Lidgren.Network.NetBuffer msg, Client c)
|
||||||
{
|
{
|
||||||
float flowPercentage = msg.ReadRangedInteger(-10, 10) * 10.0f;
|
float newFlowPercentage = msg.ReadRangedInteger(-10, 10) * 10.0f;
|
||||||
bool isActive = msg.ReadBoolean();
|
bool newIsActive = msg.ReadBoolean();
|
||||||
|
|
||||||
if (!item.CanClientAccess(c)) return;
|
if (item.CanClientAccess(c))
|
||||||
|
{
|
||||||
FlowPercentage = flowPercentage;
|
if (newFlowPercentage != FlowPercentage)
|
||||||
IsActive = isActive;
|
{
|
||||||
|
GameServer.Log(c.Character + " set the pumping speed of " + item.Name + " to " + (int)(newFlowPercentage) + " %", Color.Orange);
|
||||||
|
}
|
||||||
|
if (newIsActive != IsActive)
|
||||||
|
{
|
||||||
|
GameServer.Log(c.Character + (newIsActive ? " turned on " : " turned off ") + item.Name, Color.Orange);
|
||||||
|
}
|
||||||
|
|
||||||
|
FlowPercentage = newFlowPercentage;
|
||||||
|
IsActive = newIsActive;
|
||||||
|
}
|
||||||
|
|
||||||
//notify all clients of the changed state
|
//notify all clients of the changed state
|
||||||
item.CreateServerEvent(this);
|
item.CreateServerEvent(this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,6 +55,10 @@ namespace Barotrauma.Items.Components
|
|||||||
private bool unsentChanges;
|
private bool unsentChanges;
|
||||||
private float sendUpdateTimer;
|
private float sendUpdateTimer;
|
||||||
|
|
||||||
|
private Character lastUser;
|
||||||
|
private float? nextServerLogWriteTime;
|
||||||
|
private float lastServerLogWriteTime;
|
||||||
|
|
||||||
[Editable, HasDefaultValue(9500.0f, true)]
|
[Editable, HasDefaultValue(9500.0f, true)]
|
||||||
public float MeltDownTemp
|
public float MeltDownTemp
|
||||||
{
|
{
|
||||||
@@ -162,6 +166,11 @@ namespace Barotrauma.Items.Components
|
|||||||
var button = new GUIButton(new Rectangle(410, 70, 40, 40), "-", "", GuiFrame);
|
var button = new GUIButton(new Rectangle(410, 70, 40, 40), "-", "", GuiFrame);
|
||||||
button.OnPressed = () =>
|
button.OnPressed = () =>
|
||||||
{
|
{
|
||||||
|
lastUser = Character.Controlled;
|
||||||
|
if (nextServerLogWriteTime == null)
|
||||||
|
{
|
||||||
|
nextServerLogWriteTime = Math.Max(lastServerLogWriteTime + 1.0f, (float)Timing.TotalTime);
|
||||||
|
}
|
||||||
unsentChanges = true;
|
unsentChanges = true;
|
||||||
ShutDownTemp -= 100.0f;
|
ShutDownTemp -= 100.0f;
|
||||||
|
|
||||||
@@ -171,6 +180,11 @@ namespace Barotrauma.Items.Components
|
|||||||
button = new GUIButton(new Rectangle(460, 70, 40,40), "+", "", GuiFrame);
|
button = new GUIButton(new Rectangle(460, 70, 40,40), "+", "", GuiFrame);
|
||||||
button.OnPressed = () =>
|
button.OnPressed = () =>
|
||||||
{
|
{
|
||||||
|
lastUser = Character.Controlled;
|
||||||
|
if (nextServerLogWriteTime == null)
|
||||||
|
{
|
||||||
|
nextServerLogWriteTime = Math.Max(lastServerLogWriteTime + 1.0f, (float)Timing.TotalTime);
|
||||||
|
}
|
||||||
unsentChanges = true;
|
unsentChanges = true;
|
||||||
ShutDownTemp += 100.0f;
|
ShutDownTemp += 100.0f;
|
||||||
|
|
||||||
@@ -183,6 +197,11 @@ namespace Barotrauma.Items.Components
|
|||||||
button = new GUIButton(new Rectangle(210, 290, 40, 40), "+", "", GuiFrame);
|
button = new GUIButton(new Rectangle(210, 290, 40, 40), "+", "", GuiFrame);
|
||||||
button.OnPressed = () =>
|
button.OnPressed = () =>
|
||||||
{
|
{
|
||||||
|
lastUser = Character.Controlled;
|
||||||
|
if (nextServerLogWriteTime == null)
|
||||||
|
{
|
||||||
|
nextServerLogWriteTime = Math.Max(lastServerLogWriteTime + 1.0f, (float)Timing.TotalTime);
|
||||||
|
}
|
||||||
unsentChanges = true;
|
unsentChanges = true;
|
||||||
FissionRate += 1.0f;
|
FissionRate += 1.0f;
|
||||||
|
|
||||||
@@ -192,6 +211,11 @@ namespace Barotrauma.Items.Components
|
|||||||
button = new GUIButton(new Rectangle(210, 340, 40, 40), "-", "", GuiFrame);
|
button = new GUIButton(new Rectangle(210, 340, 40, 40), "-", "", GuiFrame);
|
||||||
button.OnPressed = () =>
|
button.OnPressed = () =>
|
||||||
{
|
{
|
||||||
|
lastUser = Character.Controlled;
|
||||||
|
if (nextServerLogWriteTime == null)
|
||||||
|
{
|
||||||
|
nextServerLogWriteTime = Math.Max(lastServerLogWriteTime + 1.0f, (float)Timing.TotalTime);
|
||||||
|
}
|
||||||
unsentChanges = true;
|
unsentChanges = true;
|
||||||
FissionRate -= 1.0f;
|
FissionRate -= 1.0f;
|
||||||
|
|
||||||
@@ -201,6 +225,11 @@ namespace Barotrauma.Items.Components
|
|||||||
button = new GUIButton(new Rectangle(500, 290, 40, 40), "+", "", GuiFrame);
|
button = new GUIButton(new Rectangle(500, 290, 40, 40), "+", "", GuiFrame);
|
||||||
button.OnPressed = () =>
|
button.OnPressed = () =>
|
||||||
{
|
{
|
||||||
|
lastUser = Character.Controlled;
|
||||||
|
if (nextServerLogWriteTime == null)
|
||||||
|
{
|
||||||
|
nextServerLogWriteTime = Math.Max(lastServerLogWriteTime + 1.0f, (float)Timing.TotalTime);
|
||||||
|
}
|
||||||
unsentChanges = true;
|
unsentChanges = true;
|
||||||
CoolingRate += 1.0f;
|
CoolingRate += 1.0f;
|
||||||
|
|
||||||
@@ -210,6 +239,11 @@ namespace Barotrauma.Items.Components
|
|||||||
button = new GUIButton(new Rectangle(500, 340, 40, 40), "-", "", GuiFrame);
|
button = new GUIButton(new Rectangle(500, 340, 40, 40), "-", "", GuiFrame);
|
||||||
button.OnPressed = () =>
|
button.OnPressed = () =>
|
||||||
{
|
{
|
||||||
|
lastUser = Character.Controlled;
|
||||||
|
if (nextServerLogWriteTime == null)
|
||||||
|
{
|
||||||
|
nextServerLogWriteTime = Math.Max(lastServerLogWriteTime + 1.0f, (float)Timing.TotalTime);
|
||||||
|
}
|
||||||
unsentChanges = true;
|
unsentChanges = true;
|
||||||
CoolingRate -= 1.0f;
|
CoolingRate -= 1.0f;
|
||||||
|
|
||||||
@@ -219,6 +253,23 @@ namespace Barotrauma.Items.Components
|
|||||||
|
|
||||||
public override void Update(float deltaTime, Camera cam)
|
public override void Update(float deltaTime, Camera cam)
|
||||||
{
|
{
|
||||||
|
if (GameMain.Server != null && nextServerLogWriteTime != null)
|
||||||
|
{
|
||||||
|
if (Timing.TotalTime >= (float)nextServerLogWriteTime)
|
||||||
|
{
|
||||||
|
GameServer.Log(lastUser + " adjusted reactor settings: " +
|
||||||
|
"Temperature: " + (int)temperature +
|
||||||
|
", Fission rate: " + (int)fissionRate +
|
||||||
|
", Cooling rate: " + (int)coolingRate +
|
||||||
|
", Cooling rate: " + coolingRate +
|
||||||
|
", Shutdown temp: " + shutDownTemp,
|
||||||
|
Color.Orange);
|
||||||
|
|
||||||
|
nextServerLogWriteTime = null;
|
||||||
|
lastServerLogWriteTime = (float)Timing.TotalTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ApplyStatusEffects(ActionType.OnActive, deltaTime, null);
|
ApplyStatusEffects(ActionType.OnActive, deltaTime, null);
|
||||||
|
|
||||||
fissionRate = Math.Min(fissionRate, AvailableFuel);
|
fissionRate = Math.Min(fissionRate, AvailableFuel);
|
||||||
@@ -572,6 +623,12 @@ namespace Barotrauma.Items.Components
|
|||||||
CoolingRate = coolingRate;
|
CoolingRate = coolingRate;
|
||||||
FissionRate = fissionRate;
|
FissionRate = fissionRate;
|
||||||
|
|
||||||
|
lastUser = c.Character;
|
||||||
|
if (nextServerLogWriteTime == null)
|
||||||
|
{
|
||||||
|
nextServerLogWriteTime = Math.Max(lastServerLogWriteTime + 1.0f, (float)Timing.TotalTime);
|
||||||
|
}
|
||||||
|
|
||||||
//need to create a server event to notify all clients of the changed state
|
//need to create a server event to notify all clients of the changed state
|
||||||
unsentChanges = true;
|
unsentChanges = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ namespace Barotrauma.Items.Components
|
|||||||
if (GameMain.Server != null)
|
if (GameMain.Server != null)
|
||||||
{
|
{
|
||||||
item.CreateServerEvent(this);
|
item.CreateServerEvent(this);
|
||||||
|
GameServer.Log(Character.Controlled + " set the recharge speed of " + item.Name + " to " + (int)((rechargeSpeed / maxRechargeSpeed) * 100.0f) + " %", Color.Orange);
|
||||||
}
|
}
|
||||||
else if (GameMain.Client != null)
|
else if (GameMain.Client != null)
|
||||||
{
|
{
|
||||||
@@ -120,6 +121,7 @@ namespace Barotrauma.Items.Components
|
|||||||
if (GameMain.Server != null)
|
if (GameMain.Server != null)
|
||||||
{
|
{
|
||||||
item.CreateServerEvent(this);
|
item.CreateServerEvent(this);
|
||||||
|
GameServer.Log(Character.Controlled + " set the recharge speed of " + item.Name + " to " + (int)((rechargeSpeed / maxRechargeSpeed) * 100.0f) + " %", Color.Orange);
|
||||||
}
|
}
|
||||||
else if (GameMain.Client != null)
|
else if (GameMain.Client != null)
|
||||||
{
|
{
|
||||||
@@ -287,6 +289,7 @@ namespace Barotrauma.Items.Components
|
|||||||
if (item.CanClientAccess(c))
|
if (item.CanClientAccess(c))
|
||||||
{
|
{
|
||||||
RechargeSpeed = newRechargeSpeed;
|
RechargeSpeed = newRechargeSpeed;
|
||||||
|
GameServer.Log(c.Character + " set the recharge speed of "+item.Name+" to "+ (int)((rechargeSpeed / maxRechargeSpeed) * 100.0f) + " %", Color.Orange);
|
||||||
}
|
}
|
||||||
|
|
||||||
item.CreateServerEvent(this);
|
item.CreateServerEvent(this);
|
||||||
|
|||||||
@@ -65,6 +65,11 @@ namespace Barotrauma.Networking
|
|||||||
get { return entityEventManager; }
|
get { return entityEventManager; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ServerLog ServerLog
|
||||||
|
{
|
||||||
|
get { return log; }
|
||||||
|
}
|
||||||
|
|
||||||
public TimeSpan UpdateInterval
|
public TimeSpan UpdateInterval
|
||||||
{
|
{
|
||||||
get { return updateInterval; }
|
get { return updateInterval; }
|
||||||
@@ -194,7 +199,7 @@ namespace Barotrauma.Networking
|
|||||||
GameMain.NetworkMember = null;
|
GameMain.NetworkMember = null;
|
||||||
yield return CoroutineStatus.Success;
|
yield return CoroutineStatus.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.EnableUPnP)
|
if (config.EnableUPnP)
|
||||||
{
|
{
|
||||||
server.UPnP.ForwardPort(config.Port, "barotrauma");
|
server.UPnP.ForwardPort(config.Port, "barotrauma");
|
||||||
@@ -228,7 +233,7 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
updateInterval = new TimeSpan(0, 0, 0, 0, 150);
|
updateInterval = new TimeSpan(0, 0, 0, 0, 150);
|
||||||
|
|
||||||
DebugConsole.NewMessage("Server started", Color.Green);
|
Log("Server started", Color.Cyan);
|
||||||
|
|
||||||
GameMain.NetLobbyScreen.Select();
|
GameMain.NetLobbyScreen.Select();
|
||||||
started = true;
|
started = true;
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
private readonly Queue<ColoredText> lines;
|
private readonly Queue<ColoredText> lines;
|
||||||
|
|
||||||
|
private int unsavedLineCount;
|
||||||
|
|
||||||
public int LinesPerFile
|
public int LinesPerFile
|
||||||
{
|
{
|
||||||
get { return linesPerFile; }
|
get { return linesPerFile; }
|
||||||
@@ -38,7 +40,7 @@ namespace Barotrauma.Networking
|
|||||||
string logLine = "[" + DateTime.Now.ToLongTimeString() + "] " + line;
|
string logLine = "[" + DateTime.Now.ToLongTimeString() + "] " + line;
|
||||||
|
|
||||||
var newText = new ColoredText(logLine, color == null ? Color.White : (Color)color);
|
var newText = new ColoredText(logLine, color == null ? Color.White : (Color)color);
|
||||||
|
|
||||||
lines.Enqueue(newText);
|
lines.Enqueue(newText);
|
||||||
|
|
||||||
if (LogFrame != null)
|
if (LogFrame != null)
|
||||||
@@ -47,11 +49,19 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
listBox.UpdateScrollBarSize();
|
listBox.UpdateScrollBarSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsavedLineCount++;
|
||||||
|
|
||||||
if (lines.Count >= LinesPerFile)
|
if (unsavedLineCount >= LinesPerFile)
|
||||||
{
|
{
|
||||||
Save();
|
Save();
|
||||||
lines.Clear();
|
unsavedLineCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (lines.Count > LinesPerFile)
|
||||||
|
{
|
||||||
|
listBox.RemoveChild(listBox.children[0]);
|
||||||
|
lines.Dequeue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,10 +69,10 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
LogFrame = new GUIFrame(new Rectangle(0, 0, GameMain.GraphicsWidth, GameMain.GraphicsHeight), Color.Black * 0.5f);
|
LogFrame = new GUIFrame(new Rectangle(0, 0, GameMain.GraphicsWidth, GameMain.GraphicsHeight), Color.Black * 0.5f);
|
||||||
|
|
||||||
GUIFrame innerFrame = new GUIFrame(new Rectangle(0, 0, 500, 400), null, Alignment.Center, "", LogFrame);
|
GUIFrame innerFrame = new GUIFrame(new Rectangle(0, 0, 500, 420), null, Alignment.Center, "", LogFrame);
|
||||||
innerFrame.Padding = new Vector4(10.0f, 20.0f, 10.0f, 20.0f);
|
innerFrame.Padding = new Vector4(10.0f, 20.0f, 10.0f, 20.0f);
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(-200, 0, 100, 15), "Filter", "", Alignment.TopRight, Alignment.TopRight, innerFrame, false, GUI.SmallFont);
|
new GUITextBlock(new Rectangle(-200, 0, 100, 15), "Filter", "", Alignment.TopRight, Alignment.CenterRight, innerFrame, false, GUI.SmallFont);
|
||||||
|
|
||||||
GUITextBox searchBox = new GUITextBox(new Rectangle(-20, 0, 180, 15), Alignment.TopRight, "", innerFrame);
|
GUITextBox searchBox = new GUITextBox(new Rectangle(-20, 0, 180, 15), Alignment.TopRight, "", innerFrame);
|
||||||
searchBox.Font = GUI.SmallFont;
|
searchBox.Font = GUI.SmallFont;
|
||||||
@@ -73,7 +83,7 @@ namespace Barotrauma.Networking
|
|||||||
clearButton.OnClicked = ClearFilter;
|
clearButton.OnClicked = ClearFilter;
|
||||||
clearButton.UserData = searchBox;
|
clearButton.UserData = searchBox;
|
||||||
|
|
||||||
listBox = new GUIListBox(new Rectangle(0, 30, 0, 310), "", innerFrame);
|
listBox = new GUIListBox(new Rectangle(0, 30, 0, 320), "", innerFrame);
|
||||||
|
|
||||||
var currLines = lines.ToList();
|
var currLines = lines.ToList();
|
||||||
|
|
||||||
@@ -84,9 +94,9 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
listBox.UpdateScrollBarSize();
|
listBox.UpdateScrollBarSize();
|
||||||
|
|
||||||
if (listBox.BarScroll==0.0f || listBox.BarScroll==1.0f) listBox.BarScroll = 1.0f;
|
if (listBox.BarScroll == 0.0f || listBox.BarScroll == 1.0f) listBox.BarScroll = 1.0f;
|
||||||
|
|
||||||
GUIButton closeButton = new GUIButton(new Rectangle(0,0,100, 15), "Close", Alignment.BottomRight, "", innerFrame);
|
GUIButton closeButton = new GUIButton(new Rectangle(-100, 10, 100, 15), "Close", Alignment.BottomRight, "", innerFrame);
|
||||||
closeButton.OnClicked = (GUIButton button, object userData) =>
|
closeButton.OnClicked = (GUIButton button, object userData) =>
|
||||||
{
|
{
|
||||||
LogFrame = null;
|
LogFrame = null;
|
||||||
@@ -173,8 +183,6 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
DebugConsole.ThrowError("Saving the server log to " + filePath + " failed", e);
|
DebugConsole.ThrowError("Saving the server log to " + filePath + " failed", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
lines.Clear();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -341,7 +341,22 @@ namespace Barotrauma
|
|||||||
serverMessage = new GUITextBox(new Rectangle(0, 30, 360, 70), null, null, Alignment.TopLeft, Alignment.TopLeft, "", infoFrame);
|
serverMessage = new GUITextBox(new Rectangle(0, 30, 360, 70), null, null, Alignment.TopLeft, Alignment.TopLeft, "", infoFrame);
|
||||||
serverMessage.Wrap = true;
|
serverMessage.Wrap = true;
|
||||||
serverMessage.OnTextChanged = UpdateServerMessage;
|
serverMessage.OnTextChanged = UpdateServerMessage;
|
||||||
|
|
||||||
|
var showLogButton = new GUIButton(new Rectangle(0, 0, 100, 20), "Server Log", Alignment.TopRight, "", infoFrame);
|
||||||
|
showLogButton.UserData = "showlog";
|
||||||
|
showLogButton.OnClicked = (GUIButton button, object userData) =>
|
||||||
|
{
|
||||||
|
if (GameMain.Server.ServerLog.LogFrame == null)
|
||||||
|
{
|
||||||
|
GameMain.Server.ServerLog.CreateLogFrame();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GameMain.Server.ServerLog.LogFrame = null;
|
||||||
|
GUIComponent.KeyboardDispatcher.Subscriber = null;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Deselect()
|
public override void Deselect()
|
||||||
@@ -383,6 +398,8 @@ namespace Barotrauma
|
|||||||
infoFrame.RemoveChild(infoFrame.children.Find(c => c.UserData as string == "settingsButton"));
|
infoFrame.RemoveChild(infoFrame.children.Find(c => c.UserData as string == "settingsButton"));
|
||||||
infoFrame.RemoveChild(infoFrame.children.Find(c => c.UserData as string == "spectateButton"));
|
infoFrame.RemoveChild(infoFrame.children.Find(c => c.UserData as string == "spectateButton"));
|
||||||
|
|
||||||
|
InfoFrame.FindChild("showlog").Visible = GameMain.Server != null;
|
||||||
|
|
||||||
//playerList.Parent.RemoveChild(playerList.Parent.children.Find(c => c.UserData as string == "banListButton"));
|
//playerList.Parent.RemoveChild(playerList.Parent.children.Find(c => c.UserData as string == "banListButton"));
|
||||||
|
|
||||||
if (IsServer && GameMain.Server != null)
|
if (IsServer && GameMain.Server != null)
|
||||||
|
|||||||
Reference in New Issue
Block a user