Fire extinguisher, burnt limbs, spectating improvements, option to disable spectating, jumpsuits for engi & mech, fireproof items, stuff

This commit is contained in:
Regalis
2015-11-18 20:02:45 +02:00
parent 7b6d92bb27
commit 9b08201972
36 changed files with 429 additions and 85 deletions
+6
View File
@@ -414,6 +414,9 @@
<Content Include="Content\Items\OxygenGenerator\oxygengenerator.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\Items\Tools\extinguisher.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Content\Items\Weapons\explosives.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -921,6 +924,9 @@
<None Include="Content\Items\Reactor\reactor.ogg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Content\Items\Tools\extinguisher.ogg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Content\Items\Tools\plasmaCutter.ogg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
+1 -1
View File
@@ -9,7 +9,7 @@
<ErrorReportUrlHistory />
<FallbackCulture>en-US</FallbackCulture>
<VerifyUploadedFiles>false</VerifyUploadedFiles>
<ProjectView>ShowAllFiles</ProjectView>
<ProjectView>ProjectFiles</ProjectView>
</PropertyGroup>
<PropertyGroup>
<ReferencePath>
+27 -3
View File
@@ -85,9 +85,10 @@
<Item
name="Orange Jumpsuit"
pickdistance="150"
tags="smallitem">
tags="smallitem"
fireproof="true">
<Sprite texture = "engigear.png" sourcerect="0,52,50,26" depth="0.6"/>
<Sprite texture = "engigear.png" sourcerect="0,52,50,25" depth="0.6"/>
<Body width="50" height="17"/>
@@ -102,8 +103,31 @@
<sprite texture="engigear.png" limb="LeftLeg" sourcerect="33,0,20,51" origin="0.5,0.5" depth="0.15" hidelimb="true"/>
</Wearable>
<ItemContainer containableitems="smallitem" capacity="5"/>
<ItemContainer containable="smallitem" capacity="5"/>
</Item>
<Item
name="Blue Jumpsuit"
pickdistance="150"
tags="smallitem"
fireproof="true">
<Sprite texture = "engigear.png" sourcerect="53,50,51,25" depth="0.6"/>
<Body width="50" height="17"/>
<Wearable slots="Any,Torso,Legs">
<sprite texture="engigear.png" limb="Torso" sourcerect="0,77,32,51" origin="0.5,0.48" depth="0.01"/>
<sprite texture="engigear.png" limb="Waist" sourcerect="81,77,30,26" origin="0.5,0.45" hidelimb="true"/>
<sprite texture="engigear.png" limb="RightThigh" sourcerect="53,77,27,49" origin="0.5,0.5" depth="0.10" hidelimb="true"/>
<sprite texture="engigear.png" limb="LeftThigh" sourcerect="53,77,27,49" origin="0.5,0.5" depth="0.14" hidelimb="true"/>
<sprite texture="engigear.png" limb="RightLeg" sourcerect="33,77,20,51" origin="0.5,0.5" depth="0.11" hidelimb="true"/>
<sprite texture="engigear.png" limb="LeftLeg" sourcerect="33,77,20,51" origin="0.5,0.5" depth="0.15" hidelimb="true"/>
</Wearable>
<ItemContainer containable="smallitem" capacity="5"/>
</Item>
</Items>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 24 KiB

@@ -45,13 +45,16 @@
<Item
name="Diving Suit"
pickdistance="200"
price="200">
price="200"
fireproof="true">
<Sprite texture ="DivingSuit.png" sourcerect="82,0,46,128" depth="0.55"/>
<Body width="37" height="113" density="5"/>
<Wearable slots="Head,Torso,Legs" armorvalue="10.0">
<sprite texture="DivingSuit.png" limb="Head" sourcerect="0,0,1,1" origin="0.5,0.5" hidelimb="true"/>
<sprite texture="DivingSuit.png" limb="Torso" sourcerect="40,0,42,97" origin="0.5,0.55" depthlimb="Head" hidelimb="true"/>
<sprite texture="DivingSuit.png" limb="RightHand" sourcerect="0,78,15,50" origin="0.45,0.4" hidelimb="true"/>
@@ -89,7 +92,7 @@
<Propulsion force="80" usablein="water" particles="bubbles">
<RequiredItems name="Battery Cell" type="Contained" msg="Battery Cell required"/>
<StatusEffect type="OnUse" target="Contained" targetnames="Battery Cell" Condition="-0.7"/>
<StatusEffect type="OnUse" target="Contained" targetnames="Battery Cell" Condition="-1.0"/>
<sound file="scooter.ogg" type="OnUse" range="500.0" loop="true"/>
</Propulsion>
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

