fix: Adds Poison to codegen (#1002)

This commit is contained in:
Kamron Batman 2022-04-18 00:05:44 -07:00 • committed by GitHub
parent 933c41070f
commit fc3d9b926d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 140 additions and 171 deletions

View file

@ -2571,8 +2571,6 @@ namespace Server
writer.Write(DisarmReady);
writer.Write(StunReady);
// Poison.Serialize( m_Poison, writer );
writer.Write(m_StatCap);
writer.Write(NameHue);
@ -6386,7 +6384,7 @@ namespace Server
{
if (version <= 25)
{
Poison.Deserialize(reader);
reader.ReadPoison();
}
goto case 3;

View file

@ -76,35 +76,5 @@ namespace Server
return null;
}
public static void Serialize(Poison p, IGenericWriter writer)
{
if (p == null)
{
writer.Write((byte)0);
}
else
{
writer.Write((byte)1);
writer.Write((byte)p.Level);
}
}
public static Poison Deserialize(IGenericReader reader)
{
switch (reader.ReadByte())
{
case 1: return GetPoison(reader.ReadByte());
case 2:
// no longer used, safe to remove?
reader.ReadInt();
reader.ReadDouble();
reader.ReadInt();
reader.ReadTimeSpan();
break;
}
return null;
}
}
}

View file

@ -1,23 +0,0 @@
/*************************************************************************
* ModernUO *
* Copyright 2019-2021 - ModernUO Development Team *
* Email: hi@modernuo.com *
* File: IRawSerializable.cs *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
*************************************************************************/
namespace Server
{
public interface IRawSerializable
{
void Deserialize(IGenericReader reader);
void Serialize(IGenericWriter writer);
}
}

View file

@ -0,0 +1,118 @@
using System;
using System.Collections.Generic;
using Server.Guilds;
namespace Server;
public static class SerializationExtensions
{
public static T ReadEntity<T>(this IGenericReader reader) where T : class, ISerializable
{
Serial serial = reader.ReadSerial();
var typeT = typeof(T);
T entity;
// Add to this list when creating new serializable types
if (typeof(BaseGuild).IsAssignableFrom(typeT))
{
entity = World.FindGuild(serial) as T;
// If we check for `entity.Deleted` here during deserialization then all guilds are deleted because
// Deleted -> Disbanded -> No leader, which is the case before deserialization.
// TODO: Use a deleted flag instead, and actively check for dibanded guilds properly.
}
else
{
entity = World.FindEntity<IEntity>(serial) as T;
if (entity?.Deleted == false)
{
return entity;
}
}
return entity?.Created <= reader.LastSerialized ? entity : null;
}
public static List<T> ReadEntityList<T>(this IGenericReader reader) where T : class, ISerializable
{
var count = reader.ReadInt();
var list = new List<T>(count);
for (var i = 0; i < count; ++i)
{
var entity = reader.ReadEntity<T>();
if (entity != null)
{
list.Add(entity);
}
}
return list;
}
public static HashSet<T> ReadEntitySet<T>(this IGenericReader reader) where T : class, ISerializable
{
var count = reader.ReadInt();
var set = new HashSet<T>(count);
for (var i = 0; i < count; ++i)
{
var entity = reader.ReadEntity<T>();
if (entity != null)
{
set.Add(entity);
}
}
return set;
}
public static void Write(this IGenericWriter writer, ISerializable value)
{
writer.Write(value?.Deleted != false ? Serial.MinusOne : value.Serial);
}
public static void Write<T>(this IGenericWriter writer, ICollection<T> coll) where T : class, ISerializable
{
writer.Write(coll.Count);
foreach (var entry in coll)
{
writer.Write(entry);
}
}
public static void Write<T>(
this IGenericWriter writer, ICollection<T> coll, Action<IGenericWriter, T> action
) where T : class, ISerializable
{
if (coll == null)
{
writer.Write(0);
return;
}
writer.Write(coll.Count);
foreach (var entry in coll)
{
action(writer, entry);
}
}
public static void Write(this IGenericWriter writer, Poison p)
{
if (p == null)
{
writer.Write(false);
}
else
{
writer.Write(true);
writer.Write((byte)p.Level);
}
}
public static Poison ReadPoison(this IGenericReader reader) =>
reader.ReadBool() ? Poison.GetPoison(reader.ReadByte()) : null;
}

View file

@ -39,7 +39,7 @@
<PackageReference Include="Zlib.Bindings" Version="1.8.0" />
<PackageReference Include="ModernUO.Serialization.Annotations" Version="2.0.2" />
<PackageReference Include="ModernUO.Serialization.Generator" Version="2.0.3" />
<PackageReference Include="ModernUO.Serialization.Generator" Version="2.0.4" />
</ItemGroup>
<ItemGroup>
<AdditionalFiles Include="Migrations/*.v*.json" />

View file

@ -657,99 +657,5 @@ namespace Server
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void RemoveGuild(BaseGuild guild) => Guilds.Remove(guild.Serial);
public static T ReadEntity<T>(this IGenericReader reader) where T : class, ISerializable
{
Serial serial = reader.ReadSerial();
var typeT = typeof(T);
T entity;
// Add to this list when creating new serializable types
if (typeof(BaseGuild).IsAssignableFrom(typeT))
{
entity = FindGuild(serial) as T;
// If we check for `entity.Deleted` here during deserialization then all guilds are deleted because
// Deleted -> Disbanded -> No leader, which is the case before deserialization.
// TODO: Use a deleted flag instead, and actively check for dibanded guilds properly.
}
else
{
entity = FindEntity<IEntity>(serial) as T;
if (entity?.Deleted == false)
{
return entity;
}
}
return entity?.Created <= reader.LastSerialized ? entity : null;
}
public static List<T> ReadEntityList<T>(this IGenericReader reader) where T : class, ISerializable
{
var count = reader.ReadInt();
var list = new List<T>(count);
for (var i = 0; i < count; ++i)
{
var entity = reader.ReadEntity<T>();
if (entity != null)
{
list.Add(entity);
}
}
return list;
}
public static HashSet<T> ReadEntitySet<T>(this IGenericReader reader) where T : class, ISerializable
{
var count = reader.ReadInt();
var set = new HashSet<T>(count);
for (var i = 0; i < count; ++i)
{
var entity = reader.ReadEntity<T>();
if (entity != null)
{
set.Add(entity);
}
}
return set;
}
public static void Write(this IGenericWriter writer, ISerializable value)
{
writer.Write(value?.Deleted != false ? Serial.MinusOne : value.Serial);
}
public static void Write<T>(this IGenericWriter writer, ICollection<T> coll) where T : class, ISerializable
{
writer.Write(coll.Count);
foreach (var entry in coll)
{
writer.Write(entry);
}
}
public static void Write<T>(
this IGenericWriter writer, ICollection<T> coll, Action<IGenericWriter, T> action
) where T : class, ISerializable
{
if (coll == null)
{
writer.Write(0);
return;
}
writer.Write(coll.Count);
foreach (var entry in coll)
{
action(writer, entry);
}
}
}
}