diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/RoundSummary.cs b/Barotrauma/BarotraumaClient/Source/GameSession/RoundSummary.cs index 4e2228582..1c8d24f36 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/RoundSummary.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/RoundSummary.cs @@ -117,11 +117,20 @@ namespace Barotrauma (GameMain.GameSession.Mission.Completed) ? GameMain.GameSession.Mission.SuccessMessage : GameMain.GameSession.Mission.FailureMessage, "", innerFrame, true); + if (GameMain.GameSession.Mission.Completed) + { + GameMain.Server.ConnectedClients.ForEach(c => c.Karma += 0.1f); + } + if (GameMain.GameSession.Mission.Completed && singleplayer) { new GUITextBlock(new Rectangle(0, 0, 0, 30), "Reward: " + GameMain.GameSession.Mission.Reward, "", Alignment.BottomLeft, Alignment.BottomLeft, innerFrame); } } + else + { + GameMain.Server.ConnectedClients.ForEach(c => c.Karma += 0.1f); + } return frame; } diff --git a/Barotrauma/BarotraumaShared/Content/Jobs.xml b/Barotrauma/BarotraumaShared/Content/Jobs.xml index 60b174dcb..17fa0ac06 100644 --- a/Barotrauma/BarotraumaShared/Content/Jobs.xml +++ b/Barotrauma/BarotraumaShared/Content/Jobs.xml @@ -1,6 +1,6 @@  - + @@ -22,7 +22,7 @@ - + @@ -40,7 +40,7 @@ - + @@ -58,7 +58,7 @@ - + @@ -78,7 +78,7 @@ - + @@ -97,7 +97,7 @@ - + diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index 5ea4d2750..eced2d45c 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -1565,7 +1565,7 @@ namespace Barotrauma public virtual AttackResult AddDamage(IDamageable attacker, Vector2 worldPosition, Attack attack, float deltaTime, bool playSound = false) { Limb limbHit = null; - var attackResult = AddDamage(worldPosition, attack.DamageType, attack.GetDamage(deltaTime), attack.GetBleedingDamage(deltaTime), attack.Stun, playSound, attack.TargetForce, out limbHit); + var attackResult = AddDamage(worldPosition, attack.DamageType, attack.GetDamage(deltaTime), attack.GetBleedingDamage(deltaTime), attack.Stun, playSound, attack.TargetForce, out limbHit, attacker); if (limbHit == null) return new AttackResult(); var attackingCharacter = attacker as Character; @@ -1612,7 +1612,7 @@ namespace Barotrauma return AddDamage(worldPosition, damageType, amount, bleedingAmount, stun, playSound, attackForce, out temp); } - public AttackResult AddDamage(Vector2 worldPosition, DamageType damageType, float amount, float bleedingAmount, float stun, bool playSound, float attackForce, out Limb hitLimb) + public AttackResult AddDamage(Vector2 worldPosition, DamageType damageType, float amount, float bleedingAmount, float stun, bool playSound, float attackForce, out Limb hitLimb,IDamageable attacker=null) { hitLimb = null; @@ -1640,7 +1640,7 @@ namespace Barotrauma AttackResult attackResult = hitLimb.AddDamage(worldPosition, damageType, amount, bleedingAmount, playSound); - AddDamage(damageType == DamageType.Burn ? CauseOfDeath.Burn : causeOfDeath, attackResult.Damage, null); + AddDamage(damageType == DamageType.Burn ? CauseOfDeath.Burn : causeOfDeath, attackResult.Damage, attacker); if (DoesBleed) { diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Jobs/JobPrefab.cs b/Barotrauma/BarotraumaShared/Source/Characters/Jobs/JobPrefab.cs index 38e76744a..d757e6992 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Jobs/JobPrefab.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Jobs/JobPrefab.cs @@ -47,6 +47,12 @@ namespace Barotrauma private set; } + public float MinKarma + { + get; + private set; + } + public float Commonness { get; @@ -61,6 +67,7 @@ namespace Barotrauma MinNumber = element.GetAttributeInt("minnumber", 0); MaxNumber = element.GetAttributeInt("maxnumber", 10); + MinKarma = element.GetAttributeFloat("minkarma", 0.0f); Commonness = element.GetAttributeInt("commonness", 10); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs index 19b823cff..ba4afeea3 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs @@ -209,7 +209,7 @@ namespace Barotrauma.Items.Components if (progressBar != null) progressBar.Size = new Vector2(60.0f, 20.0f); #endif - targetStructure.AddDamage(sectionIndex, -StructureFixAmount * degreeOfSuccess); + targetStructure.AddDamage(sectionIndex, -StructureFixAmount * degreeOfSuccess,user); //if the next section is small enough, apply the effect to it as well //(to make it easier to fix a small "left-over" section) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Reactor.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Reactor.cs index b47b69d5a..9d25c3058 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Reactor.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Reactor.cs @@ -20,6 +20,8 @@ namespace Barotrauma.Items.Components private float temperature; + private Client BlameOnBroken; + //is automatic temperature control on //(adjusts the cooling rate automatically to keep the //amount of power generated balanced with the load) @@ -326,6 +328,14 @@ namespace Barotrauma.Items.Components if (containedItem == null) continue; containedItem.Condition = 0.0f; } + + if (GameMain.Server != null) + { + if (GameMain.Server.ConnectedClients.Contains(BlameOnBroken)) + { + BlameOnBroken.Karma = 0.0f; + } + } } public override bool Pick(Character picker) @@ -387,8 +397,12 @@ namespace Barotrauma.Items.Components float coolingRate = msg.ReadRangedSingle(0.0f, 100.0f, 8); float fissionRate = msg.ReadRangedSingle(0.0f, 100.0f, 8); - if (!item.CanClientAccess(c)) return; + if (!item.CanClientAccess(c)) return; + if (!autoTemp && AutoTemp) BlameOnBroken = c; + if (shutDownTemp > ShutDownTemp) BlameOnBroken = c; + if (fissionRate > FissionRate) BlameOnBroken = c; + AutoTemp = autoTemp; ShutDownTemp = shutDownTemp; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 5509a7026..1b18d156f 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -1329,6 +1329,8 @@ namespace Barotrauma Condition = prefab.Health; } + c.Karma += 0.4f; + GameMain.Server.CreateEntityEvent(this, new object[] { NetEntityEvent.Type.Status }); break; diff --git a/Barotrauma/BarotraumaShared/Source/Map/Structure.cs b/Barotrauma/BarotraumaShared/Source/Map/Structure.cs index d840b2171..b07761e33 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Structure.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Structure.cs @@ -709,7 +709,7 @@ namespace Barotrauma gapRect.Height += 20; sections[sectionIndex].gap = new Gap(gapRect, !isHorizontal, Submarine); sections[sectionIndex].gap.ConnectedWall = this; - AdjustKarma(attacker, 300); + //AdjustKarma(attacker, 300); #if CLIENT if(CastShadow) GenerateConvexHull(); #endif diff --git a/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs b/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs index e62b9a155..8f09f356f 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs @@ -2082,7 +2082,7 @@ namespace Barotrauma.Networking { //the maximum number of players that can have this job hasn't been reached yet // -> assign it to the client - if (assignedClientCount[preferredJob] < preferredJob.MaxNumber) + if (assignedClientCount[preferredJob] < preferredJob.MaxNumber && c.Karma >= preferredJob.MinKarma) { c.AssignedJob = preferredJob; assignedClientCount[preferredJob]++; @@ -2092,13 +2092,22 @@ namespace Barotrauma.Networking else if (preferredJob == c.JobPreferences.Last()) { //find all jobs that are still available - var remainingJobs = JobPrefab.List.FindAll(jp => assignedClientCount[preferredJob] < jp.MaxNumber); + var remainingJobs = JobPrefab.List.FindAll(jp => assignedClientCount[preferredJob] < jp.MaxNumber && c.Karma >= jp.MinKarma); //all jobs taken, give a random job if (remainingJobs.Count == 0) { DebugConsole.ThrowError("Failed to assign a suitable job for \"" + c.Name + "\" (all jobs already have the maximum numbers of players). Assigning a random job..."); - c.AssignedJob = JobPrefab.List[Rand.Range(0, JobPrefab.List.Count)]; + int jobIndex = Rand.Range(0,JobPrefab.List.Count); + int skips = 0; + while (c.Karma < JobPrefab.List[jobIndex].MinKarma) + { + jobIndex++; + skips++; + if (jobIndex >= JobPrefab.List.Count) jobIndex -= JobPrefab.List.Count; + if (skips >= JobPrefab.List.Count) break; + } + c.AssignedJob = JobPrefab.List[jobIndex]; assignedClientCount[c.AssignedJob]++; } else //some jobs still left, choose one of them by random @@ -2117,6 +2126,7 @@ namespace Barotrauma.Networking Client preferredClient = null; foreach (Client c in clients) { + if (c.Karma < job.MinKarma) continue; int index = c.JobPreferences.IndexOf(job); if (index == -1) index = 1000;