+22 -1
View File
@@ -102,6 +102,28 @@
</StatusEffect>
</Holdable>
</Item>
<Item
name="Fire Extinguisher"
Tags="smallitem"
pickdistance="200"
price="100">
<Sprite texture ="extinguisher.png" depth="0.5" sourcerect="0,0,34,64" origin="0.4,0.5"/>
<Body radius="10" height="45" density="5"/>
<Holdable slots="Any,BothHands" controlpose="false"
aimpos="40,-20" handle1="-2,30"/>
<RepairTool extinquishamount="30.0" range="300" barrelpos="21,25" particles="extinguisher" particlespeed="650.0">
<StatusEffect type="OnUse" target="This" Condition="-2.0"/>
<sound file="extinguisher.ogg" type="OnUse" range="500.0" loop="true"/>
</RepairTool>
<Propulsion force="-20" usablein="water" particles="bubbles"/>
</Item>
<Item
name="Screwdriver"
@@ -132,7 +154,6 @@
aimpos="50,0" handle1="0,0" holdangle="30" reload="1.0">
<Attack damage="5" stun="0.2" damagetype="Blunt" sound="Content/Items/Weapons/smack.ogg"/>
</MeleeWeapon>
</Item>
</Items>
+2
View File
@@ -22,6 +22,7 @@
<Item name="ID Card"/>
<Item name="Wrench"/>
<Item name="Screwdriver"/>
<Item name="Orange Jumpsuit" equip="true"/>
</Job>
<Job name="Mechanic" description="Mechanics have high construction and mechanic skills. They are skilled at using tools such as plasma cutters and welders, and are usually the only ones who can fix broken mechanical devices." minnumber="1">
@@ -33,6 +34,7 @@
<Item name="ID Card"/>
<Item name="Wrench"/>
<Item name="Screwdriver"/>
<Item name="Blue Jumpsuit" equip="true"/>
</Job>
<Job name="Security Officer" description="Security officers are are responsible for keeping the submarine safe from potential attackers. The creatures inhabiting the ocean aren't the only threat they need to worry about, as several of the renegade groups opposing the Europa Coalition are known to have sent infiltrators on board the vessels." maxnumber="2">
@@ -10,7 +10,9 @@
growtime ="0.2"
collideswithwalls="true"
velocitychange="0.0, -9.8">
<sprite texture="Content/Particles/spatter.png"/>
<sprite texture="Content/Particles/spatter.png" sourcerect="0,0,128,128"/>
<sprite texture="Content/Particles/spatter.png" sourcerect="128,0,128,128"/>
<sprite texture="Content/Particles/spatter.png" sourcerect="0,128,128,128"/>
</watersplash>
<mist
@@ -22,7 +24,7 @@
growtime ="0.2"
lifetime="3"
velocitychange="0.0, -0.05">
<sprite texture="Content/Particles/spatter.png"/>
<sprite texture="Content/Particles/spatter.png" sourcerect="128,128,128,128"/>
</mist>
<dustcloud
@@ -33,7 +35,9 @@
colorchange="0.0, 0.0, 0.0, -0.3"
lifetime="3"
velocitychange="0.0, -5.0">
<sprite texture="Content/Particles/spatter.png"/>
<sprite texture="Content/Particles/spatter.png" sourcerect="0,0,128,128"/>
<sprite texture="Content/Particles/spatter.png" sourcerect="128,0,128,128"/>
<sprite texture="Content/Particles/spatter.png" sourcerect="0,128,128,128"/>
</dustcloud>
<bubbles
@@ -60,7 +64,9 @@
deleteoncollision="true"
rotatetodirection="true"
velocitychange="0.0, -9.8">
<sprite texture="Content/Particles/blood.png"/>
<sprite texture="Content/Particles/spatter.png" sourcerect="0,0,128,128"/>
<sprite texture="Content/Particles/spatter.png" sourcerect="128,0,128,128"/>
<sprite texture="Content/Particles/spatter.png" sourcerect="0,128,128,128"/>
</blood>
<waterblood
@@ -72,7 +78,7 @@
lifetime="5.0"
drawtarget="water"
velocitychange="0.0, 0.0">
<sprite texture="Content/Particles/spatter.png"/>
<sprite texture="Content/Particles/spatter.png" sourcerect="128,128,128,128"/>
</waterblood>
<spark
@@ -98,7 +104,7 @@
startcolor="1.0, 1.0, 1.0" startalpha="1.0"
colorchange="0.0, 0.0, 0.0, -2.0"
lifetime="1.0"
drawtarget="both"
drawtarget="both"
velocitychange="0.0, 0.0">
<sprite texture="Content/Particles/explosion.png" sourcerect="0,128,128,128"/>
</shockwave>
@@ -128,10 +134,25 @@
growtime ="0.2"
lifetime="3"
collideswithwalls="true"
collisionradius="30.0"
velocitychange="0.0, 2.5">
<sprite texture="Content/Particles/spatter.png"/>
<sprite texture="Content/Particles/spatter.png" sourcerect="128,128,128,128"/>
</steam>
<smoke
startsizemin="0.4,0.4" startsizemax="0.5,0.5"
sizechangemin="0.25,0.25" sizechangemax="0.3,0.3"
startrotationmin ="0.0" startrotationmax="360"
startcolor="0.0, 0.0, 0.0" startalpha="0.5"
colorchange="0.0, 0.0, 0.0, -0.25"
growtime ="0.2"
lifetime="3"
collideswithwalls="true"
collisionradius="30.0"
velocitychange="0.0, 2.5">
<sprite texture="Content/Particles/spatter.png" sourcerect="128,128,128,128"/>
</smoke>
<explosionfire
startsizemin="1.0,1.0" startsizemax="1.5,1.5"
sizechangemin="0.5,0.5" sizechangemax="0.6,0.6"
@@ -170,4 +191,19 @@
velocitychange="0.0, 0.0">
<sprite texture="Content/Particles/flames.png" sourcerect="0,64,128,64" origin="0.15,0.5"/>
</plasma>
<extinguisher
startsizemin="1.2,1.2" startsizemax="1.5,1.5"
sizechangemin="1.5,1.5" sizechangemax="2.0,2.0"
startrotationmin ="0.0" startrotationmax="360"
startcolor="1.0, 1.0, 1.0" startalpha="0.5"
colorchange="0.0, 0.0, 0.0, -0.8"
collideswithwalls="true"
growtime ="0.3"
lifetime="3"
collisionradius="30.0"
restitution="0.1"
velocitychange="0.0, -0.5">
<sprite texture="Content/Particles/spatter.png" sourcerect="128,128,128,128"/>
</extinguisher>
</prefabs>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 43 KiB

