Add two-way serialization in ExposeData for some of the components that are missing it (#1451)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user