Add two-way serialization in ExposeData for some of the components that are missing it (#1451)

This commit is contained in:
DrSmugleaf
2020-07-23 01:46:09 +02:00
committed by GitHub
parent 989025b222
commit a8b3c99075
19 changed files with 252 additions and 172 deletions

View File

@@ -61,16 +61,10 @@ namespace Content.Server.GameObjects
{
base.ExposeData(serializer);
// TODO: This does not serialize what objects are held.
serializer.DataField(ref _orderedHands, "hands", new List<string>(0));
if (serializer.Reading)
{
foreach (var handsname in _orderedHands)
{
AddHand(handsname);
}
}
serializer.DataReadWriteFunction("hands",
new List<string>(0),
hands => hands.ForEach(AddHand),
() => _orderedHands);
serializer.DataField(ref _activeIndex, "defaultHand", _orderedHands.LastOrDefault());
}

View File

@@ -65,14 +65,25 @@ namespace Content.Server.GameObjects.Components.Interactable
{
base.ExposeData(serializer);
if (serializer.Reading)
{
var qualities = serializer.ReadDataField("qualities", new List<ToolQuality>());
foreach (var quality in qualities)
serializer.DataReadWriteFunction(
"qualities",
new List<ToolQuality>(),
qualities => qualities.ForEach(AddQuality),
() =>
{
AddQuality(quality);
}
}
var qualities = new List<ToolQuality>();
foreach (ToolQuality quality in Enum.GetValues(typeof(ToolQuality)))
{
if ((_qualities & quality) != 0)
{
qualities.Add(quality);
}
}
return qualities;
});
serializer.DataField(this, mod => SpeedModifier, "speed", 1);
serializer.DataField(this, use => UseSound, "useSound", string.Empty);
serializer.DataField(this, collection => UseSoundCollection, "useSoundCollection", string.Empty);

View File

@@ -44,19 +44,29 @@ namespace Content.Server.GameObjects.Components.Nutrition
public override void ExposeData(ObjectSerializer serializer)
{
base.ExposeData(serializer);
serializer.DataField(ref _useSound, "useSound", "/Audio/Items/eatfood.ogg");
serializer.DataField(ref _transferAmount, "transferAmount", ReagentUnit.New(5));
serializer.DataField(ref _trashPrototype, "trash", null);
if (serializer.Reading)
{
var utensils = serializer.ReadDataField("utensils", new List<UtensilType>());
foreach (var utensil in utensils)
serializer.DataReadWriteFunction(
"utensils",
new List<UtensilType>(),
types => types.ForEach(type => _utensilsNeeded |= type),
() =>
{
_utensilsNeeded |= utensil;
Dirty();
}
}
var types = new List<UtensilType>();
foreach (UtensilType type in Enum.GetValues(typeof(UtensilType)))
{
if ((_utensilsNeeded & type) != 0)
{
types.Add(type);
}
}
return types;
});
}
public override void Initialize()

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using Content.Server.GameObjects.Components.Nutrition;
using Content.Server.Utility;
using Content.Shared.GameObjects.Components.Utensil;
@@ -83,14 +84,23 @@ namespace Content.Server.GameObjects.Components.Utensil
{
base.ExposeData(serializer);
if (serializer.Reading)
{
var types = serializer.ReadDataField("types", new List<UtensilType>());
foreach (var type in types)
serializer.DataReadWriteFunction("types",
new List<UtensilType>(),
types => types.ForEach(AddType),
() =>
{
AddType(type);
}
}
var types = new List<UtensilType>();
foreach (UtensilType type in Enum.GetValues(typeof(UtensilType)))
{
if ((Types & type) != 0)
{
types.Add(type);
}
}
return types;
});
serializer.DataField(ref _breakChance, "breakChance", 0);
serializer.DataField(ref _breakSound, "breakSound", "/Audio/Items/snap.ogg");

View File