@@ -111,6 +111,8 @@ namespace Barotrauma
aiController.FillNetworkData(message);
return true;
case NetworkEventType.EntityUpdate:
if (AnimController.RefLimb.SimPosition.Length() > NetConfig.CharacterIgnoreDistance) return false;
message.Write((float)NetTime.Now);
message.Write(AnimController.TargetDir == Direction.Right);
+2 -2
View File
@@ -8,10 +8,10 @@ namespace Barotrauma
{
enum CauseOfDeath
{
Damage, Bloodloss, Pressure, Suffocation, Drowning
Damage, Bloodloss, Pressure, Suffocation, Drowning, Burn
}
public enum DamageType { None, Blunt, Slash }
public enum DamageType { None, Blunt, Slash, Burn }
public enum AttackType
{
@@ -272,6 +272,7 @@ namespace Barotrauma
DeathMsg[(int)CauseOfDeath.Drowning] = "drowned";
DeathMsg[(int)CauseOfDeath.Suffocation] = "suffocated";
DeathMsg[(int)CauseOfDeath.Pressure] = "been crushed by water pressure";
DeathMsg[(int)CauseOfDeath.Burn] = "burnt to death";
}
public Character(string file) : this(file, Vector2.Zero, null)
@@ -1030,6 +1031,8 @@ namespace Barotrauma
AttackResult attackResult = closestLimb.AddDamage(simPosition, damageType, amount, bleedingAmount, playSound);
health -= attackResult.Damage;
if (health <= 0.0f && damageType == DamageType.Burn) Kill(CauseOfDeath.Burn);
bleeding += attackResult.Bleeding;
return attackResult;
+11 -2
View File
@@ -50,7 +50,7 @@ namespace Barotrauma
public readonly float impactTolerance;
private float damage;
private float damage, burnt;
private readonly Vector2 armorSector;
private readonly float armorValue;
@@ -138,6 +138,12 @@ namespace Barotrauma
get { return stepOffset; }
}
public float Burnt
{
get { return burnt; }
set { burnt = MathHelper.Clamp(value,0.0f,100.0f); }
}
//public float Damage
//{
// get { return damage; }
@@ -381,6 +387,8 @@ namespace Barotrauma
if (!character.IsDead) damage = Math.Max(0.0f, damage-deltaTime*0.1f);
if (burnt > 0.0f) Burnt -= deltaTime;
if (LinearVelocity.X>100.0f)
{
//DebugConsole.ThrowError("CHARACTER EXPLODED");
@@ -435,7 +443,8 @@ namespace Barotrauma
public void Draw(SpriteBatch spriteBatch)
{
Color color = Color.White;// new Color(1.0f, 1.0f - damage / maxHealth, 1.0f - damage / maxHealth);
float brightness = 1.0f - (burnt / 100.0f) * 0.5f;
Color color = new Color(brightness, brightness, brightness);
body.Dir = Dir;
@@ -21,8 +21,6 @@ namespace Barotrauma.Items.Components
private string particles;
float structureFixAmount, limbFixAmount;
[HasDefaultValue(0.0f, false)]
public float Range
{
@@ -33,15 +31,18 @@ namespace Barotrauma.Items.Components
[HasDefaultValue(0.0f, false)]
public float StructureFixAmount
{
get { return structureFixAmount; }
set { structureFixAmount = value; }
get; set;
}
[HasDefaultValue(0.0f, false)]
public float LimbFixAmount
{
get { return limbFixAmount; }
set { limbFixAmount = value; }
get; set;
}
[HasDefaultValue(0.0f, false)]
public float ExtinquishAmount
{
get; set;
}
[HasDefaultValue("", false)]
@@ -51,6 +52,12 @@ namespace Barotrauma.Items.Components
set { particles = value; }
}
[HasDefaultValue(0.0f, false)]
public float ParticleSpeed
{
get; set;
}
[HasDefaultValue("0.0,0.0", false)]
public string BarrelPos
{
@@ -130,9 +137,18 @@ namespace Barotrauma.Items.Components
ignoredBodies.Add(limb.body.FarseerBody);
}
Body targetBody = Submarine.PickBody(TransformedBarrelPos, targetPosition, ignoredBodies);
pickedPosition = Submarine.LastPickedPosition;
if (ExtinquishAmount > 0.0f)
{
Vector2 displayPos = ConvertUnits.ToDisplayUnits(TransformedBarrelPos + (targetPosition-TransformedBarrelPos)*Submarine.LastPickedFraction*0.9f);
Hull hull = Hull.FindHull(displayPos, item.CurrentHull);
if (hull != null) hull.Extinquish(deltaTime, ExtinquishAmount, displayPos);
}
if (targetBody == null || targetBody.UserData == null) return true;
Structure targetStructure;
@@ -147,7 +163,7 @@ namespace Barotrauma.Items.Components
targetStructure.HighLightSection(sectionIndex);
targetStructure.AddDamage(sectionIndex, -structureFixAmount*degreeOfSuccess);
targetStructure.AddDamage(sectionIndex, -StructureFixAmount*degreeOfSuccess);
//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)
@@ -155,7 +171,7 @@ namespace Barotrauma.Items.Components
if (nextSectionLength > 0 && nextSectionLength < Structure.wallSectionSize * 0.3f)
{
targetStructure.HighLightSection(sectionIndex + 1);
targetStructure.AddDamage(sectionIndex + 1, -structureFixAmount * degreeOfSuccess);
targetStructure.AddDamage(sectionIndex + 1, -StructureFixAmount * degreeOfSuccess);
}
}
@@ -163,7 +179,7 @@ namespace Barotrauma.Items.Components
{
if (character.IsKeyDown(InputType.Aim))
{
targetLimb.character.Health += limbFixAmount * degreeOfSuccess;
targetLimb.character.Health += LimbFixAmount * degreeOfSuccess;
//isActive = true;
}
}
@@ -180,7 +196,6 @@ namespace Barotrauma.Items.Components
}
//ApplyStatusEffects(ActionType.OnUse, 1.0f, null, targ);
}
//if (Character.SecondaryKeyDown.State)
//{
// IPropertyObject propertyObject = targetBody.UserData as IPropertyObject;
@@ -210,7 +225,7 @@ namespace Barotrauma.Items.Components
if (!string.IsNullOrWhiteSpace(particles))
{
GameMain.ParticleManager.CreateParticle(particles, ConvertUnits.ToDisplayUnits(TransformedBarrelPos),
-item.body.Rotation + ((item.body.Dir>0.0f) ? 0.0f : MathHelper.Pi), 0.0f);
-item.body.Rotation + ((item.body.Dir>0.0f) ? 0.0f : MathHelper.Pi), ParticleSpeed);
}
//Vector2 startPos = ConvertUnits.ToDisplayUnits(item.body.Position);
@@ -182,7 +182,7 @@ namespace Barotrauma.Items.Components
IsActive = false;
if (activator != null) activator.AnimController.Anim = AnimController.Animation.None;
return false;
return true;
}
else
{
@@ -12,6 +12,8 @@ namespace Barotrauma.Items.Components
static float fullPower;
static float fullLoad;
const float FireProbability = 0.15f;
//affects how fast changes in power/load are carried over the grid
static float inertia = 5.0f;
@@ -71,7 +73,10 @@ namespace Barotrauma.Items.Components
if (particle != null) particle.Size *= Rand.Range(0.5f, 1.0f);
}
new FireSource(pt.item.Position);
if (FireProbability > 0.0f && Rand.Int((int)(1.0f / FireProbability)) == 1)
{
new FireSource(pt.item.Position);
}
}
}
+2 -1
View File
@@ -119,7 +119,7 @@ namespace Barotrauma
if (item.inventory != null && removeItem)
{
item.Drop(null, false);
item.inventory.RemoveItem(item);
if (item.inventory != null) item.inventory.RemoveItem(item);
}
items[i] = item;
@@ -139,6 +139,7 @@ namespace Barotrauma
{
if (items[n] != item) continue;
items[n] = null;
item.inventory = null;
}
}
+1 -1
View File
@@ -594,7 +594,7 @@ namespace Barotrauma
body.ApplyTorque(body.AngularVelocity * volume * -0.05f);
}
public override void Draw(SpriteBatch spriteBatch, bool editing)
public override void Draw(SpriteBatch spriteBatch, bool editing, bool back = true)
{
Color color = (isSelected && editing) ? color = Color.Red : spriteColor;
if (isHighlighted) color = Color.Orange;
+1 -1
View File
@@ -15,7 +15,7 @@ namespace Barotrauma
protected AITarget aiTarget;
//protected float soundRange;
//protected float sightRange;
public ushort ID
{
get { return id; }
+98 -25
View File
@@ -23,15 +23,26 @@ namespace Barotrauma
Vector2 position;
Vector2 size;
public Vector2 Position
{
get { return position; }
set
{
if (!MathUtils.IsValid(value)) return;
position = value;
}
}
public Vector2 Size
{
get { return size; }
}
public FireSource(Vector2 position)
public FireSource(Vector2 position, Hull spawningHull = null, bool networkEvent=false)
{
hull = Hull.FindHull(position);
if (hull == null) return;
hull = Hull.FindHull(position, spawningHull);
if (hull == null || (!networkEvent && GameMain.Client!=null)) return;
if (fireSoundBasic==null)
{
@@ -41,7 +52,7 @@ namespace Barotrauma
lightSource = new LightSource(position, 50.0f, new Color(1.0f, 0.9f, 0.6f));
hull.AddFireSource(this);
hull.AddFireSource(this, !networkEvent);
this.position = position - new Vector2(-5.0f, 5.0f);
@@ -87,33 +98,47 @@ namespace Barotrauma
}
}
public bool Contains(Vector2 pos)
{
return pos.X > position.X && pos.X<position.X + size.X;
}
private bool CheckOverLap(FireSource fireSource)
{
return !(position.X > fireSource.position.X + fireSource.size.X &&
return !(position.X > fireSource.position.X + fireSource.size.X ||
position.X + size.X < fireSource.position.X);
}
public void Update(float deltaTime)
{
float count = Rand.Range(0.0f, (float)Math.Sqrt(size.X)/2.0f);
float count = Rand.Range(0.0f, (float)Math.Sqrt(size.X)/3.0f);
basicSoundIndex = fireSoundBasic.Loop(basicSoundIndex, Math.Min(size.X/100.0f,1.0f), position+size/2.0f, 2000.0f);
largeSoundIndex = fireSoundLarge.Loop(largeSoundIndex, MathHelper.Clamp((size.X-200.0f) / 100.0f, 0.0f, 1.0f), position + size / 2.0f, 2000.0f);
if (fireSoundBasic != null)
{
basicSoundIndex = fireSoundBasic.Loop(basicSoundIndex,
Math.Min(size.X / 100.0f, 1.0f), position + size / 2.0f, 2000.0f);
}
if (fireSoundLarge != null)
{
largeSoundIndex = fireSoundLarge.Loop(largeSoundIndex,
MathHelper.Clamp((size.X - 200.0f) / 100.0f, 0.0f, 1.0f), position + size / 2.0f, 2000.0f);
}
if (size.X>50.0f)
{
this.position.Y = MathHelper.Lerp(this.position.Y, hull.Rect.Y - hull.Rect.Height, deltaTime);
}
float growModifier = hull.OxygenPercentage < 20.0f ? (hull.OxygenPercentage/10.0f)-1.0f : 1.0f;
for (int i = 0; i < count; i++ )
{
float normalizedPos = 0.5f-(i / count);
Vector2 spawnPos = new Vector2(position.X + Rand.Range(0.0f, size.X), Rand.Range(position.Y - size.Y, position.Y)+10.0f);
Vector2 speed = new Vector2((spawnPos.X - (position.X + size.X/2.0f)), (float)Math.Sqrt(size.X)*Rand.Range(10.0f,15.0f));
Vector2 speed = new Vector2((spawnPos.X - (position.X + size.X/2.0f)), (float)Math.Sqrt(size.X)*Rand.Range(10.0f,15.0f)*growModifier);
var particle = GameMain.ParticleManager.CreateParticle("flame",
spawnPos, speed, 0.0f, hull);
@@ -122,22 +147,29 @@ namespace Barotrauma
if (Rand.Int(20) == 1) particle.OnChangeHull = OnChangeHull;
particle.Size *= MathHelper.Clamp(size.X/100.0f * Math.Max(hull.Oxygen/hull.FullVolume, 0.4f), 0.5f, 4.0f);
particle.Size *= MathHelper.Clamp(size.X/100.0f * (hull.Oxygen/hull.FullVolume), 0.5f, 4.0f);
if (size.X < 100.0f) continue;
var smokeParticle = GameMain.ParticleManager.CreateParticle("smoke",
spawnPos, speed, 0.0f, hull);
if (smokeParticle != null)
{
smokeParticle.Size *= MathHelper.Clamp(size.X / 100.0f * Math.Max(hull.Oxygen / hull.FullVolume, 0.4f), 0.5f, 4.0f);
}
}
DamageCharacters(deltaTime);
DamageItems(deltaTime);
if (hull.Volume > 0.0f) Extinquish(deltaTime);
if (hull.Volume > 0.0f) HullWaterExtinquish(deltaTime);
lightSource.Range = Math.Max(size.X, size.Y)*Rand.Range(8.0f, 10.0f)/2.0f;
lightSource.Range = Math.Max(size.X, size.Y) * Rand.Range(8.0f, 10.0f)/2.0f;
lightSource.Color = new Color(1.0f, 0.9f, 0.6f) * Rand.Range(0.8f, 1.0f);
hull.Oxygen -= size.X*deltaTime*OxygenConsumption;
float growModifier = hull.OxygenPercentage < 20.0f ? (hull.OxygenPercentage/10.0f)-1.0f : 1.0f;
position.X -= GrowSpeed * growModifier * 0.5f * deltaTime;
//position.Y += GrowSpeed*0.5f * deltaTime;
@@ -151,7 +183,7 @@ namespace Barotrauma
{
if (particleHull == hull || particleHull==null) return;
if (particleHull.FireSources.Find(fs => pos.X > fs.position.X && pos.X < fs.position.X+fs.size.X)!=null) return;
if (particleHull.FireSources.Find(fs => pos.X > fs.position.X-100.0f && pos.X < fs.position.X+fs.size.X+100.0f)!=null) return;
new FireSource(new Vector2(pos.X, particleHull.Rect.Y-particleHull.Rect.Height + 5.0f));
}
@@ -164,11 +196,17 @@ namespace Barotrauma
{
if (c.AnimController.CurrentHull == null) continue;
float range = (float)Math.Sqrt(size.X) * 10.0f;
float range = (float)Math.Sqrt(size.X) * 20.0f;
if (c.Position.X < position.X - range || c.Position.X > position.X + size.X + range) continue;
if (c.Position.Y < position.Y - size.Y || c.Position.Y > hull.Rect.Y) continue;
c.Health -= (float)Math.Sqrt(size.X) * deltaTime;
float dmg = (float)Math.Sqrt(size.X) * deltaTime / c.AnimController.Limbs.Count();
foreach (Limb limb in c.AnimController.Limbs)
{
if (limb.WearingItem != null && limb.WearingItem.Item.FireProof) continue;
limb.Burnt += dmg * 10.0f;
c.AddDamage(limb.SimPosition, DamageType.None, dmg, 0,0,false);
}
}
}
@@ -179,20 +217,21 @@ namespace Barotrauma
foreach (Item item in Item.ItemList)
{
if (item.CurrentHull != hull || item.FireProof || item.Condition <= 0.0f) continue;
if (item.inventory != null) return;
float range = (float)Math.Sqrt(size.X) * 10.0f;
if (item.Position.X < position.X - range || item.Position.X > position.X + size.X + range) continue;
if (item.Position.Y < position.Y - size.Y || item.Position.Y > hull.Rect.Y) continue;
item.Condition -= (float)Math.Sqrt(size.X) * deltaTime;
//item.Condition -= (float)Math.Sqrt(size.X) * deltaTime;
item.ApplyStatusEffects(ActionType.OnFire, deltaTime);
}
}
private void Extinquish(float deltaTime)
private void HullWaterExtinquish(float deltaTime)
{
float extinquishAmount = Math.Min(hull.Volume / 100.0f, size.X);
float extinquishAmount = Math.Min(hull.Volume / 100.0f, size.X)*10.0f*deltaTime;
float steamCount = Rand.Range(-5.0f, (float)Math.Sqrt(extinquishAmount));
@@ -210,16 +249,50 @@ namespace Barotrauma
particle.Size *= MathHelper.Clamp(size.X / 10.0f, 0.5f, 3.0f);
}
position.X += extinquishAmount * 0.1f / 2.0f;
size.X -= extinquishAmount * 0.1f;
position.X += extinquishAmount / 2.0f;
size.X -= extinquishAmount;
hull.Volume -= extinquishAmount;
if (size.X < 1.0f) Remove();
}
public void Remove()
public void Extinquish(float deltaTime, float amount, Vector2 pos)
{
float range = 100.0f;
if (pos.X < position.X-range || pos.X > position.X + size.X+range) return;
if (pos.Y < position.Y - size.Y || pos.Y > position.Y + 500.0f) return;
float extinquishAmount = amount * deltaTime;
float steamCount = Rand.Range(-5.0f, (float)Math.Sqrt(amount));
for (int i = 0; i < steamCount; i++)
{
Vector2 spawnPos = new Vector2(pos.X + Rand.Range(-5.0f, 5.0f), Rand.Range(position.Y - size.Y, position.Y) + 10.0f);
Vector2 speed = new Vector2((spawnPos.X - (position.X + size.X / 2.0f)), (float)Math.Sqrt(size.X) * Rand.Range(20.0f, 25.0f));
var particle = GameMain.ParticleManager.CreateParticle("steam",
spawnPos, speed, 0.0f, hull);
if (particle == null) continue;
particle.Size *= MathHelper.Clamp(size.X / 10.0f, 0.5f, 3.0f);
}
position.X += extinquishAmount / 2.0f;
size.X -= extinquishAmount;
hull.Volume -= extinquishAmount;
if (size.X < 1.0f) Remove();
}
public void Remove(bool isNetworkEvent = false)
{
if (!isNetworkEvent && GameMain.Client != null) return;
lightSource.Remove();
if (basicSoundIndex > -1) Sounds.SoundManager.Stop(basicSoundIndex);
+1 -1
View File
@@ -172,7 +172,7 @@ namespace Barotrauma
//}
}
public override void Draw(SpriteBatch sb, bool editing)
public override void Draw(SpriteBatch sb, bool editing, bool back = true)
{
if (GameMain.DebugDraw)
{
+63 -2
View File
@@ -212,9 +212,13 @@ namespace Barotrauma
hullList.Remove(this);
}
public void AddFireSource(FireSource fireSource)
public void AddFireSource(FireSource fireSource, bool createNetworkEvent = true)
{
fireSources.Add(fireSource);
if (createNetworkEvent)
{
new Networking.NetworkEvent(Networking.NetworkEventType.ImportantEntityUpdate, this.ID, false);
}
}
public override void Update(Camera cam, float deltaTime)
@@ -327,12 +331,21 @@ namespace Barotrauma
}
}
public void Extinquish(float deltaTime, float amount, Vector2 position)
{
for (int i = fireSources.Count - 1; i >= 0; i-- )
{
fireSources[i].Extinquish(deltaTime, amount, position);
}
}
public void RemoveFire(FireSource fire)
{
fireSources.Remove(fire);
new Networking.NetworkEvent(Networking.NetworkEventType.ImportantEntityUpdate, this.ID, false);
}
public override void Draw(SpriteBatch spriteBatch, bool editing)
public override void Draw(SpriteBatch spriteBatch, bool editing, bool back = true)
{
if (!editing && !GameMain.DebugDraw) return;
@@ -533,6 +546,16 @@ namespace Barotrauma
{
message.WriteRangedSingle(MathHelper.Clamp(volume/FullVolume, 0.0f, 1.5f), 0.0f, 1.5f, 6);
message.Write((byte)fireSources.Count, 4);
foreach (FireSource fireSource in fireSources)
{
Vector2 normalizedPos = new Vector2(
(fireSource.Position.X - rect.X) / rect.Width,
(fireSource.Position.Y - (rect.Y - rect.Height))/rect.Height);
message.WriteRangedSingle(MathHelper.Clamp(normalizedPos.X, 0.0f, 1.0f), 0.0f, 1.0f, 4);
message.WriteRangedSingle(MathHelper.Clamp(normalizedPos.Y, 0.0f, 1.0f), 0.0f, 1.0f, 4);
}
return true;
}
@@ -554,6 +577,44 @@ namespace Barotrauma
}
Volume = newVolume;
int fireSourceCount = message.ReadByte(4);
List<FireSource> newFireSources = new List<FireSource>();
for (int i = 0; i < fireSourceCount; i++)
{
Vector2 pos = Vector2.Zero;
pos.X = message.ReadRangedSingle(0.0f, 1.0f, 4);
pos.Y = message.ReadRangedSingle(0.0f, 1.0f, 4);
if (!MathUtils.IsValid(pos)) continue;
pos.X = MathHelper.Clamp(pos.X, 0.05f, 0.95f);
pos.Y = MathHelper.Clamp(pos.Y, 0.05f, 0.95f);
pos = new Vector2(rect.X + rect.Width * pos.X, rect.Y - rect.Height + (rect.Height * pos.Y));
var existingFire = fireSources.Find(fs => fs.Contains(pos));
if (existingFire!=null)
{
newFireSources.Add(existingFire);
existingFire.Position = pos;
}
else
{
var newFire = new FireSource(pos, this, true);
//ignore if the fire wasn't added to this room (invalid position)?
if (!fireSources.Contains(newFire)) continue;
newFireSources.Add(newFire);
}
}
var toBeRemoved = fireSources.FindAll(fs => !newFireSources.Contains(fs));
for (int i = toBeRemoved.Count - 1; i >= 0; i--)
{
toBeRemoved[i].Remove(true);
}
fireSources = newFireSources;
}
+1 -1
View File
@@ -172,7 +172,7 @@ namespace Barotrauma
mapEntityList.Insert(i, this);
}
public virtual void Draw(SpriteBatch spriteBatch, bool editing) {}
public virtual void Draw(SpriteBatch spriteBatch, bool editing, bool back=true) {}
public override void Remove()
{
+1 -1
View File
@@ -284,7 +284,7 @@ namespace Barotrauma
}
public override void Draw(SpriteBatch spriteBatch, bool editing)
public override void Draw(SpriteBatch spriteBatch, bool editing, bool back = true)
{
if (prefab.sprite == null) return;
+1 -1
View File
@@ -61,7 +61,7 @@ namespace Barotrauma
}
public override void Draw(SpriteBatch spriteBatch, bool editing)
public override void Draw(SpriteBatch spriteBatch, bool editing, bool back=true)
{
if (!editing && !GameMain.DebugDraw) return;
+12 -5
View File
@@ -207,12 +207,16 @@ namespace Barotrauma.Networking
{
myID = inc.ReadInt32();
gameStarted = inc.ReadBoolean();
if (gameStarted && Screen.Selected != GameMain.GameScreen)
{
new GUIMessageBox("Please wait", "A round is already running. You will have to wait for a new round to start.");
}
bool hasCharacter = inc.ReadBoolean();
bool allowSpectating = inc.ReadBoolean();
if (gameStarted && Screen.Selected != GameMain.GameScreen)
{
new GUIMessageBox("Please wait",
(allowSpectating) ?
"A round is already running, but you can spectate the game while waiting for a new one to start." :
"A round is already running and the admin has disabled spectating. You will have to wait for a new round to start.");
}
if (gameStarted && !hasCharacter && myCharacter!=null)
{
@@ -221,6 +225,7 @@ namespace Barotrauma.Networking
new GUIMessageBox("Connection timed out", "You were disconnected for too long and your Character was deleted. Please wait for another round to start.");
}
GameMain.NetLobbyScreen.ClearPlayers();
//add the names of other connected clients to the lobby screen
@@ -686,6 +691,8 @@ namespace Barotrauma.Networking
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
if (button != null) button.Enabled = false;
return false;
}
+43 -3
View File
@@ -362,6 +362,7 @@ namespace Barotrauma.Networking
outmsg.Write(sender.ID);
outmsg.Write(gameStarted);
outmsg.Write(gameStarted && sender.Character!=null);
outmsg.Write(allowSpectating);
//notify the client about other clients already logged in
outmsg.Write((characterInfo == null) ? ConnectedClients.Count - 1 : ConnectedClients.Count);
@@ -461,12 +462,13 @@ namespace Barotrauma.Networking
Voting.RegisterVote(inc, ConnectedClients);
break;
case (byte)PacketTypes.SpectateRequest:
if (gameStarted)
if (gameStarted && allowSpectating)
{
var startMessage = CreateStartMessage(roundStartSeed, Submarine.Loaded, GameMain.GameSession.gameMode.Preset);
server.SendMessage(startMessage, inc.SenderConnection, NetDeliveryMethod.ReliableUnordered);
dataSender.Spectating = true;
CoroutineManager.StartCoroutine(SyncSpectator(dataSender));
}
break;
}
@@ -605,11 +607,14 @@ namespace Barotrauma.Networking
}
private void SendNetworkEvents()
private void SendNetworkEvents(List<Client> recipients = null)
{
if (NetworkEvent.Events.Count == 0) return;
List<Client> recipients = ConnectedClients.FindAll(c => c.Character != null || c.Spectating);
if (recipients == null)
{
recipients = ConnectedClients.FindAll(c => c.Character != null || c.Spectating);
}
if (recipients.Count == 0) return;
@@ -635,6 +640,41 @@ namespace Barotrauma.Networking
NetworkEvent.Events.Clear();
}
private IEnumerable<object> SyncSpectator(Client sender)
{
yield return new WaitForSeconds(3.0f);
var existingEvents = NetworkEvent.Events;
NetworkEvent.Events.Clear();
foreach (Hull hull in Hull.hullList)
{
if (!hull.FireSources.Any() && hull.Volume < 0.01f) continue;
new NetworkEvent(NetworkEventType.ImportantEntityUpdate, hull.ID, false);
}
SendNetworkEvents(new List<Client>() { sender });
foreach (Character c in Character.CharacterList)
{
new NetworkEvent(NetworkEventType.EntityUpdate, c.ID, false);
if (c.Inventory != null) new NetworkEvent(NetworkEventType.InventoryUpdate, c.ID, false);
if (c.IsDead) new NetworkEvent(NetworkEventType.KillCharacter, c.ID, false);
}
SendNetworkEvents(new List<Client>() { sender });
foreach (Item item in Item.ItemList)
{
if (item.body == null || item.body.Enabled == false) continue;
new NetworkEvent(NetworkEventType.DropItem, item.ID, false);
}
SendNetworkEvents(new List<Client>() { sender });
yield return CoroutineStatus.Success;
}
public bool StartGameClicked(GUIButton button, object obj)
{
@@ -34,6 +34,8 @@ namespace Barotrauma.Networking
private bool autoRestart;
private bool allowSpectating = true;
public bool AutoRestart
{
get { return (ConnectedClients.Count == 0) ? false : autoRestart; }
@@ -65,6 +67,11 @@ namespace Barotrauma.Networking
get { return banList; }
}
public bool AllowSpectating
{
get { return allowSpectating; }
}
private void CreateSettingsFrame()
{
settingsFrame = new GUIFrame(new Rectangle(0,0,GameMain.GraphicsWidth,GameMain.GraphicsHeight), Color.Black*0.5f);
@@ -94,6 +101,13 @@ namespace Barotrauma.Networking
selectionTick.UserData = (SelectionMode)i;
}
var allowSpecBox = new GUITickBox(new Rectangle(0, 0, 20, 20), "Allow spectating", Alignment.Left, innerFrame);
allowSpecBox.Selected = true;
allowSpecBox.OnSelected = ToggleAllowSpectating;
var closeButton = new GUIButton(new Rectangle(0, 0, 100, 20), "Close", Alignment.BottomRight, GUI.Style, innerFrame);
closeButton.OnClicked = ToggleSettingsFrame;
}
@@ -144,6 +158,12 @@ namespace Barotrauma.Networking
return true;
}
private bool ToggleAllowSpectating(GUITickBox tickBox)
{
allowSpectating = tickBox.Selected;
return true;
}
public bool ToggleSettingsFrame(GUIButton button, object obj)
{
if (settingsFrame==null)
+7 -7
View File
@@ -68,6 +68,7 @@ namespace Barotrauma.Particles
public void Init(ParticlePrefab prefab, Vector2 position, Vector2 speed, float rotation, Hull hullGuess = null)
{
this.prefab = prefab;
spriteIndex = Rand.Int(prefab.Sprites.Count);
@@ -77,7 +78,8 @@ namespace Barotrauma.Particles
drawPosition = position;
velocity = speed;
velocity = MathUtils.IsValid(speed) ? speed : Vector2.Zero;
this.rotation = rotation + Rand.Range(prefab.StartRotationMin, prefab.StartRotationMax);
prevRotation = rotation;
@@ -172,12 +174,12 @@ namespace Barotrauma.Particles
if (!gap.isHorizontal)
{
if (gap.Rect.X > position.X || gap.Rect.Right < position.X) continue;
if (Math.Sign(velocity.Y) != Math.Sign(gap.Rect.Y - position.Y)) continue;
if (Math.Sign(velocity.Y) != Math.Sign(gap.Rect.Y - (currentHull.Rect.Y-currentHull.Rect.Height))) continue;
}
else
{
if (gap.Rect.Y < position.Y || gap.Rect.Y - gap.Rect.Height > position.Y) continue;
if (Math.Sign(velocity.X) != Math.Sign(gap.Rect.X - position.X)) continue;
if (Math.Sign(velocity.X) != Math.Sign(gap.Rect.Center.X - currentHull.Rect.Center.X)) continue;
}
//Rectangle enlargedRect = new Rectangle(gap.Rect.X - 10, gap.Rect.Y + 10, gap.Rect.Width + 20, gap.Rect.Height + 20);
@@ -221,9 +223,7 @@ namespace Barotrauma.Particles
}
private void OnWallCollision(Hull prevHull, Vector2 position)
{
float restitution = 0.5f;
{
if (position.Y < prevHull.Rect.Y - prevHull.Rect.Height)
{
position.Y = prevHull.Rect.Y - prevHull.Rect.Height + 1.0f;
@@ -247,7 +247,7 @@ namespace Barotrauma.Particles
velocity.X = -velocity.X;
}
velocity *= restitution;
velocity *= prefab.Restitution;
}
public void Draw(SpriteBatch spriteBatch)
@@ -49,13 +49,19 @@ namespace Barotrauma.Particles
public Particle CreateParticle(string prefabName, Vector2 position, float angle, float speed)
{
return CreateParticle(prefabName, position, new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle)) * speed, angle);
return CreateParticle(prefabName, position, new Vector2((float)Math.Cos(angle), (float)-Math.Sin(angle)) * speed, angle);
}
public Particle CreateParticle(string prefabName, Vector2 position, Vector2 speed, float rotation=0.0f, Hull hullGuess = null)
{
ParticlePrefab prefab = FindPrefab(prefabName);
if (prefab == null)
{
DebugConsole.ThrowError("Particle prefab ''" + prefabName+"'' not found!");
return null;
}
return CreateParticle(prefab, position, speed, rotation, hullGuess);
}
@@ -33,6 +33,8 @@ namespace Barotrauma.Particles
public readonly bool DeleteOnCollision;
public readonly bool CollidesWithWalls;
public readonly float Restitution;
public readonly Vector2 VelocityChange;
public readonly DrawTargetType DrawTarget;
@@ -87,6 +89,8 @@ namespace Barotrauma.Particles
SizeChangeMax = SizeChangeMin;
}
Restitution = ToolBox.GetAttributeFloat(element, "restitution", 0.5f);
switch (ToolBox.GetAttributeString(element, "blendstate", "alphablend"))
{
case "alpha":
+4 -4
View File
@@ -28,19 +28,19 @@ namespace Barotrauma
{
using (var game = new GameMain())
{
#if !DEBUG
//#if !DEBUG
try
{
#endif
//#endif
game.Run();
#if !DEBUG
//#if !DEBUG
}
catch (Exception e)
{
CrashDump(game, "crashreport.txt", e);
}
#endif
//#endif
}
}
+6
View File
@@ -255,7 +255,13 @@ namespace Barotrauma
null, DepthStencilState.DepthRead, null, null,
cam.Transform);
GameMain.ParticleManager.Draw(spriteBatch, true, Particles.ParticleBlendState.AlphaBlend);
spriteBatch.End();
spriteBatch.Begin(SpriteSortMode.Immediate,
BlendState.Additive,
null, DepthStencilState.DepthRead, null, null,
cam.Transform);
GameMain.ParticleManager.Draw(spriteBatch, true, Particles.ParticleBlendState.Additive);
spriteBatch.End();
//----------------------------------------------------------------------------------------
Binary file not shown.