Networking optimization/bugfixes (hull water volumes & wall damage are synced, more reliable inventory updates, AICharacter sync changes), proper particle collisions with walls
This commit is contained in:
@@ -153,6 +153,7 @@ namespace Subsurface
|
||||
if (items[i].Combine(item))
|
||||
{
|
||||
//PutItem(items[i], i, false, false);
|
||||
new Networking.NetworkEvent(Networking.NetworkEventType.InventoryUpdate, items[i].ID, true);
|
||||
combined = true;
|
||||
}
|
||||
|
||||
@@ -186,7 +187,6 @@ namespace Subsurface
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -276,6 +276,8 @@ namespace Subsurface
|
||||
else
|
||||
{
|
||||
DropItem(draggingItem);
|
||||
|
||||
new Networking.NetworkEvent(Subsurface.Networking.NetworkEventType.DropItem, draggingItem.ID, true);
|
||||
//draggingItem = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,8 +52,9 @@ namespace Subsurface.Items.Components
|
||||
get { return rechargeSpeed; }
|
||||
set
|
||||
{
|
||||
if (float.IsNaN(value)) return;
|
||||
if (float.IsNaN(value)) return;
|
||||
rechargeSpeed = MathHelper.Clamp(value, 0.0f, maxRechargeSpeed);
|
||||
rechargeSpeed = MathUtils.Round(rechargeSpeed, Math.Max(maxRechargeSpeed * 0.1f, 1.0f));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,38 +195,38 @@ namespace Subsurface.Items.Components
|
||||
new Vector2(x + 30, y + 30), Color.White);
|
||||
|
||||
spriteBatch.DrawString(GUI.Font, "Recharge rate: " + (rechargeSpeed / maxRechargeSpeed), new Vector2(x + 30, y + 100), Color.White);
|
||||
if (GUI.DrawButton(spriteBatch, new Rectangle(x + 50, y + 150, 40, 40), "+", true))
|
||||
{
|
||||
rechargeSpeed = Math.Min(rechargeSpeed + 10.0f, maxRechargeSpeed);
|
||||
if (GUI.DrawButton(spriteBatch, new Rectangle(x + 50, y + 150, 40, 40), "+"))
|
||||
{
|
||||
rechargeSpeed = Math.Min(rechargeSpeed + maxRechargeSpeed*0.1f, maxRechargeSpeed);
|
||||
item.NewComponentEvent(this, true);
|
||||
}
|
||||
|
||||
if (GUI.DrawButton(spriteBatch, new Rectangle(x + 250, y + 150, 40, 40), "-", true))
|
||||
if (GUI.DrawButton(spriteBatch, new Rectangle(x + 250, y + 150, 40, 40), "-"))
|
||||
{
|
||||
rechargeSpeed = Math.Max(rechargeSpeed - 10.0f, 0.0f);
|
||||
rechargeSpeed = Math.Max(rechargeSpeed - maxRechargeSpeed * 0.1f, 0.0f);
|
||||
item.NewComponentEvent(this, true);
|
||||
}
|
||||
}
|
||||
|
||||
public override void FillNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetOutgoingMessage message)
|
||||
{
|
||||
message.Write(rechargeSpeed);
|
||||
message.Write((byte)((int)(rechargeSpeed/maxRechargeSpeed*255.0f)));
|
||||
message.Write(charge);
|
||||
}
|
||||
|
||||
public override void ReadNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetIncomingMessage message)
|
||||
{
|
||||
float newRechargeSpeed = 0.0f;
|
||||
byte newRechargeSpeed = 0;
|
||||
float newCharge = 0.0f;
|
||||
|
||||
try
|
||||
{
|
||||
newRechargeSpeed = message.ReadFloat();
|
||||
newRechargeSpeed = message.ReadByte();
|
||||
newCharge = message.ReadFloat();
|
||||
}
|
||||
catch { }
|
||||
|
||||
RechargeSpeed = newRechargeSpeed;
|
||||
RechargeSpeed = (newRechargeSpeed/255.0f)*maxRechargeSpeed;
|
||||
Charge = newCharge;
|
||||
}
|
||||
|
||||
|
||||
@@ -116,12 +116,7 @@ namespace Subsurface
|
||||
item.body.Enabled = false;
|
||||
}
|
||||
|
||||
|
||||
if (createNetworkEvent)
|
||||
{
|
||||
int[] data = { item.ID, i };
|
||||
new NetworkEvent(NetworkEventType.InventoryUpdate, ID, true, data);
|
||||
}
|
||||
if (createNetworkEvent) new NetworkEvent(NetworkEventType.InventoryUpdate, ID, true);
|
||||
}
|
||||
|
||||
public void RemoveItem(Item item)
|
||||
@@ -273,49 +268,58 @@ namespace Subsurface
|
||||
|
||||
public override void FillNetworkData(NetworkEventType type, NetOutgoingMessage message, object data)
|
||||
{
|
||||
int[] dataArray = data as int[];
|
||||
if (dataArray == null || dataArray.Length<2)
|
||||
for (int i = 0; i<capacity; i++)
|
||||
{
|
||||
message.Write(-1);
|
||||
return;
|
||||
message.Write((items[i] == null) ? -1 : items[i].ID);
|
||||
}
|
||||
//item id
|
||||
message.Write(dataArray[0]);
|
||||
//index of the slot which the item was moved to
|
||||
message.Write(dataArray[1]);
|
||||
}
|
||||
|
||||
public override void ReadNetworkData(NetworkEventType type, NetIncomingMessage message)
|
||||
{
|
||||
int itemId=-1, slotIndex = -1;
|
||||
|
||||
int[] newItemIDs = new int[capacity];
|
||||
|
||||
try
|
||||
{
|
||||
itemId = message.ReadInt32();
|
||||
slotIndex = message.ReadInt32();
|
||||
for (int i = 0; i<capacity; i++)
|
||||
{
|
||||
newItemIDs[i] = message.ReadInt32();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (itemId == -1) return;
|
||||
|
||||
Item item = FindEntityByID(itemId) as Item;
|
||||
if (item == null) return;
|
||||
|
||||
System.Diagnostics.Debug.WriteLine("Inventory update: "+itemId+" - "+slotIndex);
|
||||
|
||||
if (slotIndex==-1)
|
||||
for (int i = 0; i < capacity; i++)
|
||||
{
|
||||
if (item.inventory == this) item.Drop();
|
||||
}
|
||||
else
|
||||
{
|
||||
TryPutItem(item, slotIndex, false);
|
||||
if (newItemIDs[i] == -1)
|
||||
{
|
||||
if (items[i] == null) continue;
|
||||
|
||||
items[i].Drop(null, false);
|
||||
continue;
|
||||
}
|
||||
|
||||
Item item = FindEntityByID(newItemIDs[i]) as Item;
|
||||
if (item == null) continue;
|
||||
|
||||
TryPutItem(item, i, false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//System.Diagnostics.Debug.WriteLine("Inventory update: "+itemId+" - "+slotIndex);
|
||||
|
||||
//if (slotIndex==-1)
|
||||
//{
|
||||
// if (item.inventory == this) item.Drop();
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// TryPutItem(item, slotIndex, false);
|
||||
//}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -459,11 +459,12 @@ namespace Subsurface
|
||||
}
|
||||
|
||||
|
||||
public AttackResult AddDamage(IDamageable attacker, Vector2 position, Attack attack, bool playSound = true)
|
||||
public AttackResult AddDamage(IDamageable attacker, Vector2 position, Attack attack, float deltaTime, bool playSound = true)
|
||||
{
|
||||
Condition -= attack.Damage;
|
||||
float damageAmount = attack.GetDamage(deltaTime);
|
||||
Condition -= damageAmount;
|
||||
|
||||
return new AttackResult(attack.Damage, 0.0f, false);
|
||||
return new AttackResult(damageAmount, 0.0f, false);
|
||||
}
|
||||
|
||||
|
||||
@@ -921,8 +922,8 @@ namespace Subsurface
|
||||
|
||||
public void Drop(Character dropper = null, bool createNetworkEvent = true)
|
||||
{
|
||||
if (dropper == Character.Controlled)
|
||||
new NetworkEvent(NetworkEventType.DropItem, ID, true);
|
||||
//if (dropper == Character.Controlled)
|
||||
// new NetworkEvent(NetworkEventType.DropItem, ID, true);
|
||||
|
||||
foreach (ItemComponent ic in components) ic.Drop(dropper);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user