fix: Overhauls champion titles & codegen champion system (#1430)

## MAJOR CHANGE

Added a champion title system to facilitate the existing champion titles. This should make it easier to extend or create other related game content. Champion titles will be saved in a folder called _ChampionTitles_.

### Motivation

The motivation to refactor was two-folder, but mostly related to performance in two ways.
First, every player had a ChampionTitleInfo object with an array of ChamptionTitleInfo. We want to eliminate the need for this information unless a player actually uses it. This should save a considerable amount of memory.

Second, to facilitate the atrophy mechanic, the champion titles would run atrophy post-world save, adding to the time that the server is frozen. Eliminating this post-world save side effect unlocks our ability to further optimize the world save process since there are no direct side effects.


### Bugs fixed

- [X] Fixed titles getting cut off on the paperdoll
- [X] Fixed champion title not displaying overhead (OPL)

### Screenshots
<img width="216" alt="image" src="https://github.com/modernuo/ModernUO/assets/3953314/8916f895-8d68-4fb0-892e-108a0c43be90">
This commit is contained in:
Kamron Batman 2023-07-27 21:44:06 -07:00 • committed by GitHub
parent 4dddc8d3f1
commit 51ecee6caa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
44 changed files with 3028 additions and 2785 deletions

View file

@ -0,0 +1,11 @@
{
"version": 0,
"type": "Server.Engines.CannedEvil.ChampionAltar",
"properties": [
{
"name": "Spawn",
"type": "Server.Engines.CannedEvil.ChampionSpawn",
"rule": "SerializableInterfaceMigrationRule"
}
]
}

View file

@ -0,0 +1,11 @@
{
"version": 0,
"type": "Server.Engines.CannedEvil.ChampionPlatform",
"properties": [
{
"name": "Spawn",
"type": "Server.Engines.CannedEvil.ChampionSpawn",
"rule": "SerializableInterfaceMigrationRule"
}
]
}

View file

@ -0,0 +1,21 @@
{
"version": 1,
"type": "Server.Engines.CannedEvil.ChampionSkullBrazier",
"properties": [
{
"name": "Type",
"type": "Server.Engines.CannedEvil.ChampionSkullType",
"rule": "EnumMigrationRule"
},
{
"name": "Platform",
"type": "Server.Engines.CannedEvil.ChampionSkullPlatform",
"rule": "SerializableInterfaceMigrationRule"
},
{
"name": "Skull",
"type": "Server.Item",
"rule": "SerializableInterfaceMigrationRule"
}
]
}

View file

@ -0,0 +1,36 @@
{
"version": 0,
"type": "Server.Engines.CannedEvil.ChampionSkullPlatform",
"properties": [
{
"name": "Power",
"type": "Server.Engines.CannedEvil.ChampionSkullBrazier",
"rule": "SerializableInterfaceMigrationRule"
},
{
"name": "Enlightenment",
"type": "Server.Engines.CannedEvil.ChampionSkullBrazier",
"rule": "SerializableInterfaceMigrationRule"
},
{
"name": "Venom",
"type": "Server.Engines.CannedEvil.ChampionSkullBrazier",
"rule": "SerializableInterfaceMigrationRule"
},
{
"name": "Pain",
"type": "Server.Engines.CannedEvil.ChampionSkullBrazier",
"rule": "SerializableInterfaceMigrationRule"
},
{
"name": "Greed",
"type": "Server.Engines.CannedEvil.ChampionSkullBrazier",
"rule": "SerializableInterfaceMigrationRule"
},
{
"name": "Death",
"type": "Server.Engines.CannedEvil.ChampionSkullBrazier",
"rule": "SerializableInterfaceMigrationRule"
}
]
}

View file

@ -0,0 +1,186 @@
{
"version": 10,
"type": "Server.Engines.CannedEvil.ChampionSpawn",
"properties": [
{
"name": "Level",
"type": "int",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "ActivatedByProximity",
"type": "bool",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "NextProximityTime",
"type": "System.DateTime",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
"DeltaTime"
]
},
{
"name": "MaxLevel",
"type": "int",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "ActivatedByValor",
"type": "bool",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "DamageEntries",
"type": "System.Collections.Generic.Dictionary\u003CServer.Mobile, int\u003E",
"rule": "DictionaryMigrationRule",
"ruleArguments": [
"Server.Mobile",
"SerializableInterfaceMigrationRule",
"0",
"int",
"PrimitiveTypeMigrationRule",
"1",
""
]
},
{
"name": "ConfinedRoaming",
"type": "bool",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "Idol",
"type": "Server.Engines.CannedEvil.IdolOfTheChampion",
"rule": "SerializableInterfaceMigrationRule"
},
{
"name": "HasBeenAdvanced",
"type": "bool",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "SpawnArea",
"type": "Server.Rectangle2D",
"rule": "PrimitiveUOTypeMigrationRule",
"ruleArguments": [
"Rect2D"
]
},
{
"name": "RandomizeType",
"type": "bool",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "Kills",
"type": "int",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "Active",
"type": "bool",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "Type",
"type": "Server.Engines.CannedEvil.ChampionSpawnType",
"rule": "EnumMigrationRule"
},
{
"name": "Creatures",
"type": "System.Collections.Generic.List\u003CServer.Mobile\u003E",
"rule": "ListMigrationRule",
"ruleArguments": [
"Server.Mobile",
"SerializableInterfaceMigrationRule"
]
},
{
"name": "RedSkulls",
"type": "System.Collections.Generic.List\u003CServer.Item\u003E",
"rule": "ListMigrationRule",
"ruleArguments": [
"Server.Item",
"SerializableInterfaceMigrationRule"
]
},
{
"name": "WhiteSkulls",
"type": "System.Collections.Generic.List\u003CServer.Item\u003E",
"rule": "ListMigrationRule",
"ruleArguments": [
"Server.Item",
"SerializableInterfaceMigrationRule"
]
},
{
"name": "Platform",
"type": "Server.Engines.CannedEvil.ChampionPlatform",
"rule": "SerializableInterfaceMigrationRule"
},
{
"name": "Altar",
"type": "Server.Engines.CannedEvil.ChampionAltar",
"rule": "SerializableInterfaceMigrationRule"
},
{
"name": "ExpireDelay",
"type": "System.TimeSpan",
"rule": "PrimitiveTypeMigrationRule"
},
{
"name": "ExpireTime",
"type": "System.DateTime",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
"DeltaTime"
]
},
{
"name": "Champion",
"type": "Server.Mobile",
"rule": "SerializableInterfaceMigrationRule"
},
{
"name": "RestartDelay",
"type": "System.TimeSpan",
"rule": "PrimitiveTypeMigrationRule"
},
{
"name": "RestartTime",
"type": "System.DateTime",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
"DeltaTime"
]
}
]
}

