Timer for deattaching items, more reliable door syncing, some new splash sounds
This commit is contained in:
@@ -1177,6 +1177,39 @@
|
||||
<None Include="Content\Sounds\startDrone.ogg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Content\Sounds\Water\Splash0.ogg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Content\Sounds\Water\Splash1.ogg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Content\Sounds\Water\Splash2.ogg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Content\Sounds\Water\Splash3.ogg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Content\Sounds\Water\Splash4.ogg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Content\Sounds\Water\Splash5.ogg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Content\Sounds\Water\Splash6.ogg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Content\Sounds\Water\Splash7.ogg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Content\Sounds\Water\Splash8.ogg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Content\Sounds\Water\Splash9.ogg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Content\Sounds\Water\splashLoop.ogg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Content\Sounds\Water\WaterAmbience2.ogg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<ragdoll waveamplitude="0.0" swimspeed="1.0" walkspeed="0.3" flip="true" rotatetowardsmovement="false" headangle="-90">
|
||||
|
||||
<!-- head -->
|
||||
<limb id = "0" radius="230" height="500" type="Head" steerforce="1.0" flip="true" armorsector="0.0,180.0" armorvalue="100.0">
|
||||
<limb id = "0" radius="230" height="500" type="Head" steerforce="1.0" flip="true" armorsector="0.0,180.0" armorvalue="100.0" impacttolerance="100">
|
||||
<sprite texture="Content/Characters/Moloch/moloch.png" sourcerect="0,0,628,1024" depth="0.02" origin ="0.4,0.5"/>
|
||||
<attack type="Hit" range="700" duration="0.2" force="400" damagetype="blunt"/>
|
||||
</limb>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
<output name="signal_out"/>
|
||||
</ConnectionPanel>
|
||||
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]"
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]" PickingTime="10.0"
|
||||
aimpos="35,-10" handle1="0,0" attachable="true" attachedbydefault="true" aimable="true">
|
||||
<requireditem name="Wrench" type="Equipped"/>
|
||||
</Holdable>
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
|
||||
<Body width="16" height="16"/>
|
||||
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]"
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]" PickingTime="5.0"
|
||||
aimpos="35,-10" handle1="0,0" attachable="true" aimable="true">
|
||||
<requireditem name="Wrench" type="Equipped"/>
|
||||
</Holdable>
|
||||
@@ -158,7 +158,7 @@
|
||||
|
||||
<Body width="16" height="16"/>
|
||||
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]"
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]" PickingTime="5.0"
|
||||
aimpos="35,-10" handle1="0,0" attachable="true" aimable="true">
|
||||
<requireditem name="Wrench" type="Equipped"/>
|
||||
</Holdable>
|
||||
@@ -192,7 +192,7 @@
|
||||
|
||||
<Body width="16" height="16"/>
|
||||
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]"
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]" PickingTime="5.0"
|
||||
aimpos="35,-10" handle1="0,0" attachable="true" aimable="true">
|
||||
<requireditem name="Wrench" type="Equipped"/>
|
||||
</Holdable>
|
||||
@@ -226,7 +226,8 @@
|
||||
|
||||
<Body width="16" height="16"/>
|
||||
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]" aimpos="35,-10" handle1="0,0" attachable="true" aimable="true">
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]" PickingTime="5.0"
|
||||
aimpos="35,-10" handle1="0,0" attachable="true" aimable="true">
|
||||
<requireditem name="Wrench" type="Equipped"/>
|
||||
</Holdable>
|
||||
|
||||
@@ -258,7 +259,7 @@
|
||||
|
||||
<Body width="31" height="24"/>
|
||||
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]"
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]" PickingTime="5.0"
|
||||
aimpos="35,-10" handle1="0,0" attachable="true" aimable="true">
|
||||
<requireditem name="Wrench" type="Equipped"/>
|
||||
</Holdable>
|
||||
@@ -289,7 +290,7 @@
|
||||
|
||||
<Body width="31" height="24"/>
|
||||
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]"
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]" PickingTime="5.0"
|
||||
aimpos="35,-10" handle1="0,0" attachable="true" aimable="true">
|
||||
<requireditem name="Wrench" type="Equipped"/>
|
||||
</Holdable>
|
||||
@@ -320,7 +321,7 @@
|
||||
|
||||
<Body width="16" height="16"/>
|
||||
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]"
|
||||
<Holdable selectkey="Action" slots="Any,RightHand,LeftHand" msg="Detach [Wrench]" PickingTime="5.0"
|
||||
aimpos="35,-10" handle1="0,0" attachable="true" aimable="true">
|
||||
<requireditem name="Wrench" type="Equipped"/>
|
||||
</Holdable>
|
||||
@@ -354,7 +355,7 @@
|
||||
|
||||
<Body width="16" height="16"/>
|
||||
|
||||
<Holdable selectkey="Action" aimpos="35,-10" handle1="0,0" attachable="true" aimable="true"
|
||||
<Holdable selectkey="Action" aimpos="35,-10" handle1="0,0" attachable="true" aimable="true" PickingTime="5.0"
|
||||
slots="Any,RightHand,LeftHand" msg="Detach [Wrench]">
|
||||
<requireditem name="Wrench" type="Equipped"/>
|
||||
</Holdable>
|
||||
@@ -386,7 +387,7 @@
|
||||
|
||||
<Body width="16" height="16"/>
|
||||
|
||||
<Holdable selectkey="Action" aimpos="35,-10" handle1="0,0" attachable="true" aimable="true"
|
||||
<Holdable selectkey="Action" aimpos="35,-10" handle1="0,0" attachable="true" aimable="true" PickingTime="5.0"
|
||||
slots="Any,RightHand,LeftHand" msg="Detach [Wrench]">
|
||||
<requireditem name="Wrench" type="Equipped"/>
|
||||
</Holdable>
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
<Item name="Uranium Bar" requirefullcondition="true"/>
|
||||
</Deconstruct>
|
||||
|
||||
<Sprite texture ="fuelrod.png"/>
|
||||
<Sprite texture ="fuelrod.png" depth="0.55"/>
|
||||
|
||||
<Body radius="6" height="22" density="5"/>
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
<Item name="Incendium Bar" requirefullcondition="true"/>
|
||||
</Deconstruct>
|
||||
|
||||
<Sprite texture ="fuelrod.png"/>
|
||||
<Sprite texture ="fuelrod.png" depth="0.55"/>
|
||||
|
||||
<Body radius="6" height="22" density="5"/>
|
||||
|
||||
|
||||
BIN
Subsurface/Content/Sounds/Water/Splash0.ogg
Normal file
BIN
Subsurface/Content/Sounds/Water/Splash0.ogg
Normal file
Binary file not shown.
BIN
Subsurface/Content/Sounds/Water/Splash1.ogg
Normal file
BIN
Subsurface/Content/Sounds/Water/Splash1.ogg
Normal file
Binary file not shown.
BIN
Subsurface/Content/Sounds/Water/Splash2.ogg
Normal file
BIN
Subsurface/Content/Sounds/Water/Splash2.ogg
Normal file
Binary file not shown.
BIN
Subsurface/Content/Sounds/Water/Splash3.ogg
Normal file
BIN
Subsurface/Content/Sounds/Water/Splash3.ogg
Normal file
Binary file not shown.
BIN
Subsurface/Content/Sounds/Water/Splash4.ogg
Normal file
BIN
Subsurface/Content/Sounds/Water/Splash4.ogg
Normal file
Binary file not shown.
BIN
Subsurface/Content/Sounds/Water/Splash5.ogg
Normal file
BIN
Subsurface/Content/Sounds/Water/Splash5.ogg
Normal file
Binary file not shown.
BIN
Subsurface/Content/Sounds/Water/Splash6.ogg
Normal file
BIN
Subsurface/Content/Sounds/Water/Splash6.ogg
Normal file
Binary file not shown.
BIN
Subsurface/Content/Sounds/Water/Splash7.ogg
Normal file
BIN
Subsurface/Content/Sounds/Water/Splash7.ogg
Normal file
Binary file not shown.
BIN
Subsurface/Content/Sounds/Water/Splash8.ogg
Normal file
BIN
Subsurface/Content/Sounds/Water/Splash8.ogg
Normal file
Binary file not shown.
BIN
Subsurface/Content/Sounds/Water/Splash9.ogg
Normal file
BIN
Subsurface/Content/Sounds/Water/Splash9.ogg
Normal file
Binary file not shown.
BIN
Subsurface/Content/Sounds/Water/splashLoop.ogg
Normal file
BIN
Subsurface/Content/Sounds/Water/splashLoop.ogg
Normal file
Binary file not shown.
@@ -35,6 +35,8 @@ namespace Barotrauma
|
||||
|
||||
protected double onFloorTimer;
|
||||
|
||||
private float splashSoundTimer;
|
||||
|
||||
//the movement speed of the ragdoll
|
||||
public Vector2 movement;
|
||||
//the target speed towards which movement is interpolated
|
||||
@@ -382,7 +384,9 @@ namespace Barotrauma
|
||||
}
|
||||
|
||||
avgVelocity = avgVelocity / Limbs.Count();
|
||||
|
||||
|
||||
if (character.Submarine == null && f2.Body.UserData is Submarine) avgVelocity -= (f2.Body.UserData as Submarine).Velocity;
|
||||
|
||||
float impact = Vector2.Dot(avgVelocity, -normal);
|
||||
|
||||
Limb l = (Limb)f1.Body.UserData;
|
||||
@@ -396,7 +400,7 @@ namespace Barotrauma
|
||||
{
|
||||
if (!character.IsNetworkPlayer)
|
||||
{
|
||||
character.AddDamage(CauseOfDeath.Damage, impact - l.impactTolerance * 0.1f);
|
||||
character.AddDamage(CauseOfDeath.Damage, impact - l.impactTolerance * 0.1f, null);
|
||||
|
||||
strongestImpact = Math.Max(strongestImpact, impact - l.impactTolerance);
|
||||
}
|
||||
@@ -610,6 +614,8 @@ namespace Barotrauma
|
||||
FindLowestLimb();
|
||||
|
||||
FindHull();
|
||||
|
||||
splashSoundTimer -= deltaTime;
|
||||
|
||||
//ragdoll isn't in any room -> it's in the water
|
||||
if (currentHull == null)
|
||||
@@ -678,11 +684,18 @@ namespace Barotrauma
|
||||
limb.LinearVelocity*0.001f,
|
||||
0.0f, limbHull);
|
||||
|
||||
|
||||
|
||||
//if the Character dropped into water, create a wave
|
||||
if (limb.LinearVelocity.Y<0.0f)
|
||||
{
|
||||
if (splashSoundTimer <= 0.0f)
|
||||
{
|
||||
SoundPlayer.PlaySplashSound(limb.WorldPosition, Math.Abs(limb.LinearVelocity.Y) + Rand.Range(-5.0f, 0.0f));
|
||||
splashSoundTimer = 0.5f;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//1.0 when the limb is parallel to the surface of the water
|
||||
// = big splash and a large impact
|
||||
float parallel = (float)Math.Abs(Math.Sin(limb.Rotation));
|
||||
|
||||
@@ -210,7 +210,7 @@ namespace Barotrauma
|
||||
body.CollidesWith = Physics.CollisionAll & ~Physics.CollisionCharacter & ~Physics.CollisionMisc;
|
||||
}
|
||||
|
||||
impactTolerance = ToolBox.GetAttributeFloat(element, "impacttolerance", character.IsHumanoid ? 10.0f : 50.0f);
|
||||
impactTolerance = ToolBox.GetAttributeFloat(element, "impacttolerance", 10.0f);
|
||||
|
||||
body.UserData = this;
|
||||
|
||||
|
||||
@@ -274,7 +274,7 @@ namespace Barotrauma
|
||||
case "heal":
|
||||
if (Character.Controlled != null)
|
||||
{
|
||||
Character.Controlled.AddDamage(CauseOfDeath.Damage, -Character.Controlled.MaxHealth);
|
||||
Character.Controlled.AddDamage(CauseOfDeath.Damage, -Character.Controlled.MaxHealth, null);
|
||||
Character.Controlled.Oxygen = 100.0f;
|
||||
Character.Controlled.Bleeding = 0.0f;
|
||||
}
|
||||
|
||||
@@ -68,9 +68,7 @@ namespace Barotrauma
|
||||
|
||||
protected override void DropItem(Item item)
|
||||
{
|
||||
if (item.body == null) return;
|
||||
|
||||
bool enabled = item.body.Enabled;
|
||||
bool enabled = item.body!=null && item.body.Enabled;
|
||||
item.Drop(character);
|
||||
|
||||
if (!enabled)
|
||||
|
||||
@@ -31,6 +31,8 @@ namespace Barotrauma.Items.Components
|
||||
|
||||
private bool isStuck;
|
||||
|
||||
private float lastReceivedMessage;
|
||||
|
||||
private float stuck;
|
||||
public float Stuck
|
||||
{
|
||||
@@ -429,22 +431,48 @@ namespace Barotrauma.Items.Components
|
||||
|
||||
public override void ReceiveSignal(string signal, Connection connection, Item sender, float power=0.0f)
|
||||
{
|
||||
if (isStuck) return;
|
||||
if (isStuck || GameMain.Client != null) return;
|
||||
|
||||
if (connection.Name=="toggle")
|
||||
{
|
||||
isOpen = !isOpen;
|
||||
PlaySound(ActionType.OnUse, item.WorldPosition);
|
||||
SetState(!isOpen, false);
|
||||
}
|
||||
else if (connection.Name == "set_state")
|
||||
{
|
||||
bool newState = (signal!="0");
|
||||
if (isOpen!=newState) PlaySound(ActionType.OnUse, item.WorldPosition);
|
||||
isOpen = newState;
|
||||
SetState(signal != "0", false);
|
||||
}
|
||||
|
||||
item.NewComponentEvent(this, false, true);
|
||||
}
|
||||
|
||||
private void SetState(bool state, bool isNetWorkMessage)
|
||||
{
|
||||
if (GameMain.Client != null && !isNetWorkMessage) return;
|
||||
|
||||
if (isStuck || isOpen == state) return;
|
||||
|
||||
PlaySound(ActionType.OnUse, item.WorldPosition);
|
||||
|
||||
isOpen = state;
|
||||
|
||||
//opening a partially stuck door makes it less stuck
|
||||
if (isOpen) stuck = MathHelper.Clamp(stuck-30.0f, 0.0f, 100.0f);
|
||||
if (isOpen) stuck = MathHelper.Clamp(stuck - 30.0f, 0.0f, 100.0f);
|
||||
}
|
||||
|
||||
public override bool FillNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetBuffer message)
|
||||
{
|
||||
message.Write(isOpen);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void ReadNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetBuffer message, float sendingTime)
|
||||
{
|
||||
if (sendingTime < lastReceivedMessage) return;
|
||||
|
||||
lastReceivedMessage = sendingTime;
|
||||
|
||||
SetState(message.ReadBoolean(), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace Barotrauma.Items.Components
|
||||
private List<RelatedItem> prevRequiredItems;
|
||||
|
||||
string prevMsg;
|
||||
|
||||
|
||||
//the distance from the holding characters elbow to center of the physics body of the item
|
||||
protected Vector2 holdPos;
|
||||
|
||||
@@ -72,7 +72,7 @@ namespace Barotrauma.Items.Components
|
||||
[HasDefaultValue(0.0f, false)]
|
||||
public float HoldAngle
|
||||
{
|
||||
get { return MathHelper.ToDegrees(holdAngle); }
|
||||
get { return MathHelper.ToDegrees(holdAngle); }
|
||||
set { holdAngle = MathHelper.ToRadians(value); }
|
||||
}
|
||||
|
||||
@@ -101,7 +101,7 @@ namespace Barotrauma.Items.Components
|
||||
Msg = "";
|
||||
}
|
||||
|
||||
if (attachedByDefault || (Screen.Selected == GameMain.EditMapScreen && Submarine.Loaded!=null)) Use(1.0f);
|
||||
if (attachedByDefault || (Screen.Selected == GameMain.EditMapScreen && Submarine.Loaded != null)) Use(1.0f);
|
||||
|
||||
|
||||
//holdAngle = ToolBox.GetAttributeFloat(element, "holdangle", 0.0f);
|
||||
@@ -110,12 +110,15 @@ namespace Barotrauma.Items.Components
|
||||
|
||||
public override void Drop(Character dropper)
|
||||
{
|
||||
|
||||
if (body != null) item.body = body;
|
||||
|
||||
if (item.body != null) item.body.Enabled = true;
|
||||
IsActive = false;
|
||||
|
||||
if (picker == null)
|
||||
{
|
||||
if (dropper==null) return;
|
||||
if (dropper == null) return;
|
||||
picker = dropper;
|
||||
}
|
||||
if (picker.Inventory == null) return;
|
||||
@@ -138,7 +141,7 @@ namespace Barotrauma.Items.Components
|
||||
|
||||
if (item.body == null)
|
||||
{
|
||||
if (body!=null)
|
||||
if (body != null)
|
||||
{
|
||||
item.body = body;
|
||||
}
|
||||
@@ -151,7 +154,7 @@ namespace Barotrauma.Items.Components
|
||||
if (!item.body.Enabled)
|
||||
{
|
||||
Limb rightHand = picker.AnimController.GetLimb(LimbType.RightHand);
|
||||
item.SetTransform(rightHand.SimPosition, 0.0f);
|
||||
item.SetTransform(rightHand.SimPosition, 0.0f);
|
||||
}
|
||||
|
||||
if (picker.TrySelectItem(item))
|
||||
@@ -166,7 +169,7 @@ namespace Barotrauma.Items.Components
|
||||
if (picker == null) return;
|
||||
|
||||
picker.DeselectItem(item);
|
||||
|
||||
|
||||
item.body.Enabled = false;
|
||||
IsActive = false;
|
||||
}
|
||||
@@ -189,7 +192,7 @@ namespace Barotrauma.Items.Components
|
||||
}
|
||||
|
||||
attached = false;
|
||||
if (body!=null) item.body = body;
|
||||
if (body != null) item.body = body;
|
||||
//item.body.Enabled = true;
|
||||
|
||||
return true;
|
||||
@@ -197,13 +200,13 @@ namespace Barotrauma.Items.Components
|
||||
|
||||
public override bool Use(float deltaTime, Character character = null)
|
||||
{
|
||||
if (!attachable || item.body==null) return true;
|
||||
if (!attachable || item.body == null) return true;
|
||||
if (character != null && !character.IsKeyDown(InputType.Aim)) return false;
|
||||
|
||||
item.Drop();
|
||||
|
||||
var containedItems = item.ContainedItems;
|
||||
if (containedItems!=null)
|
||||
if (containedItems != null)
|
||||
{
|
||||
foreach (Item contained in containedItems)
|
||||
{
|
||||
@@ -231,12 +234,12 @@ namespace Barotrauma.Items.Components
|
||||
}
|
||||
|
||||
public override void Update(float deltaTime, Camera cam)
|
||||
{
|
||||
{
|
||||
if (!item.body.Enabled) return;
|
||||
if (!picker.HasSelectedItem(item)) IsActive = false;
|
||||
|
||||
ApplyStatusEffects(ActionType.OnActive, deltaTime, picker);
|
||||
|
||||
|
||||
if (item.body.Dir != picker.AnimController.Dir) Flip(item);
|
||||
|
||||
AnimController ac = picker.AnimController;
|
||||
@@ -246,8 +249,8 @@ namespace Barotrauma.Items.Components
|
||||
//item.sprite.Depth = picker.AnimController.GetLimb(LimbType.RightHand).sprite.Depth + 0.01f;
|
||||
|
||||
ac.HoldItem(deltaTime, item, handlePos, holdPos, aimPos, picker.IsKeyDown(InputType.Aim), holdAngle);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected void Flip(Item item)
|
||||
{
|
||||
handlePos[0].X = -handlePos[0].X;
|
||||
@@ -267,7 +270,7 @@ namespace Barotrauma.Items.Components
|
||||
}
|
||||
else
|
||||
{
|
||||
if (item.Inventory!=null)
|
||||
if (item.Inventory != null)
|
||||
{
|
||||
if (body != null)
|
||||
{
|
||||
@@ -300,7 +303,7 @@ namespace Barotrauma.Items.Components
|
||||
}
|
||||
|
||||
catch
|
||||
{
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
using System;
|
||||
using Barotrauma.Networking;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Xml.Linq;
|
||||
|
||||
@@ -10,6 +13,9 @@ namespace Barotrauma.Items.Components
|
||||
|
||||
protected List<LimbSlot> allowedSlots;
|
||||
|
||||
private float pickTimer;
|
||||
|
||||
|
||||
public List<LimbSlot> AllowedSlots
|
||||
{
|
||||
get { return allowedSlots; }
|
||||
@@ -50,20 +56,49 @@ namespace Barotrauma.Items.Components
|
||||
|
||||
public override bool Pick(Character picker)
|
||||
{
|
||||
if (picker == null) return false;
|
||||
if (picker.Inventory == null) return false;
|
||||
//return if someone is already trying to pick the item
|
||||
if (pickTimer>0.0f) return false;
|
||||
if (picker == null || picker.Inventory == null) return false;
|
||||
|
||||
if (picker.Inventory.TryPutItem(item, allowedSlots, picker==Character.Controlled))
|
||||
if (PickingTime>0.0f)
|
||||
{
|
||||
if (!picker.HasSelectedItem(item) && item.body!=null) item.body.Enabled = false;
|
||||
CoroutineManager.StartCoroutine(WaitForPick(picker, PickingTime));
|
||||
|
||||
//create a networkevent here, because the item doesn't count as picked yet and the character won't create one
|
||||
new NetworkEvent(NetworkEventType.PickItem, picker.ID, true,
|
||||
new int[]
|
||||
{
|
||||
item.ID,
|
||||
picker.IsKeyHit(InputType.Select) ? 1 : 0,
|
||||
picker.IsKeyHit(InputType.Use) ? 1 : 0
|
||||
});
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return OnPicked(picker);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private bool OnPicked(Character picker)
|
||||
{
|
||||
if (picker.Inventory.TryPutItem(item, allowedSlots, picker == Character.Controlled))
|
||||
{
|
||||
if (!picker.HasSelectedItem(item) && item.body != null) item.body.Enabled = false;
|
||||
this.picker = picker;
|
||||
|
||||
for (int i = item.linkedTo.Count - 1; i >= 0; i--)
|
||||
{
|
||||
item.linkedTo[i].RemoveLinked(item);
|
||||
}
|
||||
item.linkedTo.Clear();
|
||||
|
||||
var connectionPanel = item.GetComponent<ConnectionPanel>();
|
||||
if (connectionPanel!=null)
|
||||
if (connectionPanel != null)
|
||||
{
|
||||
foreach (Connection c in connectionPanel.Connections)
|
||||
{
|
||||
@@ -72,7 +107,7 @@ namespace Barotrauma.Items.Components
|
||||
if (w == null) continue;
|
||||
|
||||
w.Item.Drop(picker);
|
||||
w.Item.SetTransform(item.SimPosition, 0.0f);
|
||||
w.Item.SetTransform(picker.SimPosition, 0.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -90,6 +125,63 @@ namespace Barotrauma.Items.Components
|
||||
return false;
|
||||
}
|
||||
|
||||
private IEnumerable<object> WaitForPick(Character picker, float requiredTime)
|
||||
{
|
||||
var leftHand = picker.AnimController.GetLimb(LimbType.LeftHand);
|
||||
var rightHand = picker.AnimController.GetLimb(LimbType.RightHand);
|
||||
|
||||
|
||||
pickTimer = 0.0f;
|
||||
while (pickTimer < requiredTime)
|
||||
{
|
||||
if (picker.IsKeyHit(InputType.Aim) || !item.IsInPickRange(picker.WorldPosition))
|
||||
{
|
||||
StopPicking(picker);
|
||||
yield return CoroutineStatus.Success;
|
||||
}
|
||||
|
||||
picker.AnimController.Anim = AnimController.Animation.UsingConstruction;
|
||||
|
||||
picker.AnimController.TargetMovement = Vector2.Zero;
|
||||
|
||||
leftHand.Disabled = true;
|
||||
leftHand.pullJoint.Enabled = true;
|
||||
leftHand.pullJoint.WorldAnchorB = item.SimPosition + Vector2.UnitY * (float)Math.Sin(pickTimer*10.0f)*0.1f;
|
||||
|
||||
rightHand.Disabled = true;
|
||||
rightHand.pullJoint.Enabled = true;
|
||||
rightHand.pullJoint.WorldAnchorB = item.SimPosition + Vector2.UnitY * (float)Math.Sin(pickTimer*10.0f) * 0.1f;
|
||||
|
||||
pickTimer += CoroutineManager.DeltaTime;
|
||||
|
||||
yield return CoroutineStatus.Running;
|
||||
}
|
||||
|
||||
StopPicking(picker);
|
||||
|
||||
OnPicked(picker);
|
||||
|
||||
yield return CoroutineStatus.Success;
|
||||
}
|
||||
|
||||
private void StopPicking(Character picker)
|
||||
{
|
||||
picker.AnimController.Anim = AnimController.Animation.None;
|
||||
pickTimer = 0.0f;
|
||||
}
|
||||
|
||||
|
||||
public override void Draw(SpriteBatch spriteBatch, bool editing = false)
|
||||
{
|
||||
if (pickTimer <= 0.0f) return;
|
||||
|
||||
float progressBarWidth = 100.0f;
|
||||
|
||||
GUI.DrawProgressBar(spriteBatch, item.DrawPosition + new Vector2(-progressBarWidth/2.0f, 50.0f), new Vector2(progressBarWidth, 15.0f),
|
||||
pickTimer / PickingTime,
|
||||
Color.Lerp(Color.Red, Color.Green, pickTimer / PickingTime));
|
||||
}
|
||||
|
||||
public override void Drop(Character dropper)
|
||||
{
|
||||
if (picker == null)
|
||||
|
||||
@@ -67,6 +67,13 @@ namespace Barotrauma.Items.Components
|
||||
|
||||
public ItemComponent Parent;
|
||||
|
||||
[HasDefaultValue(0.0f, false)]
|
||||
public float PickingTime
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
public readonly Dictionary<string, ObjectProperty> properties;
|
||||
public Dictionary<string, ObjectProperty> ObjectProperties
|
||||
{
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace Barotrauma
|
||||
protected override void DropItem(Item item)
|
||||
{
|
||||
item.Drop();
|
||||
item.body.Enabled = true;
|
||||
if (item.body != null) item.body.Enabled = true;
|
||||
item.SetTransform(container.Item.SimPosition, 0.0f);
|
||||
}
|
||||
|
||||
|
||||
@@ -159,7 +159,7 @@ namespace Barotrauma
|
||||
body.SleepingAllowed = false;
|
||||
body.IgnoreGravity = true;
|
||||
body.OnCollision += OnCollision;
|
||||
//body.UserData = this;
|
||||
body.UserData = submarine;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace Barotrauma.Networking
|
||||
private bool started;
|
||||
|
||||
private NetServer server;
|
||||
private NetPeerConfiguration config;
|
||||
private NetPeerConfiguration config;
|
||||
|
||||
private DateTime sparseUpdateTimer;
|
||||
private DateTime refreshMasterTimer;
|
||||
|
||||
@@ -10,11 +10,13 @@ using System.Collections.Generic;
|
||||
|
||||
namespace Barotrauma
|
||||
{
|
||||
public enum DamageSoundType {
|
||||
public enum DamageSoundType
|
||||
{
|
||||
None,
|
||||
StructureBlunt, StructureSlash,
|
||||
LimbBlunt, LimbSlash, LimbArmor,
|
||||
Implode, Pressure }
|
||||
Implode, Pressure
|
||||
}
|
||||
|
||||
public struct DamageSound
|
||||
{
|
||||
@@ -53,6 +55,8 @@ namespace Barotrauma
|
||||
{
|
||||
public static Sound[] flowSounds = new Sound[3];
|
||||
|
||||
public static Sound[] SplashSounds = new Sound[10];
|
||||
|
||||
public static float MusicVolume = 1.0f;
|
||||
|
||||
private const float MusicLerpSpeed = 0.1f;
|
||||
@@ -60,6 +64,7 @@ namespace Barotrauma
|
||||
private static Sound[] waterAmbiences = new Sound[2];
|
||||
private static int[] waterAmbienceIndexes = new int[2];
|
||||
|
||||
|
||||
private static DamageSound[] damageSounds;
|
||||
|
||||
private static BackgroundMusic currentMusic;
|
||||
@@ -97,6 +102,12 @@ namespace Barotrauma
|
||||
flowSounds[2] = Sound.Load("Content/Sounds/Water/FlowLarge.ogg", false);
|
||||
yield return CoroutineStatus.Running;
|
||||
|
||||
for (int i = 0; i < 10; i++ )
|
||||
{
|
||||
SplashSounds[i] = Sound.Load("Content/Sounds/Water/Splash"+(i)+".ogg", false);
|
||||
yield return CoroutineStatus.Running;
|
||||
}
|
||||
|
||||
XDocument doc = ToolBox.TryLoadXml("Content/Sounds/sounds.xml");
|
||||
if (doc == null) yield return CoroutineStatus.Failure;
|
||||
|
||||
@@ -282,6 +293,13 @@ namespace Barotrauma
|
||||
}
|
||||
}
|
||||
|
||||
public static void PlaySplashSound(Vector2 worldPosition, float strength)
|
||||
{
|
||||
int splashIndex = MathHelper.Clamp((int)(strength + Rand.Range(-2,2)), 0, SplashSounds.Length-1);
|
||||
|
||||
SplashSounds[splashIndex].Play(1.0f, 800.0f, worldPosition);
|
||||
}
|
||||
|
||||
public static void PlayDamageSound(DamageSoundType damageType, float damage, PhysicsBody body)
|
||||
{
|
||||
Vector2 bodyPosition = body.DrawPosition;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 14
|
||||
VisualStudioVersion = 14.0.23107.0
|
||||
# Visual Studio 2013
|
||||
VisualStudioVersion = 12.0.21005.1
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Barotrauma", "Subsurface\Barotrauma.csproj", "{008C0F83-E914-4966-9135-EA885059EDD8}"
|
||||
EndProject
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user