Revert "what the fuck"
This reverts commit16e90bea61. Revert "fix merge conflicts, warning: still broken" This reverts commit1f0f411d4f.
This commit is contained in:
@@ -27,16 +27,7 @@ namespace Barotrauma
|
|||||||
GameServer.Log(GameServer.CharacterLogName(this) + " has died (Cause of death: " + causeOfDeath + ")", ServerLog.MessageType.Attack);
|
GameServer.Log(GameServer.CharacterLogName(this) + " has died (Cause of death: " + causeOfDeath + ")", ServerLog.MessageType.Attack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
GameMain.Lua.hook.Call("characterDeath", new object[] { this,causeOfDeathAffliction });
|
||||||
if (HasAbilityFlag(AbilityFlags.RetainExperienceForNewCharacter))
|
|
||||||
{
|
|
||||||
var ownerClient = GameMain.Server.ConnectedClients.Find(c => c.Character == this);
|
|
||||||
if (ownerClient != null)
|
|
||||||
{
|
|
||||||
(GameMain.GameSession?.GameMode as MultiPlayerCampaign)?.SaveExperiencePoints(ownerClient);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GameMain.Lua.hook.Call("characterDeath", new object[] { this, causeOfDeathAffliction });
|
|
||||||
healthUpdateTimer = 0.0f;
|
healthUpdateTimer = 0.0f;
|
||||||
|
|
||||||
if (CauseOfDeath.Killer != null && CauseOfDeath.Killer.IsTraitor && CauseOfDeath.Killer != this)
|
if (CauseOfDeath.Killer != null && CauseOfDeath.Killer.IsTraitor && CauseOfDeath.Killer != this)
|
||||||
@@ -44,7 +35,10 @@ namespace Barotrauma
|
|||||||
var owner = GameMain.Server.ConnectedClients.Find(c => c.Character == this);
|
var owner = GameMain.Server.ConnectedClients.Find(c => c.Character == this);
|
||||||
if (owner != null)
|
if (owner != null)
|
||||||
{
|
{
|
||||||
GameMain.Server.SendDirectChatMessage(TextManager.FormatServerMessage("KilledByTraitorNotification"), owner, ChatMessageType.ServerMessageBoxInGame);
|
if (!GameMain.Lua.game.overrideTraitors)
|
||||||
|
{
|
||||||
|
GameMain.Server.SendDirectChatMessage(TextManager.FormatServerMessage("KilledByTraitorNotification"), owner, ChatMessageType.ServerMessageBoxInGame);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach (Client client in GameMain.Server.ConnectedClients)
|
foreach (Client client in GameMain.Server.ConnectedClients)
|
||||||
@@ -55,10 +49,5 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
partial void OnMoneyChanged(int prevAmount, int newAmount)
|
|
||||||
{
|
|
||||||
GameMain.NetworkMember.CreateEntityEvent(this, new object[] { NetEntityEvent.Type.UpdateMoney });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ using System.Diagnostics;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
|
using MoonSharp.Interpreter;
|
||||||
|
|
||||||
namespace Barotrauma.Networking
|
namespace Barotrauma.Networking
|
||||||
{
|
{
|
||||||
@@ -196,6 +197,8 @@ namespace Barotrauma.Networking
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GameMain.Lua.Initialize();
|
||||||
|
|
||||||
TickRate = serverSettings.TickRate;
|
TickRate = serverSettings.TickRate;
|
||||||
|
|
||||||
Log("Server started", ServerLog.MessageType.ServerMessage);
|
Log("Server started", ServerLog.MessageType.ServerMessage);
|
||||||
@@ -309,7 +312,10 @@ namespace Barotrauma.Networking
|
|||||||
SendConsoleMessage("Granted all permissions to " + newClient.Name + ".", newClient);
|
SendConsoleMessage("Granted all permissions to " + newClient.Name + ".", newClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
SendChatMessage($"ServerMessage.JoinedServer~[client]={ClientLogName(newClient)}", ChatMessageType.Server, null, changeType: PlayerConnectionChangeType.Joined);
|
GameMain.Lua.hook.Call("clientConnected", new object[] { newClient });
|
||||||
|
|
||||||
|
|
||||||
|
SendChatMessage($"ServerMessage.JoinedServer~[client]={clName}", ChatMessageType.Server, null, changeType: PlayerConnectionChangeType.Joined);
|
||||||
serverSettings.ServerDetailsChanged = true;
|
serverSettings.ServerDetailsChanged = true;
|
||||||
|
|
||||||
if (previousPlayer != null && previousPlayer.Name != newClient.Name)
|
if (previousPlayer != null && previousPlayer.Name != newClient.Name)
|
||||||
@@ -687,7 +693,7 @@ namespace Barotrauma.Networking
|
|||||||
if (Timing.TotalTime > lastPingTime + 1.0)
|
if (Timing.TotalTime > lastPingTime + 1.0)
|
||||||
{
|
{
|
||||||
lastPingData ??= new byte[64];
|
lastPingData ??= new byte[64];
|
||||||
for (int i = 0; i < lastPingData.Length; i++)
|
for (int i=0;i<lastPingData.Length;i++)
|
||||||
{
|
{
|
||||||
lastPingData[i] = (byte)Rand.Range(33, 126);
|
lastPingData[i] = (byte)Rand.Range(33, 126);
|
||||||
}
|
}
|
||||||
@@ -843,6 +849,9 @@ namespace Barotrauma.Networking
|
|||||||
case ClientPacketHeader.ERROR:
|
case ClientPacketHeader.ERROR:
|
||||||
HandleClientError(inc, connectedClient);
|
HandleClientError(inc, connectedClient);
|
||||||
break;
|
break;
|
||||||
|
case ClientPacketHeader.LUA_NET_MESSAGE:
|
||||||
|
GameMain.Lua.networking.NetMessageReceived(inc, connectedClient);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1181,10 +1190,6 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
c.Character.ServerRead(objHeader, inc, c);
|
c.Character.ServerRead(objHeader, inc, c);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
DebugConsole.AddWarning($"Received character inputs from a client who's not controlling a character ({c.Name}).");
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case ClientNetObject.ENTITY_STATE:
|
case ClientNetObject.ENTITY_STATE:
|
||||||
entityEventManager.Read(inc, c);
|
entityEventManager.Read(inc, c);
|
||||||
@@ -1322,7 +1327,7 @@ namespace Barotrauma.Networking
|
|||||||
Log("Client \"" + GameServer.ClientLogName(sender) + "\" ended the round.", ServerLog.MessageType.ServerMessage);
|
Log("Client \"" + GameServer.ClientLogName(sender) + "\" ended the round.", ServerLog.MessageType.ServerMessage);
|
||||||
if (mpCampaign != null && Level.IsLoadedOutpost)
|
if (mpCampaign != null && Level.IsLoadedOutpost)
|
||||||
{
|
{
|
||||||
mpCampaign.SavePlayers();
|
mpCampaign.SaveInventories();
|
||||||
GameMain.GameSession.SubmarineInfo = new SubmarineInfo(GameMain.GameSession.Submarine);
|
GameMain.GameSession.SubmarineInfo = new SubmarineInfo(GameMain.GameSession.Submarine);
|
||||||
SaveUtil.SaveGame(GameMain.GameSession.SavePath);
|
SaveUtil.SaveGame(GameMain.GameSession.SavePath);
|
||||||
}
|
}
|
||||||
@@ -1821,7 +1826,7 @@ namespace Barotrauma.Networking
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ClientWriteLobby(Client c)
|
public void ClientWriteLobby(Client c)
|
||||||
{
|
{
|
||||||
bool isInitialUpdate = false;
|
bool isInitialUpdate = false;
|
||||||
|
|
||||||
@@ -2358,16 +2363,8 @@ namespace Barotrauma.Networking
|
|||||||
characterData.ApplyHealthData(spawnedCharacter);
|
characterData.ApplyHealthData(spawnedCharacter);
|
||||||
characterData.ApplyOrderData(spawnedCharacter);
|
characterData.ApplyOrderData(spawnedCharacter);
|
||||||
spawnedCharacter.GiveIdCardTags(mainSubWaypoints[i]);
|
spawnedCharacter.GiveIdCardTags(mainSubWaypoints[i]);
|
||||||
spawnedCharacter.LoadTalents();
|
|
||||||
|
|
||||||
characterData.HasSpawned = true;
|
characterData.HasSpawned = true;
|
||||||
}
|
}
|
||||||
if (GameMain.GameSession?.GameMode is MultiPlayerCampaign mpCampaign && spawnedCharacter.Info != null)
|
|
||||||
{
|
|
||||||
spawnedCharacter.Info.SetExperience(Math.Max(spawnedCharacter.Info.ExperiencePoints, mpCampaign.GetSavedExperiencePoints(teamClients[i])));
|
|
||||||
mpCampaign.ClearSavedExperiencePoints(teamClients[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
spawnedCharacter.OwnerClientEndPoint = teamClients[i].Connection.EndPointString;
|
spawnedCharacter.OwnerClientEndPoint = teamClients[i].Connection.EndPointString;
|
||||||
spawnedCharacter.OwnerClientName = teamClients[i].Name;
|
spawnedCharacter.OwnerClientName = teamClients[i].Name;
|
||||||
}
|
}
|
||||||
@@ -2378,8 +2375,6 @@ namespace Barotrauma.Networking
|
|||||||
spawnedCharacter.TeamID = teamID;
|
spawnedCharacter.TeamID = teamID;
|
||||||
spawnedCharacter.GiveJobItems(mainSubWaypoints[i]);
|
spawnedCharacter.GiveJobItems(mainSubWaypoints[i]);
|
||||||
spawnedCharacter.GiveIdCardTags(mainSubWaypoints[i]);
|
spawnedCharacter.GiveIdCardTags(mainSubWaypoints[i]);
|
||||||
// talents are only avilable for players in online sessions, but modders or someone else might want to have them loaded anyway
|
|
||||||
spawnedCharacter.LoadTalents();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2419,8 +2414,11 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
if (!(GameMain.GameSession?.GameMode is CampaignMode))
|
if (!(GameMain.GameSession?.GameMode is CampaignMode))
|
||||||
{
|
{
|
||||||
TraitorManager = new TraitorManager();
|
if (!GameMain.Lua.game.overrideTraitors)
|
||||||
TraitorManager.Start(this);
|
{
|
||||||
|
TraitorManager = new TraitorManager();
|
||||||
|
TraitorManager.Start(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2437,6 +2435,7 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
Log("Round started.", ServerLog.MessageType.ServerMessage);
|
Log("Round started.", ServerLog.MessageType.ServerMessage);
|
||||||
|
|
||||||
|
|
||||||
gameStarted = true;
|
gameStarted = true;
|
||||||
initiatedStartGame = false;
|
initiatedStartGame = false;
|
||||||
GameMain.ResetFrameTime();
|
GameMain.ResetFrameTime();
|
||||||
@@ -2445,7 +2444,9 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
roundStartTime = DateTime.Now;
|
roundStartTime = DateTime.Now;
|
||||||
|
|
||||||
startGameCoroutine = null;
|
GameMain.Lua.hook.Call("roundStart", new object[] { });
|
||||||
|
|
||||||
|
|
||||||
yield return CoroutineStatus.Success;
|
yield return CoroutineStatus.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2470,7 +2471,6 @@ namespace Barotrauma.Networking
|
|||||||
msg.Write(serverSettings.AllowRespawn && missionAllowRespawn);
|
msg.Write(serverSettings.AllowRespawn && missionAllowRespawn);
|
||||||
msg.Write(serverSettings.AllowDisguises);
|
msg.Write(serverSettings.AllowDisguises);
|
||||||
msg.Write(serverSettings.AllowRewiring);
|
msg.Write(serverSettings.AllowRewiring);
|
||||||
msg.Write(serverSettings.AllowFriendlyFire);
|
|
||||||
msg.Write(serverSettings.LockAllDefaultWires);
|
msg.Write(serverSettings.LockAllDefaultWires);
|
||||||
msg.Write(serverSettings.AllowRagdollButton);
|
msg.Write(serverSettings.AllowRagdollButton);
|
||||||
msg.Write(serverSettings.UseRespawnShuttle);
|
msg.Write(serverSettings.UseRespawnShuttle);
|
||||||
@@ -2566,6 +2566,9 @@ namespace Barotrauma.Networking
|
|||||||
Log("Ending the round...", ServerLog.MessageType.ServerMessage);
|
Log("Ending the round...", ServerLog.MessageType.ServerMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GameMain.Lua.hook.Call("roundEnd", new object[] { });
|
||||||
|
|
||||||
|
|
||||||
string endMessage = TextManager.FormatServerMessage("RoundSummaryRoundHasEnded");
|
string endMessage = TextManager.FormatServerMessage("RoundSummaryRoundHasEnded");
|
||||||
var traitorResults = TraitorManager?.GetEndResults() ?? new List<TraitorMissionResult>();
|
var traitorResults = TraitorManager?.GetEndResults() ?? new List<TraitorMissionResult>();
|
||||||
|
|
||||||
@@ -2635,8 +2638,8 @@ namespace Barotrauma.Networking
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
entityEventManager.Clear();
|
|
||||||
Submarine.Unload();
|
Submarine.Unload();
|
||||||
|
entityEventManager.Clear();
|
||||||
GameMain.NetLobbyScreen.Select();
|
GameMain.NetLobbyScreen.Select();
|
||||||
Log("Round ended.", ServerLog.MessageType.ServerMessage);
|
Log("Round ended.", ServerLog.MessageType.ServerMessage);
|
||||||
|
|
||||||
@@ -2859,6 +2862,8 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
if (client == null) return;
|
if (client == null) return;
|
||||||
|
|
||||||
|
GameMain.Lua.hook.Call("clientDisconnected", new object[] { client });
|
||||||
|
|
||||||
if (gameStarted && client.Character != null)
|
if (gameStarted && client.Character != null)
|
||||||
{
|
{
|
||||||
client.Character.ClientDisconnected = true;
|
client.Character.ClientDisconnected = true;
|
||||||
@@ -3098,13 +3103,21 @@ namespace Barotrauma.Networking
|
|||||||
senderName = null;
|
senderName = null;
|
||||||
senderCharacter = null;
|
senderCharacter = null;
|
||||||
}
|
}
|
||||||
else if (type == ChatMessageType.Radio)
|
else if (type == ChatMessageType.Radio && !GameMain.Lua.game.overrideSignalRadio)
|
||||||
{
|
{
|
||||||
//send to chat-linked wifi components
|
//send to chat-linked wifi components
|
||||||
Signal s = new Signal(message, sender: senderCharacter, source: senderRadio.Item);
|
Signal s = new Signal(message, sender: senderCharacter, source: senderRadio.Item);
|
||||||
senderRadio.TransmitSignal(s, sentFromChat: true);
|
senderRadio.TransmitSignal(s, sentFromChat: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var hookChatMsg = ChatMessage.Create(senderName, message, (ChatMessageType)type, senderCharacter, senderClient, changeType);
|
||||||
|
|
||||||
|
var should = new LuaResult(GameMain.Lua.hook.Call("modifyChatMessage", new object[] { hookChatMsg, senderRadio }));
|
||||||
|
|
||||||
|
if (should.Bool())
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
//check which clients can receive the message and apply distance effects
|
//check which clients can receive the message and apply distance effects
|
||||||
foreach (Client client in ConnectedClients)
|
foreach (Client client in ConnectedClients)
|
||||||
{
|
{
|
||||||
@@ -3137,6 +3150,7 @@ namespace Barotrauma.Networking
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var chatMsg = ChatMessage.Create(
|
var chatMsg = ChatMessage.Create(
|
||||||
senderName,
|
senderName,
|
||||||
modifiedMessage,
|
modifiedMessage,
|
||||||
@@ -3161,19 +3175,28 @@ namespace Barotrauma.Networking
|
|||||||
public void SendOrderChatMessage(OrderChatMessage message)
|
public void SendOrderChatMessage(OrderChatMessage message)
|
||||||
{
|
{
|
||||||
if (message.Sender == null || message.Sender.SpeechImpediment >= 100.0f) { return; }
|
if (message.Sender == null || message.Sender.SpeechImpediment >= 100.0f) { return; }
|
||||||
|
//ChatMessageType messageType = ChatMessage.CanUseRadio(message.Sender) ? ChatMessageType.Radio : ChatMessageType.Default;
|
||||||
|
|
||||||
//check which clients can receive the message and apply distance effects
|
//check which clients can receive the message and apply distance effects
|
||||||
foreach (Client client in ConnectedClients)
|
foreach (Client client in ConnectedClients)
|
||||||
{
|
{
|
||||||
if (message.Sender != null && client.Character != null && !client.Character.IsDead)
|
string modifiedMessage = message.Text;
|
||||||
|
|
||||||
|
if (message.Sender != null &&
|
||||||
|
client.Character != null && !client.Character.IsDead)
|
||||||
{
|
{
|
||||||
//too far to hear the msg -> don't send
|
//too far to hear the msg -> don't send
|
||||||
if (!client.Character.CanHearCharacter(message.Sender)) { continue; }
|
if (!client.Character.CanHearCharacter(message.Sender)) { continue; }
|
||||||
}
|
}
|
||||||
|
|
||||||
SendDirectChatMessage(new OrderChatMessage(message.Order, message.OrderOption, message.OrderPriority, message.TargetEntity, message.TargetCharacter, message.Sender), client);
|
SendDirectChatMessage(new OrderChatMessage(message.Order, message.OrderOption, message.OrderPriority, message.TargetEntity, message.TargetCharacter, message.Sender), client);
|
||||||
}
|
}
|
||||||
if (!string.IsNullOrWhiteSpace(message.Text))
|
|
||||||
|
string myReceivedMessage = message.Text;
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(myReceivedMessage))
|
||||||
{
|
{
|
||||||
AddChatMessage(new OrderChatMessage(message.Order, message.OrderOption, message.OrderPriority, message.Text, message.TargetEntity, message.TargetCharacter, message.Sender));
|
AddChatMessage(new OrderChatMessage(message.Order, message.OrderOption, message.OrderPriority, myReceivedMessage, message.TargetEntity, message.TargetCharacter, message.Sender));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3469,15 +3492,15 @@ namespace Barotrauma.Networking
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
//gender = Gender.Male;
|
||||||
|
//race = Race.White;
|
||||||
|
//headSpriteId = 0;
|
||||||
DebugConsole.Log("Received invalid characterinfo from \"" + sender.Name + "\"! { " + e.Message + " }");
|
DebugConsole.Log("Received invalid characterinfo from \"" + sender.Name + "\"! { " + e.Message + " }");
|
||||||
}
|
}
|
||||||
int hairIndex = message.ReadByte();
|
int hairIndex = message.ReadByte();
|
||||||
int beardIndex = message.ReadByte();
|
int beardIndex = message.ReadByte();
|
||||||
int moustacheIndex = message.ReadByte();
|
int moustacheIndex = message.ReadByte();
|
||||||
int faceAttachmentIndex = message.ReadByte();
|
int faceAttachmentIndex = message.ReadByte();
|
||||||
Color skinColor = message.ReadColorR8G8B8();
|
|
||||||
Color hairColor = message.ReadColorR8G8B8();
|
|
||||||
Color facialHairColor = message.ReadColorR8G8B8();
|
|
||||||
|
|
||||||
List<Pair<JobPrefab, int>> jobPreferences = new List<Pair<JobPrefab, int>>();
|
List<Pair<JobPrefab, int>> jobPreferences = new List<Pair<JobPrefab, int>>();
|
||||||
int count = message.ReadByte();
|
int count = message.ReadByte();
|
||||||
@@ -3494,9 +3517,6 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
sender.CharacterInfo = new CharacterInfo(CharacterPrefab.HumanSpeciesName, sender.Name);
|
sender.CharacterInfo = new CharacterInfo(CharacterPrefab.HumanSpeciesName, sender.Name);
|
||||||
sender.CharacterInfo.RecreateHead(headSpriteId, race, gender, hairIndex, beardIndex, moustacheIndex, faceAttachmentIndex);
|
sender.CharacterInfo.RecreateHead(headSpriteId, race, gender, hairIndex, beardIndex, moustacheIndex, faceAttachmentIndex);
|
||||||
sender.CharacterInfo.SkinColor = skinColor;
|
|
||||||
sender.CharacterInfo.HairColor = hairColor;
|
|
||||||
sender.CharacterInfo.FacialHairColor = facialHairColor;
|
|
||||||
|
|
||||||
if (jobPreferences.Count > 0)
|
if (jobPreferences.Count > 0)
|
||||||
{
|
{
|
||||||
@@ -3796,15 +3816,15 @@ namespace Barotrauma.Networking
|
|||||||
return preferredClient;
|
return preferredClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateMissionState(Mission mission)
|
public void UpdateMissionState(Mission mission, int state)
|
||||||
{
|
{
|
||||||
foreach (var client in connectedClients)
|
foreach (var client in connectedClients)
|
||||||
{
|
{
|
||||||
IWriteMessage msg = new WriteOnlyMessage();
|
IWriteMessage msg = new WriteOnlyMessage();
|
||||||
msg.Write((byte)ServerPacketHeader.MISSION);
|
msg.Write((byte)ServerPacketHeader.MISSION);
|
||||||
int missionIndex = GameMain.GameSession.GetMissionIndex(mission);
|
int missionIndex = GameMain.GameSession.GetMissionIndex(mission);
|
||||||
msg.Write((byte)(missionIndex == -1 ? 255 : missionIndex));
|
msg.Write((byte)(missionIndex == -1 ? 255: missionIndex));
|
||||||
mission?.ServerWrite(msg);
|
msg.Write((ushort)state);
|
||||||
serverPeer.Send(msg, client.Connection, DeliveryMethod.Reliable);
|
serverPeer.Send(msg, client.Connection, DeliveryMethod.Reliable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3820,6 +3840,9 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
if (GameMain.Server == null || !GameMain.Server.ServerSettings.SaveServerLogs) { return; }
|
if (GameMain.Server == null || !GameMain.Server.ServerSettings.SaveServerLogs) { return; }
|
||||||
|
|
||||||
|
if(GameMain.Lua.hook != null)
|
||||||
|
GameMain.Lua.hook.Call("serverLog", new object[] { line, messageType });
|
||||||
|
|
||||||
GameMain.Server.ServerSettings.ServerLog.WriteLine(line, messageType);
|
GameMain.Server.ServerSettings.ServerLog.WriteLine(line, messageType);
|
||||||
|
|
||||||
foreach (Client client in GameMain.Server.ConnectedClients)
|
foreach (Client client in GameMain.Server.ConnectedClients)
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
<Item file="Content/Items/Electricity/signalitems.xml" />
|
<Item file="Content/Items/Electricity/signalitems.xml" />
|
||||||
<Item file="Content/Items/Engine/engine.xml" />
|
<Item file="Content/Items/Engine/engine.xml" />
|
||||||
<Item file="Content/Items/Fabricators/fabricators.xml" />
|
<Item file="Content/Items/Fabricators/fabricators.xml" />
|
||||||
<Item file="Content/Items/Genetic/genetic.xml" />
|
|
||||||
<Item file="Content/Items/Labels/labels.xml" />
|
<Item file="Content/Items/Labels/labels.xml" />
|
||||||
<Item file="Content/Items/Ladder/ladder.xml" />
|
<Item file="Content/Items/Ladder/ladder.xml" />
|
||||||
<Item file="Content/Items/Materials/materials.xml" />
|
<Item file="Content/Items/Materials/materials.xml" />
|
||||||
@@ -64,12 +63,6 @@
|
|||||||
<Item file="Content/Items/Gardening/gardeningtools.xml" />
|
<Item file="Content/Items/Gardening/gardeningtools.xml" />
|
||||||
<Item file="Content/Items/Gardening/plantproducts.xml" />
|
<Item file="Content/Items/Gardening/plantproducts.xml" />
|
||||||
<Item file="Content/Map/Pirates/PirateItems.xml" />
|
<Item file="Content/Map/Pirates/PirateItems.xml" />
|
||||||
<Item file="Content/Items/Jobgear/Assistant/assistant_talent_items.xml" />
|
|
||||||
<Item file="Content/Items/Jobgear/Mechanic/mechanic_talent_items.xml" />
|
|
||||||
<Item file="Content/Items/Jobgear/Security/securityofficer_talent_items.xml" />
|
|
||||||
<Item file="Content/Items/Jobgear/Engineer/engineer_talent_items.xml" />
|
|
||||||
<Item file="Content/Items/Jobgear/Medic/medic_talent_items.xml" />
|
|
||||||
<Item file="Content/Items/Jobgear/Captain/captain_talent_items.xml" />
|
|
||||||
<Character file="Content/Characters/Balloon/Balloon.xml" />
|
<Character file="Content/Characters/Balloon/Balloon.xml" />
|
||||||
<Character file="Content/Characters/Carrier/Carrier.xml" />
|
<Character file="Content/Characters/Carrier/Carrier.xml" />
|
||||||
<Character file="Content/Characters/Charybdis/Charybdis.xml" />
|
<Character file="Content/Characters/Charybdis/Charybdis.xml" />
|
||||||
@@ -80,7 +73,6 @@
|
|||||||
<Character file="Content/Characters/Endworm/Endworm.xml" />
|
<Character file="Content/Characters/Endworm/Endworm.xml" />
|
||||||
<Character file="Content/Characters/Fractalguardian/Fractalguardian.xml" />
|
<Character file="Content/Characters/Fractalguardian/Fractalguardian.xml" />
|
||||||
<Character file="Content/Characters/Fractalguardian2/Fractalguardian2.xml" />
|
<Character file="Content/Characters/Fractalguardian2/Fractalguardian2.xml" />
|
||||||
<Character file="Content/Characters/Swarmfeeder/Swarmfeeder.xml" />
|
|
||||||
<Character file="Content/Characters/Hammerhead/Hammerhead.xml" />
|
<Character file="Content/Characters/Hammerhead/Hammerhead.xml" />
|
||||||
<Character file="Content/Characters/Hammerheadgold/Hammerheadgold.xml" />
|
<Character file="Content/Characters/Hammerheadgold/Hammerheadgold.xml" />
|
||||||
<Character file="Content/Characters/Hammerheadmatriarch/Hammerheadmatriarch.xml" />
|
<Character file="Content/Characters/Hammerheadmatriarch/Hammerheadmatriarch.xml" />
|
||||||
@@ -88,8 +80,6 @@
|
|||||||
<Character file="Content/Characters/Human/Human.xml" />
|
<Character file="Content/Characters/Human/Human.xml" />
|
||||||
<Character file="Content/Characters/Husk/Husk.xml" />
|
<Character file="Content/Characters/Husk/Husk.xml" />
|
||||||
<Character file="Content/Characters/Humanhusk/Humanhusk.xml" />
|
<Character file="Content/Characters/Humanhusk/Humanhusk.xml" />
|
||||||
<Character file="Content/Characters/Legacyfractalguardian/Legacyfractalguardian.xml" />
|
|
||||||
<Character file="Content/Characters/Legacyfractalguardian2/Legacyfractalguardian2.xml" />
|
|
||||||
<Character file="Content/Characters/Legacyhusk/Legacyhusk.xml" />
|
<Character file="Content/Characters/Legacyhusk/Legacyhusk.xml" />
|
||||||
<Character file="Content/Characters/Legacycharybdis/Legacycharybdis.xml" />
|
<Character file="Content/Characters/Legacycharybdis/Legacycharybdis.xml" />
|
||||||
<Character file="Content/Characters/Legacycrawler/Legacycrawler.xml" />
|
<Character file="Content/Characters/Legacycrawler/Legacycrawler.xml" />
|
||||||
@@ -157,13 +147,6 @@
|
|||||||
<Text file="Content/Texts/Korean/KoreanVanilla.xml" />
|
<Text file="Content/Texts/Korean/KoreanVanilla.xml" />
|
||||||
<UIStyle file="Content/UI/style.xml" />
|
<UIStyle file="Content/UI/style.xml" />
|
||||||
<Afflictions file="Content/Afflictions.xml" />
|
<Afflictions file="Content/Afflictions.xml" />
|
||||||
<Afflictions file="Content/AfflictionsGeneticMaterial.xml" />
|
|
||||||
<Afflictions file="Content/Talents/Assistant/AfflictionsAssistant.xml" />
|
|
||||||
<Afflictions file="Content/Talents/Captain/AfflictionsCaptain.xml" />
|
|
||||||
<Afflictions file="Content/Talents/Doctor/AfflictionsDoctor.xml" />
|
|
||||||
<Afflictions file="Content/Talents/Engineer/AfflictionsEngineer.xml" />
|
|
||||||
<Afflictions file="Content/Talents/Mechanic/AfflictionsMechanic.xml" />
|
|
||||||
<Afflictions file="Content/Talents/Security/AfflictionsSecurity.xml" />
|
|
||||||
<Structure file="Content/Map/StructurePrefabs.xml" />
|
<Structure file="Content/Map/StructurePrefabs.xml" />
|
||||||
<Structure file="Content/Map/Outposts/OutpostStructurePrefabs.xml" />
|
<Structure file="Content/Map/Outposts/OutpostStructurePrefabs.xml" />
|
||||||
<Structure file="Content/Map/Pirates/PirateStructures.xml" />
|
<Structure file="Content/Map/Pirates/PirateStructures.xml" />
|
||||||
@@ -172,33 +155,6 @@
|
|||||||
<Structure file="Content/Map/Thalamus/thalamusstructures.xml" />
|
<Structure file="Content/Map/Thalamus/thalamusstructures.xml" />
|
||||||
<UpgradeModules file="Content/Upgrades/UpgradeModules.xml" />
|
<UpgradeModules file="Content/Upgrades/UpgradeModules.xml" />
|
||||||
<RuinConfig file="Content/Map/RuinConfig.xml" />
|
<RuinConfig file="Content/Map/RuinConfig.xml" />
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_Chambers4Way.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_Chasm.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_DeadEndL.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_DeadEndR.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_HallwayHorizontal.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_HallwayVertical.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_HallwaySphere.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_MaintenancePassages.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_MaintenancePassages2.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_SecurityModule.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_VaultModule1.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_VaultModule2.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_Chambers1.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_Chambers2.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_MaintenanceTunnels1.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_MaintenanceTunnels2R.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_MaintenanceTunnels2L.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_Entrance1.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_GeneticStorage1L.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_GeneticStorage1R.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_Chasm2.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_Chasm3.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_Entrance2.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_Entrance3.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_Storage1R.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_Storage1L.sub" />
|
|
||||||
<OutpostModule file="Content/Map/RuinModules/Alien_Offices1.sub" />
|
|
||||||
<WreckAIConfig file="Content/Map/Thalamus/ThalamusAI.xml" />
|
<WreckAIConfig file="Content/Map/Thalamus/ThalamusAI.xml" />
|
||||||
<BackgroundCreaturePrefabs file="Content/BackgroundCreatures/BackgroundCreaturePrefabs.xml" />
|
<BackgroundCreaturePrefabs file="Content/BackgroundCreatures/BackgroundCreaturePrefabs.xml" />
|
||||||
<LevelObjectPrefabs file="Content/Map/Biomes/Common/CommonLevelObjects.xml" />
|
<LevelObjectPrefabs file="Content/Map/Biomes/Common/CommonLevelObjects.xml" />
|
||||||
@@ -305,11 +261,4 @@
|
|||||||
<EnemySubmarine file="Content/Map/EnemySubmarines/DugongPirate.sub"/>
|
<EnemySubmarine file="Content/Map/EnemySubmarines/DugongPirate.sub"/>
|
||||||
<EnemySubmarine file="Content/Map/EnemySubmarines/HumpbackPirate.sub"/>
|
<EnemySubmarine file="Content/Map/EnemySubmarines/HumpbackPirate.sub"/>
|
||||||
<EnemySubmarine file="Content/Map/EnemySubmarines/Typhon2Pirate.sub"/>
|
<EnemySubmarine file="Content/Map/EnemySubmarines/Typhon2Pirate.sub"/>
|
||||||
<Talents file="Content/Talents/Assistant/TalentsAssistant.xml"/>
|
|
||||||
<Talents file="Content/Talents/Security/TalentsSecurity.xml"/>
|
|
||||||
<Talents file="Content/Talents/Engineer/TalentsEngineer.xml"/>
|
|
||||||
<Talents file="Content/Talents/Mechanic/TalentsMechanic.xml"/>
|
|
||||||
<Talents file="Content/Talents/Captain/TalentsCaptain.xml"/>
|
|
||||||
<Talents file="Content/Talents/Doctor/TalentsDoctor.xml"/>
|
|
||||||
<TalentTrees file="Content/Talents/TalentTrees.xml"/>
|
|
||||||
</contentpackage>
|
</contentpackage>
|
||||||
@@ -6,13 +6,13 @@ using System.Xml.Linq;
|
|||||||
using Barotrauma.Networking;
|
using Barotrauma.Networking;
|
||||||
using Barotrauma.Extensions;
|
using Barotrauma.Extensions;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using Barotrauma.Abilities;
|
using MoonSharp.Interpreter;
|
||||||
|
|
||||||
namespace Barotrauma
|
namespace Barotrauma
|
||||||
{
|
{
|
||||||
partial class CharacterHealth
|
partial class CharacterHealth
|
||||||
{
|
{
|
||||||
class LimbHealth
|
public class LimbHealth
|
||||||
{
|
{
|
||||||
public Sprite IndicatorSprite;
|
public Sprite IndicatorSprite;
|
||||||
public Sprite HighlightSprite;
|
public Sprite HighlightSprite;
|
||||||
@@ -117,15 +117,15 @@ namespace Barotrauma
|
|||||||
private set => Character.Params.Health.CrushDepth = value;
|
private set => Character.Params.Health.CrushDepth = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly List<LimbHealth> limbHealths = new List<LimbHealth>();
|
private List<LimbHealth> limbHealths = new List<LimbHealth>();
|
||||||
//non-limb-specific afflictions
|
//non-limb-specific afflictions
|
||||||
private readonly List<Affliction> afflictions = new List<Affliction>();
|
private List<Affliction> afflictions = new List<Affliction>();
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Note: returns only the non-limb-secific afflictions. Use GetAllAfflictions or some other method for getting also the limb-specific afflictions.
|
/// Note: returns only the non-limb-secific afflictions. Use GetAllAfflictions or some other method for getting also the limb-specific afflictions.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IEnumerable<Affliction> Afflictions => afflictions;
|
public IEnumerable<Affliction> Afflictions => afflictions;
|
||||||
|
|
||||||
private readonly HashSet<Affliction> irremovableAfflictions = new HashSet<Affliction>();
|
private HashSet<Affliction> irremovableAfflictions = new HashSet<Affliction>();
|
||||||
private Affliction bloodlossAffliction;
|
private Affliction bloodlossAffliction;
|
||||||
private Affliction oxygenLowAffliction;
|
private Affliction oxygenLowAffliction;
|
||||||
private Affliction pressureAffliction;
|
private Affliction pressureAffliction;
|
||||||
@@ -133,7 +133,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public bool IsUnconscious
|
public bool IsUnconscious
|
||||||
{
|
{
|
||||||
get { return (Vitality <= 0.0f || Character.IsDead) && !Character.HasAbilityFlag(AbilityFlags.AlwaysStayConscious); }
|
get { return Vitality <= 0.0f || Character.IsDead; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public float PressureKillDelay { get; private set; } = 5.0f;
|
public float PressureKillDelay { get; private set; } = 5.0f;
|
||||||
@@ -152,7 +152,6 @@ namespace Barotrauma
|
|||||||
max += Character.Info.Job.Prefab.VitalityModifier;
|
max += Character.Info.Job.Prefab.VitalityModifier;
|
||||||
}
|
}
|
||||||
max *= Character.StaticHealthMultiplier;
|
max *= Character.StaticHealthMultiplier;
|
||||||
max *= 1f + Character.GetStatValue(StatTypes.MaximumHealthMultiplier);
|
|
||||||
return max * Character.HealthMultiplier;
|
return max * Character.HealthMultiplier;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -169,20 +168,6 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Color DefaultFaceTint = Color.TransparentBlack;
|
|
||||||
|
|
||||||
public Color FaceTint
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Color BodyTint
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float OxygenAmount
|
public float OxygenAmount
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -206,11 +191,7 @@ namespace Barotrauma
|
|||||||
public float Stun
|
public float Stun
|
||||||
{
|
{
|
||||||
get { return stunAffliction.Strength; }
|
get { return stunAffliction.Strength; }
|
||||||
set
|
set { stunAffliction.Strength = MathHelper.Clamp(value, 0.0f, stunAffliction.Prefab.MaxStrength); }
|
||||||
{
|
|
||||||
if (Character.GodMode) { return; }
|
|
||||||
stunAffliction.Strength = MathHelper.Clamp(value, 0.0f, stunAffliction.Prefab.MaxStrength);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public float StunTimer { get; private set; }
|
public float StunTimer { get; private set; }
|
||||||
@@ -242,7 +223,7 @@ namespace Barotrauma
|
|||||||
this.Character = character;
|
this.Character = character;
|
||||||
InitIrremovableAfflictions();
|
InitIrremovableAfflictions();
|
||||||
|
|
||||||
Vitality = maxVitality;
|
Vitality = maxVitality;
|
||||||
|
|
||||||
minVitality = character.IsHuman ? -100.0f : 0.0f;
|
minVitality = character.IsHuman ? -100.0f : 0.0f;
|
||||||
|
|
||||||
@@ -285,12 +266,6 @@ namespace Barotrauma
|
|||||||
private LimbHealth GetMatchingLimbHealth(Limb limb) => limb == null ? null : limbHealths[limb.HealthIndex];
|
private LimbHealth GetMatchingLimbHealth(Limb limb) => limb == null ? null : limbHealths[limb.HealthIndex];
|
||||||
private LimbHealth GetMatchingLimbHealth(Affliction affliction) => GetMatchingLimbHealth(Character.AnimController.GetLimb(affliction.Prefab.IndicatorLimb, excludeSevered: false));
|
private LimbHealth GetMatchingLimbHealth(Affliction affliction) => GetMatchingLimbHealth(Character.AnimController.GetLimb(affliction.Prefab.IndicatorLimb, excludeSevered: false));
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns the limb afflictions and non-limbspecific afflictions that are set to be displayed on this limb.
|
|
||||||
/// </summary>
|
|
||||||
private IEnumerable<Affliction> GetMatchingAfflictions(LimbHealth limb)
|
|
||||||
=> limb.Afflictions.Union(afflictions.Where(a => GetMatchingLimbHealth(a) == limb));
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns the limb afflictions and non-limbspecific afflictions that are set to be displayed on this limb.
|
/// Returns the limb afflictions and non-limbspecific afflictions that are set to be displayed on this limb.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -427,61 +402,62 @@ namespace Barotrauma
|
|||||||
return strength;
|
return strength;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ApplyAffliction(Limb targetLimb, Affliction affliction, bool allowStacking = true)
|
public void ApplyAffliction(Limb targetLimb, Affliction affliction)
|
||||||
{
|
{
|
||||||
if (!affliction.Prefab.IsBuff && Unkillable || Character.GodMode) { return; }
|
if (!affliction.Prefab.IsBuff && Unkillable || Character.GodMode) { return; }
|
||||||
if (affliction.Prefab.LimbSpecific)
|
if (affliction.Prefab.LimbSpecific)
|
||||||
{
|
{
|
||||||
if (targetLimb == null)
|
if (targetLimb == null)
|
||||||
{
|
{
|
||||||
|
var should = new LuaResult(GameMain.Lua.hook.Call("afflictionApplied", new object[] { this, affliction }));
|
||||||
|
|
||||||
|
if (should.Bool())
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
//if a limb-specific affliction is applied to no specific limb, apply to all limbs
|
//if a limb-specific affliction is applied to no specific limb, apply to all limbs
|
||||||
foreach (LimbHealth limbHealth in limbHealths)
|
foreach (LimbHealth limbHealth in limbHealths)
|
||||||
{
|
{
|
||||||
AddLimbAffliction(limbHealth, affliction, allowStacking: allowStacking);
|
AddLimbAffliction(limbHealth, affliction);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
AddLimbAffliction(targetLimb, affliction, allowStacking: allowStacking);
|
var should = new LuaResult(GameMain.Lua.hook.Call("afflictionApplied", new object[] { this, affliction, targetLimb }));
|
||||||
|
|
||||||
|
if (should.Bool())
|
||||||
|
return;
|
||||||
|
|
||||||
|
AddLimbAffliction(targetLimb, affliction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
AddAffliction(affliction, allowStacking: allowStacking);
|
var should = new LuaResult(GameMain.Lua.hook.Call("afflictionApplied", new object[] { this, affliction }));
|
||||||
|
|
||||||
|
if (should.Bool())
|
||||||
|
return;
|
||||||
|
|
||||||
|
AddAffliction(affliction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public float GetResistance(AfflictionPrefab affliction)
|
public float GetResistance(string resistanceId)
|
||||||
{
|
{
|
||||||
float resistance = 0.0f;
|
float resistance = 0.0f;
|
||||||
for (int i = 0; i < afflictions.Count; i++)
|
for (int i = 0; i < afflictions.Count; i++)
|
||||||
{
|
{
|
||||||
resistance += afflictions[i].GetResistance(affliction);
|
if (!afflictions[i].Prefab.IsBuff) continue;
|
||||||
|
float temp = afflictions[i].GetResistance(resistanceId);
|
||||||
|
if (temp > resistance) resistance = temp;
|
||||||
}
|
}
|
||||||
return 1 - ((1 - resistance) * Character.GetAbilityResistance(affliction));
|
|
||||||
}
|
|
||||||
|
|
||||||
public float GetStatValue(StatTypes statType)
|
return resistance;
|
||||||
{
|
|
||||||
float value = 0f;
|
|
||||||
for (int i = 0; i < afflictions.Count; i++)
|
|
||||||
{
|
|
||||||
value += afflictions[i].GetStatValue(statType);
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool HasFlag(AbilityFlags flagType)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < afflictions.Count; i++)
|
|
||||||
{
|
|
||||||
if (afflictions[i].HasFlag(flagType)) { return true; }
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly List<Affliction> matchingAfflictions = new List<Affliction>();
|
private readonly List<Affliction> matchingAfflictions = new List<Affliction>();
|
||||||
public void ReduceAffliction(Limb targetLimb, string affliction, float amount, ActionType? treatmentAction = null)
|
public void ReduceAffliction(Limb targetLimb, string affliction, float amount)
|
||||||
{
|
{
|
||||||
matchingAfflictions.Clear();
|
matchingAfflictions.Clear();
|
||||||
matchingAfflictions.AddRange(afflictions);
|
matchingAfflictions.AddRange(afflictions);
|
||||||
@@ -510,14 +486,6 @@ namespace Barotrauma
|
|||||||
for (int i = matchingAfflictions.Count - 1; i >= 0; i--)
|
for (int i = matchingAfflictions.Count - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
var matchingAffliction = matchingAfflictions[i];
|
var matchingAffliction = matchingAfflictions[i];
|
||||||
|
|
||||||
// this logic runs very often, so culling unnecessary object creation and talent checking with this method
|
|
||||||
if (Character.HasTalents())
|
|
||||||
{
|
|
||||||
var afflictionReduction = new AbilityValueAffliction(reduceAmount, matchingAffliction);
|
|
||||||
Character.CheckTalents(AbilityEffectType.OnReduceAffliction, afflictionReduction);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (matchingAffliction.Strength < reduceAmount)
|
if (matchingAffliction.Strength < reduceAmount)
|
||||||
{
|
{
|
||||||
float surplus = reduceAmount - matchingAffliction.Strength;
|
float surplus = reduceAmount - matchingAffliction.Strength;
|
||||||
@@ -532,17 +500,6 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
matchingAffliction.Strength -= reduceAmount;
|
matchingAffliction.Strength -= reduceAmount;
|
||||||
amount -= reduceAmount;
|
amount -= reduceAmount;
|
||||||
if (treatmentAction != null)
|
|
||||||
{
|
|
||||||
if (treatmentAction.Value == ActionType.OnUse)
|
|
||||||
{
|
|
||||||
matchingAffliction.AppliedAsSuccessfulTreatmentTime = Timing.TotalTime;
|
|
||||||
}
|
|
||||||
else if (treatmentAction.Value == ActionType.OnFailure)
|
|
||||||
{
|
|
||||||
matchingAffliction.AppliedAsFailedTreatmentTime = Timing.TotalTime;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CalculateVitality();
|
CalculateVitality();
|
||||||
@@ -558,6 +515,11 @@ namespace Barotrauma
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var should = new LuaResult(GameMain.Lua.hook.Call("afflictionApplied", new object[] { this, attackResult, hitLimb }));
|
||||||
|
|
||||||
|
if (should.Bool())
|
||||||
|
return;
|
||||||
|
|
||||||
foreach (Affliction newAffliction in attackResult.Afflictions)
|
foreach (Affliction newAffliction in attackResult.Afflictions)
|
||||||
{
|
{
|
||||||
if (newAffliction.Prefab.LimbSpecific)
|
if (newAffliction.Prefab.LimbSpecific)
|
||||||
@@ -600,9 +562,9 @@ namespace Barotrauma
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Instead of using the limbhealth count here, I think it's best to define the max vitality per limb roughly with a constant value.
|
// Instead of using the limbhealth count here, I think it's best to define the max vitality per limb roughly with a constant value.
|
||||||
// Therefore with e.g. 80 health, the max damage per limb would be 40.
|
// Therefore with e.g. 80 health, the max damage per limb would be 20.
|
||||||
// Having at least 40 damage on both legs would cause maximum limping.
|
// Having at least 20 damage on both legs would cause maximum limping.
|
||||||
float max = MaxVitality / 2;
|
float max = MaxVitality / 4;
|
||||||
if (string.IsNullOrEmpty(afflictionType))
|
if (string.IsNullOrEmpty(afflictionType))
|
||||||
{
|
{
|
||||||
float damage = GetAfflictionStrength("damage", limb, true);
|
float damage = GetAfflictionStrength("damage", limb, true);
|
||||||
@@ -633,22 +595,6 @@ namespace Barotrauma
|
|||||||
CalculateVitality();
|
CalculateVitality();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveNegativeAfflictions()
|
|
||||||
{
|
|
||||||
// also don't remove genetic effects, even if they're negative
|
|
||||||
foreach (LimbHealth limbHealth in limbHealths)
|
|
||||||
{
|
|
||||||
limbHealth.Afflictions.RemoveAll(a => !a.Prefab.IsBuff && a.Prefab.AfflictionType != "geneticmaterialbuff" && a.Prefab.AfflictionType != "geneticmaterialdebuff");
|
|
||||||
}
|
|
||||||
|
|
||||||
afflictions.RemoveAll(a => !irremovableAfflictions.Contains(a) && !a.Prefab.IsBuff && a.Prefab.AfflictionType != "geneticmaterialbuff" && a.Prefab.AfflictionType != "geneticmaterialdebuff");
|
|
||||||
foreach (Affliction affliction in irremovableAfflictions)
|
|
||||||
{
|
|
||||||
affliction.Strength = 0.0f;
|
|
||||||
}
|
|
||||||
CalculateVitality();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddLimbAffliction(Limb limb, Affliction newAffliction, bool allowStacking = true)
|
private void AddLimbAffliction(Limb limb, Affliction newAffliction, bool allowStacking = true)
|
||||||
{
|
{
|
||||||
if (!newAffliction.Prefab.LimbSpecific || limb == null) { return; }
|
if (!newAffliction.Prefab.LimbSpecific || limb == null) { return; }
|
||||||
@@ -670,7 +616,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (newAffliction.Prefab == affliction.Prefab)
|
if (newAffliction.Prefab == affliction.Prefab)
|
||||||
{
|
{
|
||||||
float newStrength = newAffliction.Strength * (100.0f / MaxVitality) * (1f - GetResistance(affliction.Prefab));
|
float newStrength = newAffliction.Strength * (100.0f / MaxVitality) * (1f - GetResistance(affliction.Prefab.Identifier));
|
||||||
if (allowStacking)
|
if (allowStacking)
|
||||||
{
|
{
|
||||||
// Add the existing strength
|
// Add the existing strength
|
||||||
@@ -692,7 +638,7 @@ namespace Barotrauma
|
|||||||
//create a new instance of the affliction to make sure we don't use the same instance for multiple characters
|
//create a new instance of the affliction to make sure we don't use the same instance for multiple characters
|
||||||
//or modify the affliction instance of an Attack or a StatusEffect
|
//or modify the affliction instance of an Attack or a StatusEffect
|
||||||
var copyAffliction = newAffliction.Prefab.Instantiate(
|
var copyAffliction = newAffliction.Prefab.Instantiate(
|
||||||
Math.Min(newAffliction.Prefab.MaxStrength, newAffliction.Strength * (100.0f / MaxVitality) * (1f - GetResistance(newAffliction.Prefab))),
|
Math.Min(newAffliction.Prefab.MaxStrength, newAffliction.Strength * (100.0f / MaxVitality) * (1f - GetResistance(newAffliction.Prefab.Identifier))),
|
||||||
newAffliction.Source);
|
newAffliction.Source);
|
||||||
limbHealth.Afflictions.Add(copyAffliction);
|
limbHealth.Afflictions.Add(copyAffliction);
|
||||||
|
|
||||||
@@ -714,7 +660,6 @@ namespace Barotrauma
|
|||||||
private void AddAffliction(Affliction newAffliction, bool allowStacking = true)
|
private void AddAffliction(Affliction newAffliction, bool allowStacking = true)
|
||||||
{
|
{
|
||||||
if (!DoesBleed && newAffliction is AfflictionBleeding) { return; }
|
if (!DoesBleed && newAffliction is AfflictionBleeding) { return; }
|
||||||
if (Character.Params.Health.StunImmunity && newAffliction.Prefab.AfflictionType == "stun") { return; }
|
|
||||||
if (!Character.NeedsOxygen && newAffliction.Prefab == AfflictionPrefab.OxygenLow) { return; }
|
if (!Character.NeedsOxygen && newAffliction.Prefab == AfflictionPrefab.OxygenLow) { return; }
|
||||||
if (newAffliction.Prefab is AfflictionPrefabHusk huskPrefab)
|
if (newAffliction.Prefab is AfflictionPrefabHusk huskPrefab)
|
||||||
{
|
{
|
||||||
@@ -727,7 +672,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (newAffliction.Prefab == affliction.Prefab)
|
if (newAffliction.Prefab == affliction.Prefab)
|
||||||
{
|
{
|
||||||
float newStrength = newAffliction.Strength * (100.0f / MaxVitality) * (1f - GetResistance(affliction.Prefab));
|
float newStrength = newAffliction.Strength * (100.0f / MaxVitality) * (1f - GetResistance(affliction.Prefab.Identifier));
|
||||||
if (allowStacking)
|
if (allowStacking)
|
||||||
{
|
{
|
||||||
// Add the existing strength
|
// Add the existing strength
|
||||||
@@ -749,7 +694,7 @@ namespace Barotrauma
|
|||||||
//create a new instance of the affliction to make sure we don't use the same instance for multiple characters
|
//create a new instance of the affliction to make sure we don't use the same instance for multiple characters
|
||||||
//or modify the affliction instance of an Attack or a StatusEffect
|
//or modify the affliction instance of an Attack or a StatusEffect
|
||||||
afflictions.Add(newAffliction.Prefab.Instantiate(
|
afflictions.Add(newAffliction.Prefab.Instantiate(
|
||||||
Math.Min(newAffliction.Prefab.MaxStrength, newAffliction.Strength * (100.0f / MaxVitality) * (1f - GetResistance(newAffliction.Prefab))),
|
Math.Min(newAffliction.Prefab.MaxStrength, newAffliction.Strength * (100.0f / MaxVitality) * (1f - GetResistance(newAffliction.Prefab.Identifier))),
|
||||||
source: newAffliction.Source));
|
source: newAffliction.Source));
|
||||||
|
|
||||||
Character.HealthUpdateInterval = 0.0f;
|
Character.HealthUpdateInterval = 0.0f;
|
||||||
@@ -761,6 +706,8 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
partial void UpdateProjSpecific(float deltaTime);
|
||||||
|
|
||||||
partial void UpdateLimbAfflictionOverlays();
|
partial void UpdateLimbAfflictionOverlays();
|
||||||
|
|
||||||
public void Update(float deltaTime)
|
public void Update(float deltaTime)
|
||||||
@@ -769,8 +716,6 @@ namespace Barotrauma
|
|||||||
|
|
||||||
StunTimer = Stun > 0 ? StunTimer + deltaTime : 0;
|
StunTimer = Stun > 0 ? StunTimer + deltaTime : 0;
|
||||||
|
|
||||||
if (Character.GodMode) { return; }
|
|
||||||
|
|
||||||
for (int i = 0; i < limbHealths.Count; i++)
|
for (int i = 0; i < limbHealths.Count; i++)
|
||||||
{
|
{
|
||||||
for (int j = limbHealths[i].Afflictions.Count - 1; j >= 0; j--)
|
for (int j = limbHealths[i].Afflictions.Count - 1; j >= 0; j--)
|
||||||
@@ -802,7 +747,7 @@ namespace Barotrauma
|
|||||||
for (int i = afflictions.Count - 1; i >= 0; i--)
|
for (int i = afflictions.Count - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
var affliction = afflictions[i];
|
var affliction = afflictions[i];
|
||||||
if (irremovableAfflictions.Contains(affliction)) { continue; }
|
if (irremovableAfflictions.Contains(affliction)) continue;
|
||||||
if (affliction.Strength <= 0.0f)
|
if (affliction.Strength <= 0.0f)
|
||||||
{
|
{
|
||||||
SteamAchievementManager.OnAfflictionRemoved(affliction, Character);
|
SteamAchievementManager.OnAfflictionRemoved(affliction, Character);
|
||||||
@@ -817,20 +762,8 @@ namespace Barotrauma
|
|||||||
Character.StackSpeedMultiplier(affliction.GetSpeedMultiplier());
|
Character.StackSpeedMultiplier(affliction.GetSpeedMultiplier());
|
||||||
}
|
}
|
||||||
|
|
||||||
Character.StackSpeedMultiplier(1f + Character.GetStatValue(StatTypes.MovementSpeed));
|
|
||||||
|
|
||||||
// maybe a bit of a hacky way to do this. should inquire if there is a better way. M61T
|
|
||||||
if (Character.InWater)
|
|
||||||
{
|
|
||||||
Character.StackSpeedMultiplier(1f + Character.GetStatValue(StatTypes.SwimmingSpeed));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Character.StackSpeedMultiplier(1f + Character.GetStatValue(StatTypes.WalkingSpeed));
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateLimbAfflictionOverlays();
|
UpdateLimbAfflictionOverlays();
|
||||||
UpdateSkinTint();
|
|
||||||
CalculateVitality();
|
CalculateVitality();
|
||||||
|
|
||||||
if (Vitality <= MinVitality)
|
if (Vitality <= MinVitality)
|
||||||
@@ -839,32 +772,6 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateSkinTint()
|
|
||||||
{
|
|
||||||
FaceTint = DefaultFaceTint;
|
|
||||||
BodyTint = Color.TransparentBlack;
|
|
||||||
|
|
||||||
for (int i = 0; i < limbHealths.Count; i++)
|
|
||||||
{
|
|
||||||
for (int j = limbHealths[i].Afflictions.Count - 1; j >= 0; j--)
|
|
||||||
{
|
|
||||||
var affliction = limbHealths[i].Afflictions[j];
|
|
||||||
Color faceTint = affliction.GetFaceTint();
|
|
||||||
if (faceTint.A > FaceTint.A) { FaceTint = faceTint; }
|
|
||||||
Color bodyTint = affliction.GetBodyTint();
|
|
||||||
if (bodyTint.A > BodyTint.A) { BodyTint = bodyTint; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (int i = 0; i < afflictions.Count; i++)
|
|
||||||
{
|
|
||||||
var affliction = afflictions[i];
|
|
||||||
Color faceTint = affliction.GetFaceTint();
|
|
||||||
if (faceTint.A > FaceTint.A) { FaceTint = faceTint; }
|
|
||||||
Color bodyTint = affliction.GetBodyTint();
|
|
||||||
if (bodyTint.A > BodyTint.A) { BodyTint = bodyTint; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateOxygen(float deltaTime)
|
private void UpdateOxygen(float deltaTime)
|
||||||
{
|
{
|
||||||
if (!Character.NeedsOxygen) { return; }
|
if (!Character.NeedsOxygen) { return; }
|
||||||
@@ -877,12 +784,7 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
float decreaseSpeed = -5.0f;
|
OxygenAmount = MathHelper.Clamp(OxygenAmount + deltaTime * (Character.OxygenAvailable < InsufficientOxygenThreshold ? -5.0f : 10.0f), -100.0f, 100.0f);
|
||||||
float increaseSpeed = 10.0f;
|
|
||||||
float oxygenlowResistance = GetResistance(oxygenLowAffliction.Prefab);
|
|
||||||
decreaseSpeed *= (1f - oxygenlowResistance);
|
|
||||||
increaseSpeed *= (1f + oxygenlowResistance);
|
|
||||||
OxygenAmount = MathHelper.Clamp(OxygenAmount + deltaTime * (Character.OxygenAvailable < InsufficientOxygenThreshold ? decreaseSpeed : increaseSpeed), -100.0f, 100.0f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateOxygenProjSpecific(prevOxygen, deltaTime);
|
UpdateOxygenProjSpecific(prevOxygen, deltaTime);
|
||||||
@@ -903,6 +805,8 @@ namespace Barotrauma
|
|||||||
Vitality = MaxVitality;
|
Vitality = MaxVitality;
|
||||||
if (Unkillable || Character.GodMode) { return; }
|
if (Unkillable || Character.GodMode) { return; }
|
||||||
|
|
||||||
|
float damageResistanceMultiplier = 1f - GetResistance("damage");
|
||||||
|
|
||||||
foreach (LimbHealth limbHealth in limbHealths)
|
foreach (LimbHealth limbHealth in limbHealths)
|
||||||
{
|
{
|
||||||
foreach (Affliction affliction in limbHealth.Afflictions)
|
foreach (Affliction affliction in limbHealth.Afflictions)
|
||||||
@@ -918,6 +822,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
vitalityDecrease *= limbHealth.VitalityTypeMultipliers[type];
|
vitalityDecrease *= limbHealth.VitalityTypeMultipliers[type];
|
||||||
}
|
}
|
||||||
|
vitalityDecrease *= damageResistanceMultiplier;
|
||||||
Vitality -= vitalityDecrease;
|
Vitality -= vitalityDecrease;
|
||||||
affliction.CalculateDamagePerSecond(vitalityDecrease);
|
affliction.CalculateDamagePerSecond(vitalityDecrease);
|
||||||
}
|
}
|
||||||
@@ -926,6 +831,7 @@ namespace Barotrauma
|
|||||||
foreach (Affliction affliction in afflictions)
|
foreach (Affliction affliction in afflictions)
|
||||||
{
|
{
|
||||||
float vitalityDecrease = affliction.GetVitalityDecrease(this);
|
float vitalityDecrease = affliction.GetVitalityDecrease(this);
|
||||||
|
vitalityDecrease *= damageResistanceMultiplier;
|
||||||
Vitality -= vitalityDecrease;
|
Vitality -= vitalityDecrease;
|
||||||
affliction.CalculateDamagePerSecond(vitalityDecrease);
|
affliction.CalculateDamagePerSecond(vitalityDecrease);
|
||||||
}
|
}
|
||||||
@@ -942,9 +848,8 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (Unkillable || Character.GodMode) { return; }
|
if (Unkillable || Character.GodMode) { return; }
|
||||||
|
|
||||||
var (type, affliction) = GetCauseOfDeath();
|
var causeOfDeath = GetCauseOfDeath();
|
||||||
UpdateSkinTint();
|
Character.Kill(causeOfDeath.First, causeOfDeath.Second);
|
||||||
Character.Kill(type, affliction);
|
|
||||||
#if CLIENT
|
#if CLIENT
|
||||||
DisplayVitalityDelay = 0.0f;
|
DisplayVitalityDelay = 0.0f;
|
||||||
DisplayedVitality = Vitality;
|
DisplayedVitality = Vitality;
|
||||||
@@ -977,7 +882,7 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public (CauseOfDeathType type, Affliction affliction) GetCauseOfDeath()
|
public Pair<CauseOfDeathType, Affliction> GetCauseOfDeath()
|
||||||
{
|
{
|
||||||
List<Affliction> currentAfflictions = GetAllAfflictions(true);
|
List<Affliction> currentAfflictions = GetAllAfflictions(true);
|
||||||
|
|
||||||
@@ -998,7 +903,7 @@ namespace Barotrauma
|
|||||||
causeOfDeath = Character.AnimController.InWater ? CauseOfDeathType.Drowning : CauseOfDeathType.Suffocation;
|
causeOfDeath = Character.AnimController.InWater ? CauseOfDeathType.Drowning : CauseOfDeathType.Suffocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (causeOfDeath, strongestAffliction);
|
return new Pair<CauseOfDeathType, Affliction>(causeOfDeath, strongestAffliction);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: this method is called a lot (every half second) -> optimize, don't create new class instances and lists every time!
|
// TODO: this method is called a lot (every half second) -> optimize, don't create new class instances and lists every time!
|
||||||
@@ -1044,16 +949,15 @@ namespace Barotrauma
|
|||||||
/// <param name="treatmentSuitability">A dictionary where the key is the identifier of the item and the value the suitability</param>
|
/// <param name="treatmentSuitability">A dictionary where the key is the identifier of the item and the value the suitability</param>
|
||||||
/// <param name="normalize">If true, the suitability values are normalized between 0 and 1. If not, they're arbitrary values defined in the medical item XML, where negative values are unsuitable, and positive ones suitable.</param>
|
/// <param name="normalize">If true, the suitability values are normalized between 0 and 1. If not, they're arbitrary values defined in the medical item XML, where negative values are unsuitable, and positive ones suitable.</param>
|
||||||
/// <param name="randomization">Amount of randomization to apply to the values (0 = the values are accurate, 1 = the values are completely random)</param>
|
/// <param name="randomization">Amount of randomization to apply to the values (0 = the values are accurate, 1 = the values are completely random)</param>
|
||||||
public void GetSuitableTreatments(Dictionary<string, float> treatmentSuitability, bool normalize, Limb limb = null, bool ignoreHiddenAfflictions = false, float randomization = 0.0f)
|
public void GetSuitableTreatments(Dictionary<string, float> treatmentSuitability, bool normalize, float randomization = 0.0f)
|
||||||
{
|
{
|
||||||
//key = item identifier
|
//key = item identifier
|
||||||
//float = suitability
|
//float = suitability
|
||||||
treatmentSuitability.Clear();
|
treatmentSuitability.Clear();
|
||||||
float minSuitability = -10, maxSuitability = 10;
|
float minSuitability = -10, maxSuitability = 10;
|
||||||
foreach (Affliction affliction in getAfflictions(limb))
|
foreach (Affliction affliction in GetAllAfflictions())
|
||||||
{
|
{
|
||||||
if (affliction.Strength <= affliction.Prefab.TreatmentThreshold) { continue; }
|
if (affliction.Strength < affliction.Prefab.TreatmentThreshold) { continue; }
|
||||||
if (ignoreHiddenAfflictions && affliction.Strength < affliction.Prefab.ShowIconThreshold) { continue; }
|
|
||||||
foreach (KeyValuePair<string, float> treatment in affliction.Prefab.TreatmentSuitability)
|
foreach (KeyValuePair<string, float> treatment in affliction.Prefab.TreatmentSuitability)
|
||||||
{
|
{
|
||||||
if (!treatmentSuitability.ContainsKey(treatment.Key))
|
if (!treatmentSuitability.ContainsKey(treatment.Key))
|
||||||
@@ -1084,22 +988,10 @@ namespace Barotrauma
|
|||||||
treatmentSuitability[treatment] += Rand.Range(-100.0f, 100.0f) * randomization;
|
treatmentSuitability[treatment] += Rand.Range(-100.0f, 100.0f) * randomization;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<Affliction> getAfflictions(Limb limb)
|
|
||||||
{
|
|
||||||
if (limb == null)
|
|
||||||
{
|
|
||||||
return GetAllAfflictions();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return GetMatchingAfflictions(GetMatchingLimbHealth(limb));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly List<Affliction> activeAfflictions = new List<Affliction>();
|
private readonly List<Affliction> activeAfflictions = new List<Affliction>();
|
||||||
private readonly List<(LimbHealth limbHealth, Affliction affliction)> limbAfflictions = new List<(LimbHealth limbHealth, Affliction affliction)>();
|
private readonly List<Pair<LimbHealth, Affliction>> limbAfflictions = new List<Pair<LimbHealth, Affliction>>();
|
||||||
public void ServerWrite(IWriteMessage msg)
|
public void ServerWrite(IWriteMessage msg)
|
||||||
{
|
{
|
||||||
activeAfflictions.Clear();
|
activeAfflictions.Clear();
|
||||||
@@ -1130,22 +1022,22 @@ namespace Barotrauma
|
|||||||
foreach (Affliction limbAffliction in limbHealth.Afflictions)
|
foreach (Affliction limbAffliction in limbHealth.Afflictions)
|
||||||
{
|
{
|
||||||
if (limbAffliction.Strength <= 0.0f || limbAffliction.Strength < limbAffliction.Prefab.ActivationThreshold) continue;
|
if (limbAffliction.Strength <= 0.0f || limbAffliction.Strength < limbAffliction.Prefab.ActivationThreshold) continue;
|
||||||
limbAfflictions.Add((limbHealth, limbAffliction));
|
limbAfflictions.Add(new Pair<LimbHealth, Affliction>(limbHealth, limbAffliction));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
msg.Write((byte)limbAfflictions.Count);
|
msg.Write((byte)limbAfflictions.Count);
|
||||||
foreach (var (limbHealth, affliction) in limbAfflictions)
|
foreach (var limbAffliction in limbAfflictions)
|
||||||
{
|
{
|
||||||
msg.WriteRangedInteger(limbHealths.IndexOf(limbHealth), 0, limbHealths.Count - 1);
|
msg.WriteRangedInteger(limbHealths.IndexOf(limbAffliction.First), 0, limbHealths.Count - 1);
|
||||||
msg.Write(affliction.Prefab.UIntIdentifier);
|
msg.Write(limbAffliction.Second.Prefab.UIntIdentifier);
|
||||||
msg.WriteRangedSingle(
|
msg.WriteRangedSingle(
|
||||||
MathHelper.Clamp(affliction.Strength, 0.0f, affliction.Prefab.MaxStrength),
|
MathHelper.Clamp(limbAffliction.Second.Strength, 0.0f, limbAffliction.Second.Prefab.MaxStrength),
|
||||||
0.0f, affliction.Prefab.MaxStrength, 8);
|
0.0f, limbAffliction.Second.Prefab.MaxStrength, 8);
|
||||||
msg.Write((byte)affliction.Prefab.PeriodicEffects.Count());
|
msg.Write((byte)limbAffliction.Second.Prefab.PeriodicEffects.Count());
|
||||||
foreach (AfflictionPrefab.PeriodicEffect periodicEffect in affliction.Prefab.PeriodicEffects)
|
foreach (AfflictionPrefab.PeriodicEffect periodicEffect in limbAffliction.Second.Prefab.PeriodicEffects)
|
||||||
{
|
{
|
||||||
msg.WriteRangedSingle(affliction.PeriodicEffectTimers[periodicEffect], periodicEffect.MinInterval, periodicEffect.MaxInterval, 8);
|
msg.WriteRangedSingle(limbAffliction.Second.PeriodicEffectTimers[periodicEffect], periodicEffect.MinInterval, periodicEffect.MaxInterval, 8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1161,7 +1053,7 @@ namespace Barotrauma
|
|||||||
/// Automatically filters out buffs.
|
/// Automatically filters out buffs.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static IEnumerable<Affliction> SortAfflictionsBySeverity(IEnumerable<Affliction> afflictions, bool excludeBuffs = true) =>
|
public static IEnumerable<Affliction> SortAfflictionsBySeverity(IEnumerable<Affliction> afflictions, bool excludeBuffs = true) =>
|
||||||
afflictions.Where(a => !excludeBuffs || !a.Prefab.IsBuff).OrderByDescending(a => a.DamagePerSecond).ThenByDescending(a => a.Strength / a.Prefab.MaxStrength);
|
afflictions.Where(a => !excludeBuffs || !a.Prefab.IsBuff).OrderByDescending(a => a.DamagePerSecond).ThenByDescending(a => a.Strength);
|
||||||
|
|
||||||
public void Save(XElement healthElement)
|
public void Save(XElement healthElement)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -60,7 +60,6 @@ namespace Barotrauma.Items.Components
|
|||||||
set;
|
set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private bool linkToChat = false;
|
private bool linkToChat = false;
|
||||||
|
|
||||||
[ConditionallyEditable(ConditionallyEditable.ConditionType.AllowLinkingWifiToChat)]
|
[ConditionallyEditable(ConditionallyEditable.ConditionType.AllowLinkingWifiToChat)]
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ using System.Linq;
|
|||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
using Barotrauma.Extensions;
|
using Barotrauma.Extensions;
|
||||||
using Barotrauma.MapCreatures.Behavior;
|
using Barotrauma.MapCreatures.Behavior;
|
||||||
using Barotrauma.Abilities;
|
using MoonSharp.Interpreter;
|
||||||
|
|
||||||
#if CLIENT
|
#if CLIENT
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
@@ -37,6 +37,7 @@ namespace Barotrauma
|
|||||||
set
|
set
|
||||||
{
|
{
|
||||||
currentHull = value;
|
currentHull = value;
|
||||||
|
ParentRuin = currentHull?.ParentRuin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,15 +98,13 @@ namespace Barotrauma
|
|||||||
|
|
||||||
private Dictionary<string, Connection> connections;
|
private Dictionary<string, Connection> connections;
|
||||||
|
|
||||||
private readonly List<Repairable> repairables;
|
private List<Repairable> repairables;
|
||||||
|
|
||||||
private Quality qualityComponent;
|
private Queue<float> impactQueue = new Queue<float>();
|
||||||
|
|
||||||
private readonly Queue<float> impactQueue = new Queue<float>();
|
|
||||||
|
|
||||||
//a dictionary containing lists of the status effects in all the components of the item
|
//a dictionary containing lists of the status effects in all the components of the item
|
||||||
private readonly bool[] hasStatusEffectsOfType;
|
private bool[] hasStatusEffectsOfType;
|
||||||
private readonly Dictionary<ActionType, List<StatusEffect>> statusEffectLists;
|
private Dictionary<ActionType, List<StatusEffect>> statusEffectLists;
|
||||||
|
|
||||||
public Dictionary<string, SerializableProperty> SerializableProperties { get; protected set; }
|
public Dictionary<string, SerializableProperty> SerializableProperties { get; protected set; }
|
||||||
|
|
||||||
@@ -233,6 +232,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (character != null && character.IsOnPlayerTeam)
|
if (character != null && character.IsOnPlayerTeam)
|
||||||
{
|
{
|
||||||
|
|
||||||
return IsPlayerTeamInteractable;
|
return IsPlayerTeamInteractable;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -254,12 +254,6 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (!Prefab.AllowRotatingInEditor) { return; }
|
if (!Prefab.AllowRotatingInEditor) { return; }
|
||||||
rotationRad = MathHelper.ToRadians(value);
|
rotationRad = MathHelper.ToRadians(value);
|
||||||
#if CLIENT
|
|
||||||
if (Screen.Selected == GameMain.SubEditorScreen)
|
|
||||||
{
|
|
||||||
SetContainedItemPositions();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -455,7 +449,7 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
|
|
||||||
public bool IsFullCondition => MathUtils.NearlyEqual(Condition, MaxCondition);
|
public bool IsFullCondition => MathUtils.NearlyEqual(Condition, MaxCondition);
|
||||||
public float MaxCondition => Prefab.Health * healthMultiplier * maxRepairConditionMultiplier * (1.0f + GetQualityModifier(Items.Components.Quality.StatType.Condition));
|
public float MaxCondition => Prefab.Health * healthMultiplier;
|
||||||
public float ConditionPercentage => MathUtils.Percentage(Condition, MaxCondition);
|
public float ConditionPercentage => MathUtils.Percentage(Condition, MaxCondition);
|
||||||
|
|
||||||
private float offsetOnSelectedMultiplier = 1.0f;
|
private float offsetOnSelectedMultiplier = 1.0f;
|
||||||
@@ -473,16 +467,10 @@ namespace Barotrauma
|
|||||||
public float HealthMultiplier
|
public float HealthMultiplier
|
||||||
{
|
{
|
||||||
get => healthMultiplier;
|
get => healthMultiplier;
|
||||||
set { healthMultiplier = MathHelper.Clamp(value, 0.0f, float.PositiveInfinity); }
|
set
|
||||||
}
|
{
|
||||||
|
healthMultiplier = value;
|
||||||
private float maxRepairConditionMultiplier = 1.0f;
|
}
|
||||||
|
|
||||||
[Serialize(1.0f, true)]
|
|
||||||
public float MaxRepairConditionMultiplier
|
|
||||||
{
|
|
||||||
get => maxRepairConditionMultiplier;
|
|
||||||
set { maxRepairConditionMultiplier = MathHelper.Clamp(value, 0.0f, float.PositiveInfinity); }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//the default value should be Prefab.Health, but because we can't use it in the attribute,
|
//the default value should be Prefab.Health, but because we can't use it in the attribute,
|
||||||
@@ -496,7 +484,7 @@ namespace Barotrauma
|
|||||||
if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsClient) { return; }
|
if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsClient) { return; }
|
||||||
if (!MathUtils.IsValid(value)) { return; }
|
if (!MathUtils.IsValid(value)) { return; }
|
||||||
if (Indestructible) { return; }
|
if (Indestructible) { return; }
|
||||||
if (InvulnerableToDamage && value <= condition) { return; }
|
if (InvulnerableToDamage && value <= condition) { return;}
|
||||||
|
|
||||||
float prev = condition;
|
float prev = condition;
|
||||||
bool wasInFullCondition = IsFullCondition;
|
bool wasInFullCondition = IsFullCondition;
|
||||||
@@ -553,12 +541,6 @@ namespace Barotrauma
|
|||||||
set => indestructible = value;
|
set => indestructible = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool AllowDeconstruct
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
set;
|
|
||||||
}
|
|
||||||
|
|
||||||
[Editable, Serialize(false, isSaveable: true, "When enabled will prevent the item from taking damage from all sources")]
|
[Editable, Serialize(false, isSaveable: true, "When enabled will prevent the item from taking damage from all sources")]
|
||||||
public bool InvulnerableToDamage { get; set; }
|
public bool InvulnerableToDamage { get; set; }
|
||||||
|
|
||||||
@@ -632,21 +614,6 @@ namespace Barotrauma
|
|||||||
get { return Prefab.UseInHealthInterface; }
|
get { return Prefab.UseInHealthInterface; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public int Quality
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return qualityComponent?.QualityLevel ?? 0;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (qualityComponent != null)
|
|
||||||
{
|
|
||||||
qualityComponent.QualityLevel = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool InWater
|
public bool InWater
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -790,10 +757,10 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
spriteColor = prefab.SpriteColor;
|
spriteColor = prefab.SpriteColor;
|
||||||
|
|
||||||
components = new List<ItemComponent>();
|
components = new List<ItemComponent>();
|
||||||
drawableComponents = new List<IDrawableComponent>(); hasComponentsToDraw = false;
|
drawableComponents = new List<IDrawableComponent>(); hasComponentsToDraw = false;
|
||||||
tags = new HashSet<string>();
|
tags = new HashSet<string>();
|
||||||
repairables = new List<Repairable>();
|
repairables = new List<Repairable>();
|
||||||
|
|
||||||
defaultRect = newRect;
|
defaultRect = newRect;
|
||||||
rect = newRect;
|
rect = newRect;
|
||||||
@@ -801,8 +768,6 @@ namespace Barotrauma
|
|||||||
condition = MaxCondition;
|
condition = MaxCondition;
|
||||||
lastSentCondition = condition;
|
lastSentCondition = condition;
|
||||||
|
|
||||||
AllowDeconstruct = itemPrefab.AllowDeconstruct;
|
|
||||||
|
|
||||||
allPropertyObjects.Add(this);
|
allPropertyObjects.Add(this);
|
||||||
|
|
||||||
XElement element = itemPrefab.ConfigElement;
|
XElement element = itemPrefab.ConfigElement;
|
||||||
@@ -834,7 +799,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (!Physics.TryParseCollisionCategory(collisionCategory, out Category cat))
|
if (!Physics.TryParseCollisionCategory(collisionCategory, out Category cat))
|
||||||
{
|
{
|
||||||
DebugConsole.ThrowError("Invalid collision category in item \"" + Name + "\" (" + collisionCategory + ")");
|
DebugConsole.ThrowError("Invalid collision category in item \"" + Name+"\" (" + collisionCategory + ")");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -962,8 +927,6 @@ namespace Barotrauma
|
|||||||
ownInventory = itemContainer.Inventory;
|
ownInventory = itemContainer.Inventory;
|
||||||
}
|
}
|
||||||
|
|
||||||
qualityComponent = GetComponent<Quality>();
|
|
||||||
|
|
||||||
InitProjSpecific();
|
InitProjSpecific();
|
||||||
|
|
||||||
if (callOnItemLoaded)
|
if (callOnItemLoaded)
|
||||||
@@ -981,9 +944,6 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (Components.Any(ic => ic is Wire) && Components.All(ic => ic is Wire || ic is Holdable)) { isWire = true; }
|
if (Components.Any(ic => ic is Wire) && Components.All(ic => ic is Wire || ic is Holdable)) { isWire = true; }
|
||||||
if (HasTag("logic")) { isLogic = true; }
|
if (HasTag("logic")) { isLogic = true; }
|
||||||
|
|
||||||
ApplyStatusEffects(ActionType.OnSpawn, 1.0f);
|
|
||||||
Components.ForEach(c => c.ApplyStatusEffects(ActionType.OnSpawn, 1.0f));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
partial void InitProjSpecific();
|
partial void InitProjSpecific();
|
||||||
@@ -1157,11 +1117,6 @@ namespace Barotrauma
|
|||||||
return components.Where(c => c is T).Cast<T>();
|
return components.Where(c => c is T).Cast<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public float GetQualityModifier(Quality.StatType statType)
|
|
||||||
{
|
|
||||||
return GetComponent<Quality>()?.GetValue(statType) ?? 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RemoveContained(Item contained)
|
public void RemoveContained(Item contained)
|
||||||
{
|
{
|
||||||
ownInventory?.RemoveItem(contained);
|
ownInventory?.RemoveItem(contained);
|
||||||
@@ -1323,7 +1278,7 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
|
|
||||||
Submarine = parentInventory.Owner.Submarine;
|
Submarine = parentInventory.Owner.Submarine;
|
||||||
if (body != null) { body.Submarine = Submarine; }
|
if (body != null) body.Submarine = Submarine;
|
||||||
|
|
||||||
return CurrentHull;
|
return CurrentHull;
|
||||||
}
|
}
|
||||||
@@ -1489,11 +1444,6 @@ namespace Barotrauma
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (effect.TargetSlot > -1)
|
|
||||||
{
|
|
||||||
if (OwnInventory.FindIndex(containedItem) != effect.TargetSlot) { continue; }
|
|
||||||
}
|
|
||||||
|
|
||||||
hasTargets = true;
|
hasTargets = true;
|
||||||
targets.Add(containedItem);
|
targets.Add(containedItem);
|
||||||
}
|
}
|
||||||
@@ -1552,7 +1502,7 @@ namespace Barotrauma
|
|||||||
targets.Add(limb);
|
targets.Add(limb);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Container != null && effect.HasTargetType(StatusEffect.TargetType.Parent)) { targets.Add(Container); }
|
if (Container != null && effect.HasTargetType(StatusEffect.TargetType.Parent)) targets.Add(Container);
|
||||||
|
|
||||||
effect.Apply(type, deltaTime, this, targets, worldPosition);
|
effect.Apply(type, deltaTime, this, targets, worldPosition);
|
||||||
}
|
}
|
||||||
@@ -1612,10 +1562,9 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aiTarget != null)
|
aiTarget?.Update(deltaTime);
|
||||||
{
|
|
||||||
aiTarget.Update(deltaTime);
|
GameMain.Lua.hook.Call("itemThink." + prefab.Identifier, new object[] { this, deltaTime });
|
||||||
}
|
|
||||||
|
|
||||||
if (!isActive) { return; }
|
if (!isActive) { return; }
|
||||||
|
|
||||||
@@ -1733,18 +1682,10 @@ namespace Barotrauma
|
|||||||
public void UpdateTransform()
|
public void UpdateTransform()
|
||||||
{
|
{
|
||||||
if (body == null) { return; }
|
if (body == null) { return; }
|
||||||
|
|
||||||
Submarine prevSub = Submarine;
|
Submarine prevSub = Submarine;
|
||||||
|
|
||||||
var projectile = GetComponent<Projectile>();
|
FindHull();
|
||||||
if (projectile?.StickTarget?.UserData is Limb limb)
|
|
||||||
{
|
|
||||||
Submarine = body.Submarine = limb.character?.Submarine;
|
|
||||||
currentHull = limb.character?.CurrentHull;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FindHull();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Submarine == null && prevSub != null)
|
if (Submarine == null && prevSub != null)
|
||||||
{
|
{
|
||||||
@@ -1811,7 +1752,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
Vector2 drag = body.LinearVelocity * volume;
|
Vector2 drag = body.LinearVelocity * volume;
|
||||||
|
|
||||||
body.ApplyForce((uplift - drag) * 10.0f);
|
body.ApplyForce((uplift - drag) * 10.0f, maxVelocity: NetConfig.MaxPhysicsBodyVelocity);
|
||||||
|
|
||||||
//apply simple angular drag
|
//apply simple angular drag
|
||||||
body.ApplyTorque(body.AngularVelocity * volume * -0.05f);
|
body.ApplyTorque(body.AngularVelocity * volume * -0.05f);
|
||||||
@@ -1822,12 +1763,6 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (transformDirty) { return false; }
|
if (transformDirty) { return false; }
|
||||||
|
|
||||||
var projectile = GetComponent<Projectile>();
|
|
||||||
if (projectile?.IgnoredBodies != null)
|
|
||||||
{
|
|
||||||
if (projectile.IgnoredBodies.Contains(f2.Body)) { return false; }
|
|
||||||
}
|
|
||||||
|
|
||||||
contact.GetWorldManifold(out Vector2 normal, out _);
|
contact.GetWorldManifold(out Vector2 normal, out _);
|
||||||
if (contact.FixtureA.Body == f1.Body) { normal = -normal; }
|
if (contact.FixtureA.Body == f1.Body) { normal = -normal; }
|
||||||
float impact = Vector2.Dot(f1.Body.LinearVelocity, -normal);
|
float impact = Vector2.Dot(f1.Body.LinearVelocity, -normal);
|
||||||
@@ -1888,7 +1823,6 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
component.FlipX(relativeToSub);
|
component.FlipX(relativeToSub);
|
||||||
}
|
}
|
||||||
SetContainedItemPositions();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void FlipY(bool relativeToSub)
|
public override void FlipY(bool relativeToSub)
|
||||||
@@ -1913,7 +1847,6 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
component.FlipY(relativeToSub);
|
component.FlipY(relativeToSub);
|
||||||
}
|
}
|
||||||
SetContainedItemPositions();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1974,16 +1907,16 @@ namespace Barotrauma
|
|||||||
return connectedComponents;
|
return connectedComponents;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static readonly (string input, string output)[] connectionPairs = new (string input, string output)[]
|
public static readonly Pair<string, string>[] connectionPairs = new Pair<string, string>[]
|
||||||
{
|
{
|
||||||
("power_in", "power_out"),
|
new Pair<string, string>("power_in", "power_out"),
|
||||||
("signal_in1", "signal_out1"),
|
new Pair<string, string>("signal_in1", "signal_out1"),
|
||||||
("signal_in2", "signal_out2"),
|
new Pair<string, string>("signal_in2", "signal_out2"),
|
||||||
("signal_in3", "signal_out3"),
|
new Pair<string, string>("signal_in3", "signal_out3"),
|
||||||
("signal_in4", "signal_out4"),
|
new Pair<string, string>("signal_in4", "signal_out4"),
|
||||||
("signal_in", "signal_out"),
|
new Pair<string, string>("signal_in", "signal_out"),
|
||||||
("signal_in1", "signal_out"),
|
new Pair<string, string>("signal_in1", "signal_out"),
|
||||||
("signal_in2", "signal_out")
|
new Pair<string, string>("signal_in2", "signal_out")
|
||||||
};
|
};
|
||||||
|
|
||||||
private void GetConnectedComponentsRecursive<T>(Connection c, HashSet<Connection> alreadySearched, List<T> connectedComponents) where T : ItemComponent
|
private void GetConnectedComponentsRecursive<T>(Connection c, HashSet<Connection> alreadySearched, List<T> connectedComponents) where T : ItemComponent
|
||||||
@@ -2019,20 +1952,20 @@ namespace Barotrauma
|
|||||||
recipient.Item.GetConnectedComponentsRecursive(recipient, alreadySearched, connectedComponents);
|
recipient.Item.GetConnectedComponentsRecursive(recipient, alreadySearched, connectedComponents);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ((string input, string output) in connectionPairs)
|
foreach (Pair<string, string> connectionPair in connectionPairs)
|
||||||
{
|
{
|
||||||
if (input == c.Name)
|
if (connectionPair.First == c.Name)
|
||||||
{
|
{
|
||||||
var pairedConnection = c.Item.Connections.FirstOrDefault(c2 => c2.Name == output);
|
var pairedConnection = c.Item.Connections.FirstOrDefault(c2 => c2.Name == connectionPair.Second);
|
||||||
if (pairedConnection != null)
|
if (pairedConnection != null)
|
||||||
{
|
{
|
||||||
if (alreadySearched.Contains(pairedConnection)) { continue; }
|
if (alreadySearched.Contains(pairedConnection)) { continue; }
|
||||||
GetConnectedComponentsRecursive(pairedConnection, alreadySearched, connectedComponents);
|
GetConnectedComponentsRecursive(pairedConnection, alreadySearched, connectedComponents);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (output == c.Name)
|
else if (connectionPair.Second == c.Name)
|
||||||
{
|
{
|
||||||
var pairedConnection = c.Item.Connections.FirstOrDefault(c2 => c2.Name == input);
|
var pairedConnection = c.Item.Connections.FirstOrDefault(c2 => c2.Name == connectionPair.First);
|
||||||
if (pairedConnection != null)
|
if (pairedConnection != null)
|
||||||
{
|
{
|
||||||
if (alreadySearched.Contains(pairedConnection)) { continue; }
|
if (alreadySearched.Contains(pairedConnection)) { continue; }
|
||||||
@@ -2042,27 +1975,18 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Controller FindController(string[] tags = null)
|
public Controller FindController()
|
||||||
{
|
{
|
||||||
//try finding the controller with the simpler non-recursive method first
|
//try finding the controller with the simpler non-recursive method first
|
||||||
var controllers = GetConnectedComponents<Controller>();
|
var controllers = GetConnectedComponents<Controller>();
|
||||||
bool needsTag = tags != null && tags.Length > 0;
|
if (controllers.None()) { controllers = GetConnectedComponents<Controller>(recursive: true); }
|
||||||
if (controllers.None() || (needsTag && controllers.None(c => c.Item.HasTag(tags))))
|
return controllers.Count < 2 ? controllers.FirstOrDefault() :
|
||||||
{
|
(controllers.FirstOrDefault(c => c.GetFocusTarget() == this) ?? controllers.FirstOrDefault());
|
||||||
controllers = GetConnectedComponents<Controller>(recursive: true);
|
|
||||||
}
|
|
||||||
if (needsTag)
|
|
||||||
{
|
|
||||||
controllers.RemoveAll(c => !c.Item.HasTag(tags));
|
|
||||||
}
|
|
||||||
return controllers.Count < 2 ?
|
|
||||||
controllers.FirstOrDefault() :
|
|
||||||
controllers.FirstOrDefault(c => c.GetFocusTarget() == this) ?? controllers.FirstOrDefault();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool TryFindController(out Controller controller, string[] tags = null)
|
public bool TryFindController(out Controller controller)
|
||||||
{
|
{
|
||||||
controller = FindController(tags: tags);
|
controller = FindController();
|
||||||
return controller != null;
|
return controller != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2134,6 +2058,8 @@ namespace Barotrauma
|
|||||||
} while (CoroutineManager.DeltaTime <= 0.0f);
|
} while (CoroutineManager.DeltaTime <= 0.0f);
|
||||||
|
|
||||||
delayedSignals.Remove((signal, connection));
|
delayedSignals.Remove((signal, connection));
|
||||||
|
|
||||||
|
signal.source = this;
|
||||||
connection.SendSignal(signal);
|
connection.SendSignal(signal);
|
||||||
|
|
||||||
yield return CoroutineStatus.Success;
|
yield return CoroutineStatus.Success;
|
||||||
@@ -2163,6 +2089,11 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public bool TryInteract(Character picker, bool ignoreRequiredItems = false, bool forceSelectKey = false, bool forceActionKey = false)
|
public bool TryInteract(Character picker, bool ignoreRequiredItems = false, bool forceSelectKey = false, bool forceActionKey = false)
|
||||||
{
|
{
|
||||||
|
var should = new LuaResult(GameMain.Lua.hook.Call("itemInteract", new object[] { this, picker, ignoreRequiredItems, forceSelectKey, forceActionKey }));
|
||||||
|
|
||||||
|
if (!should.IsNull())
|
||||||
|
return should.Bool();
|
||||||
|
|
||||||
if (CampaignInteractionType != CampaignMode.InteractionType.None) { return false; }
|
if (CampaignInteractionType != CampaignMode.InteractionType.None) { return false; }
|
||||||
|
|
||||||
bool picked = false, selected = false;
|
bool picked = false, selected = false;
|
||||||
@@ -2301,6 +2232,11 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (condition == 0.0f) { return; }
|
if (condition == 0.0f) { return; }
|
||||||
|
|
||||||
|
var should = new LuaResult(GameMain.Lua.hook.Call("itemUse", new object[] { this, character, targetLimb }));
|
||||||
|
|
||||||
|
if (should.Bool())
|
||||||
|
return;
|
||||||
|
|
||||||
bool remove = false;
|
bool remove = false;
|
||||||
|
|
||||||
foreach (ItemComponent ic in components)
|
foreach (ItemComponent ic in components)
|
||||||
@@ -2334,6 +2270,12 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (condition == 0.0f) { return; }
|
if (condition == 0.0f) { return; }
|
||||||
|
|
||||||
|
var should = new LuaResult(GameMain.Lua.hook.Call("itemSecondaryUse", new object[] { this, character}));
|
||||||
|
|
||||||
|
if (should.Bool())
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
bool remove = false;
|
bool remove = false;
|
||||||
|
|
||||||
foreach (ItemComponent ic in components)
|
foreach (ItemComponent ic in components)
|
||||||
@@ -2365,9 +2307,14 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public void ApplyTreatment(Character user, Character character, Limb targetLimb)
|
public void ApplyTreatment(Character user, Character character, Limb targetLimb)
|
||||||
{
|
{
|
||||||
|
var should = new LuaResult(GameMain.Lua.hook.Call("itemApplyTreatment", new object[] { this, user, character, targetLimb }));
|
||||||
|
|
||||||
|
if (should.Bool())
|
||||||
|
return;
|
||||||
|
|
||||||
//can't apply treatment to dead characters
|
//can't apply treatment to dead characters
|
||||||
if (character.IsDead) { return; }
|
if (character.IsDead) return;
|
||||||
if (!UseInHealthInterface) { return; }
|
if (!UseInHealthInterface) return;
|
||||||
|
|
||||||
#if CLIENT
|
#if CLIENT
|
||||||
if (GameMain.Client != null)
|
if (GameMain.Client != null)
|
||||||
@@ -2377,12 +2324,10 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
float applyOnSelfFraction = user?.GetStatValue(StatTypes.ApplyTreatmentsOnSelfFraction) ?? 0.0f;
|
|
||||||
|
|
||||||
bool remove = false;
|
bool remove = false;
|
||||||
foreach (ItemComponent ic in components)
|
foreach (ItemComponent ic in components)
|
||||||
{
|
{
|
||||||
if (!ic.HasRequiredContainedItems(user, addMessage: user == Character.Controlled)) { continue; }
|
if (!ic.HasRequiredContainedItems(user, addMessage: user == Character.Controlled)) continue;
|
||||||
|
|
||||||
bool success = Rand.Range(0.0f, 0.5f) < ic.DegreeOfSuccess(user);
|
bool success = Rand.Range(0.0f, 0.5f) < ic.DegreeOfSuccess(user);
|
||||||
ActionType actionType = success ? ActionType.OnUse : ActionType.OnFailure;
|
ActionType actionType = success ? ActionType.OnUse : ActionType.OnFailure;
|
||||||
@@ -2391,19 +2336,7 @@ namespace Barotrauma
|
|||||||
ic.PlaySound(actionType, user);
|
ic.PlaySound(actionType, user);
|
||||||
#endif
|
#endif
|
||||||
ic.WasUsed = true;
|
ic.WasUsed = true;
|
||||||
ic.ApplyStatusEffects(actionType, 1.0f, character, targetLimb, user: user, applyOnUserFraction: applyOnSelfFraction);
|
ic.ApplyStatusEffects(actionType, 1.0f, character, targetLimb, user: user);
|
||||||
|
|
||||||
if (applyOnSelfFraction > 0.0f)
|
|
||||||
{
|
|
||||||
//hacky af
|
|
||||||
ic.statusEffectLists.TryGetValue(actionType, out var effectList);
|
|
||||||
if (effectList != null)
|
|
||||||
{
|
|
||||||
effectList.ForEach(e => e.AfflictionMultiplier = applyOnSelfFraction);
|
|
||||||
ic.ApplyStatusEffects(actionType, 1.0f, user, targetLimb == null ? null : user.AnimController.GetLimb(targetLimb.type), user: user);
|
|
||||||
effectList.ForEach(e => e.AfflictionMultiplier = 1.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsServer)
|
if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsServer)
|
||||||
{
|
{
|
||||||
@@ -2413,23 +2346,19 @@ namespace Barotrauma
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ic.DeleteOnUse) { remove = true; }
|
if (ic.DeleteOnUse) remove = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user != null)
|
|
||||||
{
|
|
||||||
var abilityItem = new AbilityApplyTreatment(user, character, this);
|
|
||||||
user.CheckTalents(AbilityEffectType.OnApplyTreatment, abilityItem);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (remove) { Spawner?.AddToRemoveQueue(this); }
|
if (remove) { Spawner?.AddToRemoveQueue(this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Combine(Item item, Character user)
|
public bool Combine(Item item, Character user)
|
||||||
{
|
{
|
||||||
|
var should = new LuaResult(GameMain.Lua.hook.Call("itemCombine", new object[] { this, item, user }));
|
||||||
|
|
||||||
|
if (!should.IsNull())
|
||||||
|
return should.Bool();
|
||||||
|
|
||||||
if (item == this) { return false; }
|
if (item == this) { return false; }
|
||||||
bool isCombined = false;
|
bool isCombined = false;
|
||||||
foreach (ItemComponent ic in components)
|
foreach (ItemComponent ic in components)
|
||||||
@@ -2444,6 +2373,11 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public void Drop(Character dropper, bool createNetworkEvent = true)
|
public void Drop(Character dropper, bool createNetworkEvent = true)
|
||||||
{
|
{
|
||||||
|
var should = new LuaResult(GameMain.Lua.hook.Call("itemDrop", new object[] { this, dropper}));
|
||||||
|
|
||||||
|
if (should.Bool())
|
||||||
|
return;
|
||||||
|
|
||||||
if (createNetworkEvent)
|
if (createNetworkEvent)
|
||||||
{
|
{
|
||||||
if (parentInventory != null && !parentInventory.Owner.Removed && !Removed &&
|
if (parentInventory != null && !parentInventory.Owner.Removed && !Removed &&
|
||||||
@@ -2490,12 +2424,15 @@ namespace Barotrauma
|
|||||||
parentInventory.RemoveItem(this);
|
parentInventory.RemoveItem(this);
|
||||||
parentInventory = null;
|
parentInventory = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetContainedItemPositions();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Equip(Character character)
|
public void Equip(Character character)
|
||||||
{
|
{
|
||||||
|
var should = new LuaResult(GameMain.Lua.hook.Call("itemEquip", new object[] { this, character}));
|
||||||
|
|
||||||
|
if (should.Bool())
|
||||||
|
return;
|
||||||
|
|
||||||
if (Removed)
|
if (Removed)
|
||||||
{
|
{
|
||||||
DebugConsole.ThrowError($"Tried to equip a removed item ({Name}).\n{Environment.StackTrace.CleanupStackTrace()}");
|
DebugConsole.ThrowError($"Tried to equip a removed item ({Name}).\n{Environment.StackTrace.CleanupStackTrace()}");
|
||||||
@@ -2507,6 +2444,11 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public void Unequip(Character character)
|
public void Unequip(Character character)
|
||||||
{
|
{
|
||||||
|
var should = new LuaResult(GameMain.Lua.hook.Call("itemUnequip", new object[] { this, character }));
|
||||||
|
|
||||||
|
if (should.Bool())
|
||||||
|
return;
|
||||||
|
|
||||||
foreach (ItemComponent ic in components) { ic.Unequip(character); }
|
foreach (ItemComponent ic in components) { ic.Unequip(character); }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2600,14 +2542,6 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
msg.Write((int)value);
|
msg.Write((int)value);
|
||||||
}
|
}
|
||||||
else if (value is string[] a)
|
|
||||||
{
|
|
||||||
msg.Write(a.Length);
|
|
||||||
for (int i = 0; i < a.Length; i++)
|
|
||||||
{
|
|
||||||
msg.Write(a[i] ?? "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new NotImplementedException("Serializing item properties of the type \"" + value.GetType() + "\" not supported");
|
throw new NotImplementedException("Serializing item properties of the type \"" + value.GetType() + "\" not supported");
|
||||||
@@ -2715,19 +2649,6 @@ namespace Barotrauma
|
|||||||
logValue = XMLExtensions.RectToString(val);
|
logValue = XMLExtensions.RectToString(val);
|
||||||
if (allowEditing) { property.TrySetValue(parentObject, val); }
|
if (allowEditing) { property.TrySetValue(parentObject, val); }
|
||||||
}
|
}
|
||||||
else if (type == typeof(string[]))
|
|
||||||
{
|
|
||||||
int arrayLength = msg.ReadInt32();
|
|
||||||
string[] val = new string[arrayLength];
|
|
||||||
for (int i = 0; i < arrayLength; i++)
|
|
||||||
{
|
|
||||||
val[i] = msg.ReadString();
|
|
||||||
}
|
|
||||||
if (allowEditing)
|
|
||||||
{
|
|
||||||
property.TrySetValue(parentObject, val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (typeof(Enum).IsAssignableFrom(type))
|
else if (typeof(Enum).IsAssignableFrom(type))
|
||||||
{
|
{
|
||||||
int intVal = msg.ReadInt32();
|
int intVal = msg.ReadInt32();
|
||||||
@@ -2763,9 +2684,10 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
CoroutineManager.StopCoroutines(logPropertyChangeCoroutine);
|
CoroutineManager.StopCoroutines(logPropertyChangeCoroutine);
|
||||||
}
|
}
|
||||||
logPropertyChangeCoroutine = CoroutineManager.Invoke(() =>
|
logPropertyChangeCoroutine = CoroutineManager.InvokeAfter(() =>
|
||||||
{
|
{
|
||||||
GameServer.Log($"{sender.Character.Name} set the value \"{property.Name}\" of the item \"{Name}\" to \"{logValue}\".", ServerLog.MessageType.ItemInteraction);
|
if(sender.Character != null)
|
||||||
|
GameServer.Log($"{sender.Character.Name} set the value \"{property.Name}\" of the item \"{Name}\" to \"{logValue}\".", ServerLog.MessageType.ItemInteraction);
|
||||||
}, delay: 1.0f);
|
}, delay: 1.0f);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -3152,8 +3074,6 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
connections?.Clear();
|
|
||||||
|
|
||||||
if (parentInventory != null)
|
if (parentInventory != null)
|
||||||
{
|
{
|
||||||
if (parentInventory is CharacterInventory characterInventory)
|
if (parentInventory is CharacterInventory characterInventory)
|
||||||
@@ -3179,8 +3099,6 @@ namespace Barotrauma
|
|||||||
body = null;
|
body = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
CurrentHull = null;
|
|
||||||
|
|
||||||
if (StaticFixtures != null)
|
if (StaticFixtures != null)
|
||||||
{
|
{
|
||||||
foreach (Fixture fixture in StaticFixtures)
|
foreach (Fixture fixture in StaticFixtures)
|
||||||
|
|||||||
Reference in New Issue
Block a user