Cleanup/Housekeeping (#242)

This commit is contained in:
Kamron Batman 2020-09-12 15:31:21 -07:00 committed by GitHub
parent 90ede0659f
commit 741e8d8300
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
228 changed files with 6292 additions and 2690 deletions

View file

@ -1,23 +1,3 @@
/***************************************************************************
* MultiData.cs
* -------------------
* begin : May 1, 2002
* copyright : (C) The RunUO Software Team
* email : info@runuo.com
*
* $Id$
*
***************************************************************************/
/***************************************************************************
*
* 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 2 of the License, or
* (at your option) any later version.
*
***************************************************************************/
using System;
using System.Buffers;
using System.Collections.Generic;
@ -55,7 +35,10 @@ namespace Server
var vdPath = Core.FindDataFile("verdata.mul", false);
if (!File.Exists(vdPath)) return;
if (!File.Exists(vdPath))
{
return;
}
using var fs = new FileStream(vdPath, FileMode.Open, FileAccess.Read, FileShare.Read);
var bin = new BinaryReader(fs);
@ -92,11 +75,17 @@ namespace Server
multiID &= 0x3FFF;
if (Components.ContainsKey(multiID))
{
mcl = Components[multiID];
}
else if (!UsingUOPFormat)
{
Components[multiID] = mcl = Load(multiID);
}
else
{
mcl = MultiComponentList.Empty;
}
return mcl;
}
@ -108,10 +97,14 @@ namespace Server
// Head Information Start
if (streamReader.ReadInt32() != 0x0050594D) // Not a UOP Files
{
return;
}
if (streamReader.ReadInt32() > 5) // Bad Version
{
return;
}
// Multi ID List Array Start
UOPHash.BuildChunkIDs(out var chunkIds);
@ -149,7 +142,9 @@ namespace Server
index++;
if (offset == 0 || decompressedSize == 0 || filehash == 0x126D1E99DDEDEE0A) // Exclude housing.bin
{
continue;
}
chunkIds.TryGetValue(filehash, out var chunkID);
@ -160,7 +155,9 @@ namespace Server
Span<byte> sourceData = new byte[compressedSize];
if (stream.Read(sourceData) != compressedSize)
{
continue;
}
Span<byte> data;
@ -221,7 +218,9 @@ namespace Server
var length = m_IndexReader.ReadInt32();
if (lookup < 0 || length <= 0)
{
return MultiComponentList.Empty;
}
m_StreamReader.BaseStream.Seek(lookup, SeekOrigin.Begin);
@ -279,14 +278,18 @@ namespace Server
Tiles[x][y] = new StaticTile[toCopy.Tiles[x][y].Length];
for (var i = 0; i < Tiles[x][y].Length; ++i)
{
Tiles[x][y][i] = toCopy.Tiles[x][y][i];
}
}
}
List = new MultiTileEntry[toCopy.List.Length];
for (var i = 0; i < List.Length; ++i)
{
List[i] = toCopy.List[i];
}
}
public MultiComponentList(IGenericReader reader)
@ -304,11 +307,14 @@ namespace Server
var allTiles = List = new MultiTileEntry[length];
if (version == 0)
{
for (var i = 0; i < length; ++i)
{
int id = reader.ReadShort();
if (id >= 0x4000)
{
id -= 0x4000;
}
allTiles[i].ItemId = (ushort)id;
allTiles[i].OffsetX = reader.ReadShort();
@ -316,7 +322,9 @@ namespace Server
allTiles[i].OffsetZ = reader.ReadShort();
allTiles[i].Flags = (TileFlag)reader.ReadInt();
}
}
else
{
for (var i = 0; i < length; ++i)
{
allTiles[i].ItemId = reader.ReadUShort();
@ -325,6 +333,7 @@ namespace Server
allTiles[i].OffsetZ = reader.ReadShort();
allTiles[i].Flags = (TileFlag)reader.ReadInt();
}
}
var tiles = new TileList[Width][];
Tiles = new StaticTile[Width][][];
@ -335,10 +344,13 @@ namespace Server
Tiles[x] = new StaticTile[Height][];
for (var y = 0; y < Height; ++y)
{
tiles[x][y] = new TileList();
}
}
for (var i = 0; i < allTiles.Length; ++i)
{
if (i == 0 || allTiles[i].Flags != 0)
{
var xOffset = allTiles[i].OffsetX + Center.m_X;
@ -346,10 +358,15 @@ namespace Server
tiles[xOffset][yOffset].Add(allTiles[i].ItemId, (sbyte)allTiles[i].OffsetZ);
}
}
for (var x = 0; x < Width; ++x)
{
for (var y = 0; y < Height; ++y)
{
Tiles[x][y] = tiles[x][y].ToArray();
}
}
}
public MultiComponentList(BinaryReader reader, int count)
@ -364,25 +381,37 @@ namespace Server
allTiles[i].OffsetZ = reader.ReadInt16();
if (PostHSFormat)
{
allTiles[i].Flags = (TileFlag)reader.ReadUInt64();
}
else
{
allTiles[i].Flags = (TileFlag)reader.ReadUInt32();
}
var e = allTiles[i];
if (i == 0 || e.Flags != 0)
{
if (e.OffsetX < m_Min.m_X)
{
m_Min.m_X = e.OffsetX;
}
if (e.OffsetY < m_Min.m_Y)
{
m_Min.m_Y = e.OffsetY;
}
if (e.OffsetX > m_Max.m_X)
{
m_Max.m_X = e.OffsetX;
}
if (e.OffsetY > m_Max.m_Y)
{
m_Max.m_Y = e.OffsetY;
}
}
}
@ -399,10 +428,13 @@ namespace Server
Tiles[x] = new StaticTile[Height][];
for (var y = 0; y < Height; ++y)
{
tiles[x][y] = new TileList();
}
}
for (var i = 0; i < allTiles.Length; ++i)
{
if (i == 0 || allTiles[i].Flags != 0)
{
var xOffset = allTiles[i].OffsetX + Center.m_X;
@ -410,10 +442,15 @@ namespace Server
tiles[xOffset][yOffset].Add(allTiles[i].ItemId, (sbyte)allTiles[i].OffsetZ);
}
}
for (var x = 0; x < Width; ++x)
{
for (var y = 0; y < Height; ++y)
{
Tiles[x][y] = tiles[x][y].ToArray();
}
}
}
public MultiComponentList(List<MultiTileEntry> list)
@ -433,13 +470,25 @@ namespace Server
if (i == 0 || e.Flags != 0)
{
if (e.OffsetX < m_Min.m_X) m_Min.m_X = e.OffsetX;
if (e.OffsetX < m_Min.m_X)
{
m_Min.m_X = e.OffsetX;
}
if (e.OffsetY < m_Min.m_Y) m_Min.m_Y = e.OffsetY;
if (e.OffsetY < m_Min.m_Y)
{
m_Min.m_Y = e.OffsetY;
}
if (e.OffsetX > m_Max.m_X) m_Max.m_X = e.OffsetX;
if (e.OffsetX > m_Max.m_X)
{
m_Max.m_X = e.OffsetX;
}
if (e.OffsetY > m_Max.m_Y) m_Max.m_Y = e.OffsetY;
if (e.OffsetY > m_Max.m_Y)
{
m_Max.m_Y = e.OffsetY;
}
}
}
@ -455,10 +504,14 @@ namespace Server
tiles[x] = new TileList[Height];
Tiles[x] = new StaticTile[Height][];
for (var y = 0; y < Height; ++y) tiles[x][y] = new TileList();
for (var y = 0; y < Height; ++y)
{
tiles[x][y] = new TileList();
}
}
for (var i = 0; i < allTiles.Length; ++i)
{
if (i == 0 || allTiles[i].Flags != 0)
{
var xOffset = allTiles[i].OffsetX + Center.m_X;
@ -467,10 +520,15 @@ namespace Server
tiles[xOffset][yOffset].Add((ushort)itemID, (sbyte)allTiles[i].OffsetZ);
}
}
for (var x = 0; x < Width; ++x)
{
for (var y = 0; y < Height; ++y)
{
Tiles[x][y] = tiles[x][y].ToArray();
}
}
}
private MultiComponentList()
@ -514,7 +572,9 @@ namespace Server
(TileData.ItemTable[oldTiles[i].ID & TileData.MaxItemValue].Flags & TileFlag.Roof) != 0;
if (newIsRoof == oldIsRoof)
{
Remove(oldTiles[i].ID, x, y, z);
}
}
}
@ -523,7 +583,9 @@ namespace Server
var newTiles = new StaticTile[oldTiles.Length + 1];
for (var i = 0; i < oldTiles.Length; ++i)
{
newTiles[i] = oldTiles[i];
}
newTiles[oldTiles.Length] = new StaticTile((ushort)itemID, (sbyte)z);
@ -533,7 +595,9 @@ namespace Server
var newList = new MultiTileEntry[oldList.Length + 1];
for (var i = 0; i < oldList.Length; ++i)
{
newList[i] = oldList[i];
}
newList[oldList.Length] = new MultiTileEntry(
(ushort)itemID,
@ -546,16 +610,24 @@ namespace Server
List = newList;
if (x < m_Min.m_X)
{
m_Min.m_X = x;
}
if (y < m_Min.m_Y)
{
m_Min.m_Y = y;
}
if (x > m_Max.m_X)
{
m_Max.m_X = x;
}
if (y > m_Max.m_Y)
{
m_Max.m_Y = y;
}
}
}
@ -577,10 +649,14 @@ namespace Server
var newTiles = new StaticTile[oldTiles.Length - 1];
for (var j = 0; j < i; ++j)
{
newTiles[j] = oldTiles[j];
}
for (var j = i + 1; j < oldTiles.Length; ++j)
{
newTiles[j - 1] = oldTiles[j];
}
Tiles[vx][vy] = newTiles;
@ -600,10 +676,14 @@ namespace Server
var newList = new MultiTileEntry[oldList.Length - 1];
for (var j = 0; j < i; ++j)
{
newList[j] = oldList[j];
}
for (var j = i + 1; j < oldList.Length; ++j)
{
newList[j - 1] = oldList[j];
}
List = newList;
@ -631,10 +711,14 @@ namespace Server
var newTiles = new StaticTile[oldTiles.Length - 1];
for (var j = 0; j < i; ++j)
{
newTiles[j] = oldTiles[j];
}
for (var j = i + 1; j < oldTiles.Length; ++j)
{
newTiles[j - 1] = oldTiles[j];
}
Tiles[vx][vy] = newTiles;
@ -654,10 +738,14 @@ namespace Server
var newList = new MultiTileEntry[oldList.Length - 1];
for (var j = 0; j < i; ++j)
{
newList[j] = oldList[j];
}
for (var j = i + 1; j < oldList.Length; ++j)
{
newList[j - 1] = oldList[j];
}
List = newList;
@ -683,9 +771,13 @@ namespace Server
for (var y = 0; y < newHeight; ++y)
{
if (x < oldWidth && y < oldHeight)
{
newTiles[x][y] = oldTiles[x][y];
}
else
{
newTiles[x][y] = Array.Empty<StaticTile>();
}
totalLength += newTiles[x][y].Length;
}
@ -702,6 +794,7 @@ namespace Server
var index = 0;
for (var x = 0; x < newWidth; ++x)
{
for (var y = 0; y < newHeight; ++y)
{
var tiles = newTiles[x][y];
@ -714,16 +807,24 @@ namespace Server
var vy = y - Center.Y;
if (vx < m_Min.m_X)
{
m_Min.m_X = vx;
}
if (vy < m_Min.m_Y)
{
m_Min.m_Y = vy;
}
if (vx > m_Max.m_X)
{
m_Max.m_X = vx;
}
if (vy > m_Max.m_Y)
{
m_Max.m_Y = vy;
}
List[index++] = new MultiTileEntry(
(ushort)tile.ID,
@ -734,6 +835,7 @@ namespace Server
);
}
}
}
}
public void Serialize(IGenericWriter writer)
@ -771,7 +873,9 @@ namespace Server
chunkIds = new Dictionary<ulong, int>();
for (var i = 0; i < maxId; ++i)
{
chunkIds[HashLittle2($"build/multicollection/{i:000000}.bin")] = i;
}
}
private static ulong HashLittle2(string s)