@@ -44,15 +44,13 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels
public override void ExposeData(ObjectSerializer serializer)
{
base.ExposeData(serializer);
serializer.DataField(ref _caliber, "caliber", BallisticCaliber.Unspecified);
if (serializer.Reading)
{
var capacity = serializer.ReadDataField("capacity", 6);
_ammoSlots = new IEntity[capacity];
}
// TODO: Writing?
serializer.DataReadWriteFunction(
"capacity",
6,
cap => _ammoSlots = new IEntity[cap],
() => _ammoSlots.Length);
serializer.DataField(ref _fillPrototype, "fillPrototype", null);
// Sounds

View File

@@ -75,11 +75,8 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels
public override void ExposeData(ObjectSerializer serializer)
{
base.ExposeData(serializer);
if (serializer.Reading)
{
_powerCellPrototype = serializer.ReadDataField<string>("powerCellPrototype", null);
}
serializer.DataField(ref _powerCellPrototype, "powerCellPrototype", null);
serializer.DataField(ref _powerCellRemovable, "powerCellRemovable", false);
serializer.DataField(ref _baseFireCost, "fireCost", 300);
serializer.DataField(ref _ammoPrototype, "ammoPrototype", null);

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition;
using Content.Shared.GameObjects;
using Content.Shared.GameObjects.Components.Weapons.Ranged;
@@ -95,14 +96,25 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels
public override void ExposeData(ObjectSerializer serializer)
{
base.ExposeData(serializer);
if (serializer.Reading)
{
var magTypes = serializer.ReadDataField("magazineTypes", new List<MagazineType>());
foreach (var mag in magTypes)
serializer.DataReadWriteFunction(
"magazineTypes",
new List<MagazineType>(),
types => types.ForEach(mag => _magazineTypes |= mag),
() =>
{
_magazineTypes |= mag;
}
}
var types = new List<MagazineType>();
foreach (MagazineType mag in Enum.GetValues(typeof(MagazineType)))
{
if ((_magazineTypes & mag) != 0)
{
types.Add(mag);
}
}
return types;
});
serializer.DataField(ref _caliber, "caliber", BallisticCaliber.Unspecified);
serializer.DataField(ref _magFillPrototype, "magFillPrototype", null);
serializer.DataField(ref _autoEjectMag, "autoEjectMag", false);

View File

@@ -84,31 +84,57 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels
public override void ExposeData(ObjectSerializer serializer)
{
base.ExposeData(serializer);
serializer.DataField(ref _fireRateSelector, "currentSelector", FireRateSelector.Safety);
serializer.DataField(ref _fireRate, "fireRate", 2.0f);
// This hard-to-read area's dealing with recoil
// Use degrees in yaml as it's easier to read compared to "0.0125f"
if (serializer.Reading)
{
var minAngle = serializer.ReadDataField("minAngle", 0) / 2;
_minAngle = Angle.FromDegrees(minAngle);
// Random doubles it as it's +/- so uhh we'll just half it here for readability
var maxAngle = serializer.ReadDataField("maxAngle", 45) / 2;
_maxAngle = Angle.FromDegrees(maxAngle);
var angleIncrease = serializer.ReadDataField("angleIncrease", (40 / _fireRate));
_angleIncrease = angleIncrease * (float) Math.PI / 180;
var angleDecay = serializer.ReadDataField("angleDecay", (float) 20);
_angleDecay = angleDecay * (float) Math.PI / 180;
serializer.DataField(ref _spreadRatio, "ammoSpreadRatio", 1.0f);
serializer.DataReadWriteFunction(
"minAngle",
0,
angle => _minAngle = Angle.FromDegrees(angle / 2f),
() => _minAngle.Degrees * 2);
// FireRate options
var allFireRates = serializer.ReadDataField("allSelectors", new List<FireRateSelector>());
foreach (var fireRate in allFireRates)
// Random doubles it as it's +/- so uhh we'll just half it here for readability
serializer.DataReadWriteFunction(
"maxAngle",
45,
angle => _maxAngle = Angle.FromDegrees(angle / 2f),
() => _maxAngle.Degrees * 2);
serializer.DataReadWriteFunction(
"angleIncrease",
40 / _fireRate,
angle => _angleIncrease = angle * (float) Math.PI / 180,
() => _angleIncrease / (float) Math.PI / 180);
serializer.DataReadWriteFunction(
"angleDecay",
20f,
angle => _angleDecay = angle * (float) Math.PI / 180,
() => _angleDecay / (float) Math.PI / 180);
serializer.DataField(ref _spreadRatio, "ammoSpreadRatio", 1.0f);
serializer.DataReadWriteFunction(
"allSelectors",
new List<FireRateSelector>(),
selectors => selectors.ForEach(selector => _allRateSelectors |= selector),
() =>
{
_allRateSelectors |= fireRate;
}
}
var types = new List<FireRateSelector>();
foreach (FireRateSelector selector in Enum.GetValues(typeof(FireRateSelector)))
{
if ((_allRateSelectors & selector) != 0)
{
types.Add(selector);
}
}
return types;
});
// For simplicity we'll enforce it this way; ammo determines max spread
if (_spreadRatio > 1.0f)
@@ -118,6 +144,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels
}
serializer.DataField(ref _canMuzzleFlash, "canMuzzleFlash", true);
// Sounds
serializer.DataField(ref _soundGunshot, "soundGunshot", null);
serializer.DataField(ref _soundEmpty, "soundEmpty", "/Audio/Weapons/Guns/Empty/empty.ogg");