View file

@ -0,0 +1,22 @@
{
"version": 0,
"type": "Server.Engines.CannedEvil.ChampionTitle",
"properties": [
{
"name": "Value",
"type": "int",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
"EncodedInt"
]
},
{
"name": "LastDecay",
"type": "System.DateTime",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
}
]
}

View file

@ -0,0 +1,95 @@
{
"version": 1,
"type": "Server.Engines.CannedEvil.ChampionTitleContext",
"properties": [
{
"name": "Harrower",
"type": "int",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "Abyss",
"type": "Server.Engines.CannedEvil.ChampionTitle",
"usesSaveFlag": true,
"rule": "RawSerializableMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "Arachnid",
"type": "Server.Engines.CannedEvil.ChampionTitle",
"usesSaveFlag": true,
"rule": "RawSerializableMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "ColdBlood",
"type": "Server.Engines.CannedEvil.ChampionTitle",
"usesSaveFlag": true,
"rule": "RawSerializableMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "ForestLord",
"type": "Server.Engines.CannedEvil.ChampionTitle",
"usesSaveFlag": true,
"rule": "RawSerializableMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "VerminHorde",
"type": "Server.Engines.CannedEvil.ChampionTitle",
"usesSaveFlag": true,
"rule": "RawSerializableMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "UnholyTerror",
"type": "Server.Engines.CannedEvil.ChampionTitle",
"usesSaveFlag": true,
"rule": "RawSerializableMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "SleepingDragon",
"type": "Server.Engines.CannedEvil.ChampionTitle",
"usesSaveFlag": true,
"rule": "RawSerializableMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "Corrupt",
"type": "Server.Engines.CannedEvil.ChampionTitle",
"usesSaveFlag": true,
"rule": "RawSerializableMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "Glade",
"type": "Server.Engines.CannedEvil.ChampionTitle",
"usesSaveFlag": true,
"rule": "RawSerializableMigrationRule",
"ruleArguments": [
""
]
}
]
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Engines.CannedEvil.DungeonChampionSpawn"
}

View file

@ -0,0 +1,11 @@
{
"version": 0,
"type": "Server.Engines.CannedEvil.IdolOfTheChampion",
"properties": [
{
"name": "Spawn",
"type": "Server.Engines.CannedEvil.ChampionSpawn",
"rule": "SerializableInterfaceMigrationRule"
}
]
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Engines.CannedEvil.LLChampionSpawn"
}

View file

@ -0,0 +1,11 @@
{
"version": 2,
"type": "Server.Items.ChampionSkull",
"properties": [
{
"name": "Type",
"type": "Server.Engines.CannedEvil.ChampionSkullType",
"rule": "EnumMigrationRule"
}
]
}

View file

@ -0,0 +1,11 @@
{
"version": 0,
"type": "Server.Items.HarrowerGate",
"properties": [
{
"name": "Harrower",
"type": "Server.Mobile",
"rule": "SerializableInterfaceMigrationRule"
}
]
}

View file

@ -0,0 +1,22 @@
{
"version": 1,
"type": "Server.Items.StarRoomGate",
"properties": [
{
"name": "Decays",
"type": "bool",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
},
{
"name": "DecayTime",
"type": "System.DateTime",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
"DeltaTime"
]
}
]
}