Add the ability to add xomtypes if there missing
This commit is contained in:
parent
32778d1316
commit
c6248a3a0a
|
@ -71,7 +71,7 @@ namespace LibW4M.Data.Teams
|
|||
public XomString Tash;
|
||||
public int[] StoryMissionsCompleted;
|
||||
public int StoryChapter;
|
||||
public TeamData(W4SaveFile fileBelongs, XomContainer mainContainer) : base(fileBelongs, mainContainer)
|
||||
public TeamData(W4SaveFile fileBelongs, XomContainer mainContainer, bool load=true) : base(fileBelongs, mainContainer, load)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -115,6 +115,136 @@ namespace LibW4M.Data.Teams
|
|||
base.DeleteEntries();
|
||||
}
|
||||
|
||||
private void setDefaultWeapon()
|
||||
{
|
||||
// Search other teams for "FETXT.Factory.Blaster"
|
||||
bool foundDefault = false;
|
||||
foreach (TeamData team in fileBelongs.TeamDataColective)
|
||||
{
|
||||
if (team.CustomWeapon.Value == "FETXT.Factory.Blaster")
|
||||
{
|
||||
this.SecretWeapon = team.SecretWeapon;
|
||||
this.SecretWeaponCluster = team.SecretWeaponCluster;
|
||||
foundDefault = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// not found? FIIIIIIIIIIINE ILL CREATE IT MYSELF
|
||||
if (!foundDefault)
|
||||
{
|
||||
WeaponData weapon = new WeaponData(fileBelongs, fileBelongs.CreateContainer("WeaponFactoryContainer"), false);
|
||||
WeaponData cluster = new WeaponData(fileBelongs, fileBelongs.CreateContainer("WeaponFactoryContainer"), false);
|
||||
|
||||
// Set weapon data
|
||||
weapon.Name = fileBelongs.LookupString("");
|
||||
weapon.Type = 0;
|
||||
weapon.DetonationType = DetonationType.Fuse;
|
||||
weapon.ProjectileLaunchType = ProjectileLaunchType.Thrown;
|
||||
weapon.RetreatTime = -1;
|
||||
weapon.FuseTime = -1;
|
||||
|
||||
weapon.WormDamageRadius = 0.75f;
|
||||
weapon.WormDamageMagnitude = 0.75f;
|
||||
weapon.LandDamageRadius = 0.600000024f;
|
||||
weapon.Push = 0.600000024f;
|
||||
weapon.ProjectileMaxPower = 1.0f;
|
||||
|
||||
weapon.ProjectileNumClusters = 0;
|
||||
weapon.ClusterMaxSpeed = 0.300000012f;
|
||||
weapon.ClusterMaxSpeed = 0.0f;
|
||||
|
||||
weapon.PayloadResourceId = 16;
|
||||
weapon.ProjectileCollisionRadius = 1.0f;
|
||||
weapon.LaunchFX = fileBelongs.LookupString("");
|
||||
weapon.ArielFX = fileBelongs.LookupString("");
|
||||
weapon.DetonationFX = fileBelongs.LookupString("EffectExplosion");
|
||||
weapon.GraphicalResources = new XomString[4] { fileBelongs.LookupString("Factory.TankGunBody"), fileBelongs.LookupString("Factory.TankGunBarrel"), fileBelongs.LookupString("Factory.TankGunButt"), fileBelongs.LookupString("Factory.TankGunSight") };
|
||||
weapon.GraphicalLocators = new XomString[4] { fileBelongs.LookupString("TANK_body_locator"), fileBelongs.LookupString("TANK_barrel_root_locator"), fileBelongs.LookupString("TANK_butt_root_locator"), fileBelongs.LookupString("TANK_sight_root_locator") };
|
||||
|
||||
weapon.Homing = false;
|
||||
weapon.HomingAvoidLand = false;
|
||||
weapon.Poison = false;
|
||||
weapon.EffectedByWind = false;
|
||||
weapon.ProjectilePowersUp = true;
|
||||
weapon.FireOnGround = false;
|
||||
|
||||
weapon.Save();
|
||||
|
||||
// Set cluster data
|
||||
|
||||
cluster.Name = fileBelongs.LookupString("");
|
||||
cluster.Type = 1;
|
||||
cluster.DetonationType = DetonationType.Fuse;
|
||||
cluster.ProjectileLaunchType = ProjectileLaunchType.Thrown;
|
||||
cluster.RetreatTime = -1;
|
||||
cluster.FuseTime = -1;
|
||||
|
||||
cluster.WormDamageRadius = 0.75f;
|
||||
cluster.WormDamageMagnitude = 0.75f;
|
||||
cluster.LandDamageRadius = 0.600000024f;
|
||||
cluster.Push = 0.600000024f;
|
||||
cluster.ProjectileMaxPower = 1.0f;
|
||||
|
||||
cluster.ProjectileNumClusters = 0;
|
||||
cluster.ClusterMaxSpeed = 0.300000012f;
|
||||
cluster.ClusterMaxSpeed = 0.0f;
|
||||
|
||||
cluster.PayloadResourceId = 16;
|
||||
cluster.ProjectileCollisionRadius = 1.0f;
|
||||
cluster.LaunchFX = fileBelongs.LookupString("");
|
||||
cluster.ArielFX = fileBelongs.LookupString("");
|
||||
cluster.DetonationFX = fileBelongs.LookupString("EffectExplosion");
|
||||
cluster.GraphicalResources = new XomString[1] { fileBelongs.LookupString("Grenade.Weapon") };
|
||||
cluster.GraphicalLocators = new XomString[0];
|
||||
|
||||
cluster.Homing = false;
|
||||
cluster.HomingAvoidLand = false;
|
||||
cluster.Poison = false;
|
||||
cluster.EffectedByWind = false;
|
||||
cluster.ProjectilePowersUp = true;
|
||||
cluster.FireOnGround = false;
|
||||
|
||||
cluster.Save();
|
||||
|
||||
this.SecretWeapon = weapon;
|
||||
this.SecretWeaponCluster = cluster;
|
||||
}
|
||||
}
|
||||
internal override void loadDefaults()
|
||||
{
|
||||
this.Name = fileBelongs.LookupString("Untitled Team");
|
||||
this.Worms = new XomString[6] { fileBelongs.LookupString("Worm 1"), fileBelongs.LookupString("Worm 2"), fileBelongs.LookupString("Worm 3"), fileBelongs.LookupString("Worm 4"), fileBelongs.LookupString("Worm 5"), fileBelongs.LookupString("Worm 6") };
|
||||
|
||||
this.TutorialsDone = 0;
|
||||
this.NewTeam = 0;
|
||||
this.Skill = SkillLevel.PlayerControled;
|
||||
|
||||
this.Grave = 0;
|
||||
this.SWeapon = 0;
|
||||
this.Flag = fileBelongs.LookupString("Flag.UK");
|
||||
this.Speech = fileBelongs.LookupString("voclassi");
|
||||
this.InGame = false;
|
||||
this.AllMissionsDone = false;
|
||||
this.AllMissionsDone = false;
|
||||
|
||||
this.Player = fileBelongs.LookupString("");
|
||||
|
||||
// Deal with team weapon
|
||||
setDefaultWeapon();
|
||||
this.CustomWeapon = fileBelongs.LookupString("FETXT.Factory.Blaster");
|
||||
//
|
||||
|
||||
this.Hat = fileBelongs.LookupString("");
|
||||
this.Gloves = fileBelongs.LookupString("");
|
||||
this.Glasses = fileBelongs.LookupString("");
|
||||
this.Tash = fileBelongs.LookupString("");
|
||||
|
||||
this.StoryMissionsCompleted = new int[5];
|
||||
this.StoryChapter = 0;
|
||||
|
||||
base.loadDefaults();
|
||||
}
|
||||
public override void Load()
|
||||
{
|
||||
using (XomStreamReader reader = new XomStreamReader(new MemoryStream(this.mainContainer.GetData())))
|
||||
|
@ -137,7 +267,6 @@ namespace LibW4M.Data.Teams
|
|||
|
||||
this.secretWeapon = new WeaponData(fileBelongs, fileBelongs.LookupContainerById(reader.ReadCompressedInt()));
|
||||
this.secretWeaponCluster = new WeaponData(fileBelongs, fileBelongs.LookupContainerById(reader.ReadCompressedInt()));
|
||||
|
||||
this.CustomWeapon = fileBelongs.LookupStringFromId(reader.ReadCompressedInt());
|
||||
|
||||
this.Hat = fileBelongs.LookupStringFromId(reader.ReadCompressedInt());
|
||||
|
@ -152,6 +281,9 @@ namespace LibW4M.Data.Teams
|
|||
|
||||
public override void Save()
|
||||
{
|
||||
this.SecretWeapon.Save();
|
||||
this.SecretWeaponCluster.Save();
|
||||
|
||||
using (MemoryStream ms = new MemoryStream())
|
||||
{
|
||||
using (XomStreamWriter writer = new XomStreamWriter(ms))
|
||||
|
|
|
@ -16,7 +16,8 @@ namespace LibW4M.Data.Teams
|
|||
|
||||
public override void Create()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
TeamData team = new TeamData(this.fileBelongs, this.fileBelongs.CreateContainer("StoredTeamData"), false);
|
||||
this.collectiveEntries.Add(team);
|
||||
}
|
||||
|
||||
public override void Load()
|
||||
|
|
|
@ -28,7 +28,8 @@ namespace LibW4M.Data.WeaponFactory
|
|||
|
||||
public override void Create()
|
||||
{
|
||||
this.collectiveEntries.Add(new WeaponStore(this.fileBelongs, this.fileBelongs.CreateContainer("StoreWeaponFactory"), false));
|
||||
WeaponStore store = new WeaponStore(this.fileBelongs, this.fileBelongs.CreateContainer("StoreWeaponFactory"), false);
|
||||
this.collectiveEntries.Add(store);
|
||||
}
|
||||
|
||||
public override void Load()
|
||||
|
|
|
@ -16,9 +16,11 @@ using LibXom.Blocks;
|
|||
using LibXom.Data;
|
||||
using LibXom.Exceptions;
|
||||
using LibXom.Streams;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Xml.XPath;
|
||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||
|
||||
namespace LibW4M
|
||||
{
|
||||
|
@ -214,10 +216,139 @@ namespace LibW4M
|
|||
for (int i = 0; i < strings.Length; i++) strings[i] = this.LookupStringFromId(stringIds[i]);
|
||||
return strings;
|
||||
}
|
||||
private static byte[] getXomTypeXBytes(string name)
|
||||
{
|
||||
switch (name)
|
||||
{
|
||||
case "WeaponFactoryContainer":
|
||||
return new byte[0x10] { 0xA5, 0x36, 0x42, 0x20, 0xF4, 0x4D, 0x60, 0x4F, 0x90, 0x97, 0x4F, 0xA8, 0x87, 0xD5, 0xC7, 0x4D };
|
||||
case "StoreWeaponFactory":
|
||||
return new byte[0x10] { 0xB5, 0x2C, 0x2F, 0xE3, 0x3A, 0x13, 0x1C, 0x4F, 0xB6, 0x4A, 0x81, 0xB8, 0x97, 0x30, 0x2E, 0x82 };
|
||||
case "WeaponFactoryCollective":
|
||||
return new byte[0x10] { 0xB2, 0x4A, 0x97, 0x29, 0xF8, 0x2E, 0x3D, 0x4E, 0xB7, 0x98, 0xF5, 0x8D, 0x3F, 0x36, 0x07, 0xFF };
|
||||
case "StoredTeamData":
|
||||
return new byte[0x10] { 0x55, 0xB4, 0x6A, 0x78, 0x13, 0x63, 0xC6, 0x4D, 0xA1, 0xA3, 0xA5, 0x4B, 0x67, 0xD5, 0x2C, 0xDE };
|
||||
case "HighScoreData":
|
||||
return new byte[0x10] { 0xED, 0xB1, 0x58, 0x90, 0x67, 0x06, 0x31, 0x44, 0xBC, 0x6B, 0x7E, 0x56, 0x6C, 0x8C, 0xBC, 0xE4 };
|
||||
case "TeamDataColective":
|
||||
return new byte[0x10] { 0x39, 0x11, 0x7C, 0x55, 0xF9, 0xEA, 0xBF, 0x49, 0x99, 0x8D, 0x05, 0xD8, 0x52, 0x59, 0x86, 0x55 };
|
||||
case "WeaponSettingsData":
|
||||
return new byte[0x10] { 0x16, 0x2E, 0xAC, 0x14, 0x90, 0x16, 0x97, 0x43, 0xBA, 0x75, 0x20, 0x4D, 0xAC, 0x1C, 0x56, 0x3F };
|
||||
case "SchemeData":
|
||||
return new byte[0x10] { 0x6B, 0xDD, 0x69, 0x39, 0x1A, 0xAF, 0xBF, 0x40, 0xBF, 0x2C, 0x21, 0xE3, 0x7C, 0x4B, 0xFC, 0xFE };
|
||||
case "SchemeColective":
|
||||
return new byte[0x10] { 0x1E, 0x40, 0x13, 0xDF, 0xC6, 0x8F, 0x50, 0x44, 0x8C, 0x7F, 0x55, 0xC6, 0x72, 0xA7, 0x27, 0x25 };
|
||||
case "WXFE_UnlockableItem":
|
||||
return new byte[0x10] { 0x72, 0x12, 0xCB, 0x5B, 0x48, 0xBF, 0x9F, 0x4A, 0xA2, 0xD3, 0xD1, 0x21, 0xA9, 0x82, 0xD7, 0x3A };
|
||||
case "InputDetailsContainer":
|
||||
return new byte[0x10] { 0x66, 0xE0, 0x60, 0xA5, 0xAB, 0x92, 0xC2, 0x43, 0x8E, 0x71, 0x46, 0xE8, 0x34, 0xF5, 0xDF, 0x80 };
|
||||
case "InputEventMappingContainer":
|
||||
return new byte[0x10] { 0x30, 0x7B, 0x4E, 0x74, 0x00, 0xED, 0x46, 0x4C, 0xA4, 0x5D, 0x87, 0x0C, 0xD3, 0x52, 0x81, 0xD8 };
|
||||
case "InputMappingDetails":
|
||||
return new byte[0x10] { 0x7B, 0x26, 0x21, 0x39, 0xC6, 0x3E, 0x69, 0x4C, 0xB7, 0xDD, 0x19, 0x9A, 0xED, 0xEB, 0x71, 0x5C };
|
||||
case "StatsContainer":
|
||||
return new byte[0x10] { 0x13, 0x54, 0xBC, 0xDF, 0x36, 0x80, 0x71, 0x4F, 0x83, 0x71, 0x6F, 0x3B, 0x5D, 0x87, 0x63, 0xED };
|
||||
case "StoredStatsCollective":
|
||||
return new byte[0x10] { 0x25, 0x1D, 0x56, 0xF7, 0x90, 0xD3, 0xF9, 0x4B, 0xA7, 0xE3, 0xE6, 0x73, 0xD6, 0x75, 0xCE, 0x03 };
|
||||
case "TeamAwardsContainer":
|
||||
return new byte[0x10] { 0xBB, 0x77, 0x14, 0x26, 0x44, 0xC0, 0xAC, 0x4C, 0xA4, 0x18, 0x90, 0x8F, 0xE9, 0x07, 0x5C, 0xF8 };
|
||||
case "XResourceDetails":
|
||||
return new byte[0x10] { 0xF2, 0x56, 0x75, 0xE7, 0x95, 0xA4, 0x1A, 0x49, 0x85, 0x63, 0x00, 0x6C, 0xE2, 0x57, 0x72, 0x44 };
|
||||
case "XIntResourceDetails":
|
||||
return new byte[0x10] { 0x8D, 0x9B, 0x88, 0x7D, 0x14, 0x2C, 0x5E, 0x44, 0x96, 0x1F, 0x5E, 0x0E, 0x55, 0x20, 0x41, 0x6A };
|
||||
case "XUintResourceDetails":
|
||||
return new byte[0x10] { 0x7C, 0x11, 0xE5, 0x93, 0xDA, 0x8A, 0xFB, 0x4A, 0xB1, 0x7A, 0x66, 0x8D, 0x0B, 0xDD, 0x15, 0xE6 };
|
||||
case "XStringResourceDetails":
|
||||
return new byte[0x10] { 0x72, 0x58, 0xDC, 0x7C, 0xA3, 0x2C, 0xCC, 0x4F, 0xAE, 0x66, 0x43, 0x10, 0x71, 0xE5, 0xCE, 0x67 };
|
||||
case "XFloatResourceDetails":
|
||||
return new byte[0x10] { 0x5F, 0x9D, 0x88, 0x08, 0x39, 0x80, 0xEA, 0x4C, 0xBA, 0x5B, 0x9C, 0x05, 0x9A, 0xC0, 0x57, 0x0E };
|
||||
case "XContainerResourceDetails":
|
||||
return new byte[0x10] { 0x20, 0xBF, 0xB6, 0xE0, 0x0B, 0xF8, 0x29, 0x43, 0xB6, 0xEB, 0x19, 0x98, 0xED, 0x8A, 0xEC, 0x1F };
|
||||
case "XDataBank":
|
||||
return new byte[0x10] { 0xAC, 0x61, 0xE6, 0x93, 0x41, 0xD9, 0x2A, 0x44, 0xA1, 0x8E, 0xE9, 0x9B, 0x79, 0x58, 0x79, 0xDC };
|
||||
case "XContainer":
|
||||
return new byte[0x10] { 0x46, 0xD4, 0x1C, 0x5E, 0xA3, 0x48, 0xFE, 0x44, 0xA5, 0x5A, 0xE2, 0x47, 0xB8, 0xF5, 0xE7, 0x13 };
|
||||
default:
|
||||
return new byte[0x10];
|
||||
}
|
||||
}
|
||||
|
||||
private int findInStringArray(string str, string[] arr)
|
||||
{
|
||||
for(int i = 0; i < arr.Length; i++)
|
||||
{
|
||||
if (str.Equals(arr[i], StringComparison.InvariantCulture)) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
private int getXomTypeInsertPos(string typeName)
|
||||
{
|
||||
XomType[] types = xomFile.XomTypes;
|
||||
string[] typesOrder = new string[] {
|
||||
"WeaponFactoryContainer",
|
||||
"StoreWeaponFactory",
|
||||
"WeaponFactoryCollective",
|
||||
"StoredTeamData",
|
||||
"HighScoreData",
|
||||
"TeamDataColective",
|
||||
"WeaponSettingsData",
|
||||
"SchemeData",
|
||||
"SchemeColective",
|
||||
"WXFE_UnlockableItem",
|
||||
"InputDetailsContainer",
|
||||
"InputEventMappingContainer",
|
||||
"InputMappingDetails",
|
||||
"StatsContainer",
|
||||
"StoredStatsCollective",
|
||||
"TeamAwardsContainer",
|
||||
"XResourceDetails",
|
||||
"XIntResourceDetails",
|
||||
"XUintResourceDetails",
|
||||
"XStringResourceDetails",
|
||||
"XFloatResourceDetails",
|
||||
"XContainerResourceDetails",
|
||||
"XDataBank",
|
||||
"XContainer"
|
||||
};
|
||||
|
||||
int loc = findInStringArray(typeName, typesOrder);
|
||||
|
||||
string[] strs = new string[typesOrder.Length];
|
||||
|
||||
for (int i = 0; i < types.Length; i++)
|
||||
{
|
||||
int f = findInStringArray(types[i].Name, typesOrder);
|
||||
strs[f] = types[i].Name;
|
||||
}
|
||||
|
||||
strs[loc] = typeName;
|
||||
|
||||
int ins = 0;
|
||||
foreach(string str in strs)
|
||||
{
|
||||
if (str == null)
|
||||
continue;
|
||||
if (str == typeName)
|
||||
break;
|
||||
ins++;
|
||||
}
|
||||
return ins - 1;
|
||||
}
|
||||
|
||||
public void CreateXomType(string typeName)
|
||||
{
|
||||
byte[] xbytes = getXomTypeXBytes(typeName);
|
||||
int insertInto = getXomTypeInsertPos(typeName);
|
||||
xomFile.CreateXomType(xbytes, typeName, insertInto);
|
||||
}
|
||||
|
||||
public XomContainer CreateContainer(string type)
|
||||
{
|
||||
return xomFile.CreateContainer(type);
|
||||
try
|
||||
{
|
||||
return xomFile.CreateContainer(type);
|
||||
}
|
||||
catch(XomTypeNotFoundException) { this.CreateXomType(type); return this.CreateContainer(type); }
|
||||
}
|
||||
public XomContainer LookupContainerById(int id)
|
||||
{
|
||||
|
|
|
@ -18,7 +18,7 @@ namespace LibXom.Blocks
|
|||
return numCtnr;
|
||||
}
|
||||
}
|
||||
public byte[] Md5
|
||||
public byte[] XBytes
|
||||
{
|
||||
get
|
||||
{
|
||||
|
|
|
@ -90,12 +90,19 @@ namespace LibXom.Data
|
|||
{
|
||||
return XomContainers[containerId - 1];
|
||||
}
|
||||
public XomType CreateXomType(byte[] xBytes, string typeName, int insertAt=-1)
|
||||
{
|
||||
if (insertAt == -1) insertAt = xomTypes.Count - 1;
|
||||
XomType newType = new XomType(this, xBytes, typeName, new XomContainer[0]);
|
||||
xomTypes.Insert(insertAt, newType);
|
||||
return newType;
|
||||
}
|
||||
public XomType GetTypeByName(string typeName)
|
||||
{
|
||||
foreach(XomType type in XomTypes)
|
||||
if (type.Name.Equals(typeName, StringComparison.InvariantCulture)) return type;
|
||||
|
||||
throw new XomTypeNotFoundException("Type \"" + typeName + "\" was not found in XOM.");
|
||||
throw new XomTypeNotFoundException("Could not find xom type: " + typeName);
|
||||
}
|
||||
|
||||
public XomContainer GetContainerByUuid(string uuid)
|
||||
|
@ -111,6 +118,18 @@ namespace LibXom.Data
|
|||
throw new XomContainerNotFoundException("No container was found with the uuid: " + uuid);
|
||||
}
|
||||
|
||||
internal void deleteXomType(XomType type)
|
||||
{
|
||||
for(int i = 0; i < xomTypes.Count; i++)
|
||||
{
|
||||
if (xomTypes[i].Equals(type))
|
||||
{
|
||||
xomTypes.RemoveAt(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal int calculateIdForXomStrings(XomString searchString)
|
||||
{
|
||||
XomString[] stringsList = this.XomStrings;
|
||||
|
@ -140,7 +159,7 @@ namespace LibXom.Data
|
|||
blocks.Add(new MoikBlock(this.version, containers.Length, types.Length));
|
||||
|
||||
// add type blocks
|
||||
foreach (XomType type in types) blocks.Add(new TypeBlock(type.Containers.Length, type.Md5, type.Name));
|
||||
foreach (XomType type in types) blocks.Add(new TypeBlock(type.Containers.Length, type.XBytes, type.Name));
|
||||
|
||||
// Add guid and schm block
|
||||
blocks.Add(new GuidBlock(0, 0, 0));
|
||||
|
@ -222,7 +241,7 @@ namespace LibXom.Data
|
|||
foreach (TypeBlock type in typeBlocks)
|
||||
{
|
||||
string typeName = type.TypeName;
|
||||
byte[] md5 = type.Md5;
|
||||
byte[] xBytes = type.XBytes;
|
||||
int numContainers = type.NumCtnr;
|
||||
// Create a list of containers, inside this type.
|
||||
List<XomContainer> xomContainers = new List<XomContainer>();
|
||||
|
@ -240,7 +259,7 @@ namespace LibXom.Data
|
|||
cnt++; // Increment the global container block count.
|
||||
}
|
||||
|
||||
this.xomTypes.Add(new XomType(this, md5, typeName, xomContainers.ToArray()));
|
||||
this.xomTypes.Add(new XomType(this, xBytes, typeName, xomContainers.ToArray()));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -25,7 +25,8 @@ namespace LibXom.Data
|
|||
public override bool Equals(object? obj)
|
||||
{
|
||||
if (obj is not XomFileComponent) return false;
|
||||
return this.Uuid.Equals((obj as XomFileComponent).Uuid, StringComparison.InvariantCultureIgnoreCase);
|
||||
XomFileComponent xComponent = (obj as XomFileComponent);
|
||||
return this.Uuid.Equals(xComponent.Uuid, StringComparison.InvariantCultureIgnoreCase);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ namespace LibXom.Data
|
|||
{
|
||||
public class XomType : XomFileComponent
|
||||
{
|
||||
private byte[] md5;
|
||||
private byte[] xBytes;
|
||||
private string name;
|
||||
private List<XomContainer> xomContainers = new List<XomContainer>();
|
||||
public override int Id
|
||||
|
@ -20,11 +20,11 @@ namespace LibXom.Data
|
|||
}
|
||||
}
|
||||
|
||||
public byte[] Md5
|
||||
public byte[] XBytes
|
||||
{
|
||||
get
|
||||
{
|
||||
return md5;
|
||||
return xBytes;
|
||||
}
|
||||
}
|
||||
public string Name
|
||||
|
@ -45,15 +45,13 @@ namespace LibXom.Data
|
|||
{
|
||||
for (int i = 0; i < xomContainers.Count; i++)
|
||||
{
|
||||
if (xomContainers[i].Uuid.Equals(container.Uuid, StringComparison.InvariantCulture))
|
||||
if (xomContainers[i].Equals(container))
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
// maybe removed this container by mistakes; so lets just add it back
|
||||
container.Type.xomContainers.Add(container);
|
||||
return getContainerIndex(container);
|
||||
throw new XomContainerNotFoundException("container with uuid " + container.Uuid + " not found in type " + this.Name);
|
||||
}
|
||||
public void ReplaceContainerData(XomContainer container, byte[] newData)
|
||||
{
|
||||
|
@ -68,16 +66,34 @@ namespace LibXom.Data
|
|||
return xomContainer;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return this.Name.GetHashCode();
|
||||
}
|
||||
|
||||
public override bool Equals(object? obj)
|
||||
{
|
||||
if (obj is not XomType) return false;
|
||||
XomType xCompare = obj as XomType;
|
||||
|
||||
return xCompare.Name.Equals(this.Name, StringComparison.InvariantCultureIgnoreCase);
|
||||
}
|
||||
|
||||
public void DeleteContainer(XomContainer container)
|
||||
{
|
||||
int indx = this.getContainerIndex(container);
|
||||
this.xomContainers.RemoveAt(indx);
|
||||
|
||||
if(this.xomContainers.Count == 0)
|
||||
this.fileBelongs.deleteXomType(this);
|
||||
}
|
||||
|
||||
internal XomType(XomFile fileFrom, byte[] md5, string name, XomContainer[] xomContainers)
|
||||
|
||||
|
||||
internal XomType(XomFile fileFrom, byte[] xBytes, string name, XomContainer[] xomContainers)
|
||||
{
|
||||
fileBelongs = fileFrom;
|
||||
this.md5 = md5;
|
||||
this.xBytes = xBytes;
|
||||
this.name = name;
|
||||
this.xomContainers.AddRange(xomContainers);
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ namespace LibXom
|
|||
xomStream.Skip(0x4);
|
||||
xomStream.WriteInt32(typeBlock.NumCtnr);
|
||||
xomStream.Skip(0x4);
|
||||
xomStream.WriteBytes(typeBlock.Md5);
|
||||
xomStream.WriteBytes(typeBlock.XBytes);
|
||||
xomStream.WriteStrLen(typeBlock.TypeName, 0x20);
|
||||
}
|
||||
|
||||
|
|
|
@ -451,12 +451,16 @@
|
|||
// selWormSelectAtGameStart
|
||||
//
|
||||
this.selWormSelectAtGameStart.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.selWormSelectAtGameStart.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.selWormSelectAtGameStart.FormattingEnabled = true;
|
||||
this.selWormSelectAtGameStart.Items.AddRange(new object[] {
|
||||
"No",
|
||||
"Yes"});
|
||||
this.selWormSelectAtGameStart.Location = new System.Drawing.Point(121, 160);
|
||||
this.selWormSelectAtGameStart.Name = "selWormSelectAtGameStart";
|
||||
this.selWormSelectAtGameStart.Size = new System.Drawing.Size(546, 23);
|
||||
this.selWormSelectAtGameStart.TabIndex = 32;
|
||||
this.selWormSelectAtGameStart.Text = "0";
|
||||
this.selWormSelectAtGameStart.Value = 0;
|
||||
this.selWormSelectAtGameStart.Value = LibW4M.Data.YesNo.No;
|
||||
//
|
||||
// lblTurnTime
|
||||
//
|
||||
|
@ -516,12 +520,16 @@
|
|||
// selTeleportIn
|
||||
//
|
||||
this.selTeleportIn.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.selTeleportIn.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.selTeleportIn.FormattingEnabled = true;
|
||||
this.selTeleportIn.Items.AddRange(new object[] {
|
||||
"No",
|
||||
"Yes"});
|
||||
this.selTeleportIn.Location = new System.Drawing.Point(121, 98);
|
||||
this.selTeleportIn.Name = "selTeleportIn";
|
||||
this.selTeleportIn.Size = new System.Drawing.Size(546, 23);
|
||||
this.selTeleportIn.TabIndex = 24;
|
||||
this.selTeleportIn.Text = "0";
|
||||
this.selTeleportIn.Value = 0;
|
||||
this.selTeleportIn.Value = LibW4M.Data.YesNo.No;
|
||||
//
|
||||
// lblTeleportIn
|
||||
//
|
||||
|
@ -587,12 +595,16 @@
|
|||
// selArtilaryMode
|
||||
//
|
||||
this.selArtilaryMode.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.selArtilaryMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.selArtilaryMode.FormattingEnabled = true;
|
||||
this.selArtilaryMode.Items.AddRange(new object[] {
|
||||
"No",
|
||||
"Yes"});
|
||||
this.selArtilaryMode.Location = new System.Drawing.Point(121, 67);
|
||||
this.selArtilaryMode.Name = "selArtilaryMode";
|
||||
this.selArtilaryMode.Size = new System.Drawing.Size(546, 23);
|
||||
this.selArtilaryMode.TabIndex = 22;
|
||||
this.selArtilaryMode.Text = "No";
|
||||
this.selArtilaryMode.Value = 0;
|
||||
this.selArtilaryMode.Value = LibW4M.Data.YesNo.No;
|
||||
//
|
||||
// selNumRounds
|
||||
//
|
||||
|
@ -607,12 +619,16 @@
|
|||
// selDisplayTime
|
||||
//
|
||||
this.selDisplayTime.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.selDisplayTime.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.selDisplayTime.FormattingEnabled = true;
|
||||
this.selDisplayTime.Items.AddRange(new object[] {
|
||||
"No",
|
||||
"Yes"});
|
||||
this.selDisplayTime.Location = new System.Drawing.Point(121, 315);
|
||||
this.selDisplayTime.Name = "selDisplayTime";
|
||||
this.selDisplayTime.Size = new System.Drawing.Size(546, 23);
|
||||
this.selDisplayTime.TabIndex = 46;
|
||||
this.selDisplayTime.Text = "0";
|
||||
this.selDisplayTime.Value = 0;
|
||||
this.selDisplayTime.Value = LibW4M.Data.YesNo.No;
|
||||
//
|
||||
// selLandTime
|
||||
//
|
||||
|
@ -637,12 +653,16 @@
|
|||
// selFallDamage
|
||||
//
|
||||
this.selFallDamage.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.selFallDamage.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.selFallDamage.FormattingEnabled = true;
|
||||
this.selFallDamage.Items.AddRange(new object[] {
|
||||
"No",
|
||||
"Yes"});
|
||||
this.selFallDamage.Location = new System.Drawing.Point(121, 408);
|
||||
this.selFallDamage.Name = "selFallDamage";
|
||||
this.selFallDamage.Size = new System.Drawing.Size(546, 23);
|
||||
this.selFallDamage.TabIndex = 49;
|
||||
this.selFallDamage.Text = "0";
|
||||
this.selFallDamage.Value = 0;
|
||||
this.selFallDamage.Value = LibW4M.Data.YesNo.No;
|
||||
//
|
||||
// selHotSeat
|
||||
//
|
||||
|
@ -657,12 +677,16 @@
|
|||
// selSpecial
|
||||
//
|
||||
this.selSpecial.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.selSpecial.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.selSpecial.FormattingEnabled = true;
|
||||
this.selSpecial.Items.AddRange(new object[] {
|
||||
"No",
|
||||
"Yes"});
|
||||
this.selSpecial.Location = new System.Drawing.Point(121, 470);
|
||||
this.selSpecial.Name = "selSpecial";
|
||||
this.selSpecial.Size = new System.Drawing.Size(546, 23);
|
||||
this.selSpecial.TabIndex = 51;
|
||||
this.selSpecial.Text = "0";
|
||||
this.selSpecial.Value = 0;
|
||||
this.selSpecial.Value = LibW4M.Data.YesNo.No;
|
||||
//
|
||||
// selHelpPanelDisplay
|
||||
//
|
||||
|
@ -725,7 +749,7 @@
|
|||
this.crateTab.Location = new System.Drawing.Point(4, 24);
|
||||
this.crateTab.Name = "crateTab";
|
||||
this.crateTab.Padding = new System.Windows.Forms.Padding(3);
|
||||
this.crateTab.Size = new System.Drawing.Size(699, 387);
|
||||
this.crateTab.Size = new System.Drawing.Size(192, 72);
|
||||
this.crateTab.TabIndex = 2;
|
||||
this.crateTab.Text = "Crates";
|
||||
//
|
||||
|
@ -759,7 +783,7 @@
|
|||
this.tblCrate.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||
this.tblCrate.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||
this.tblCrate.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
|
||||
this.tblCrate.Size = new System.Drawing.Size(689, 188);
|
||||
this.tblCrate.Size = new System.Drawing.Size(165, 188);
|
||||
this.tblCrate.TabIndex = 1;
|
||||
//
|
||||
// selWeapCrateChance
|
||||
|
@ -767,7 +791,7 @@
|
|||
this.selWeapCrateChance.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.selWeapCrateChance.Location = new System.Drawing.Point(144, 36);
|
||||
this.selWeapCrateChance.Name = "selWeapCrateChance";
|
||||
this.selWeapCrateChance.Size = new System.Drawing.Size(540, 23);
|
||||
this.selWeapCrateChance.Size = new System.Drawing.Size(16, 23);
|
||||
this.selWeapCrateChance.TabIndex = 36;
|
||||
this.selWeapCrateChance.Text = "0";
|
||||
this.selWeapCrateChance.Value = 0;
|
||||
|
@ -788,7 +812,7 @@
|
|||
this.selHealthCrateAmount.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.selHealthCrateAmount.Location = new System.Drawing.Point(144, 160);
|
||||
this.selHealthCrateAmount.Name = "selHealthCrateAmount";
|
||||
this.selHealthCrateAmount.Size = new System.Drawing.Size(540, 23);
|
||||
this.selHealthCrateAmount.Size = new System.Drawing.Size(16, 23);
|
||||
this.selHealthCrateAmount.TabIndex = 34;
|
||||
this.selHealthCrateAmount.Text = "0";
|
||||
this.selHealthCrateAmount.Value = 0;
|
||||
|
@ -798,7 +822,7 @@
|
|||
this.selHealthCrateChance.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.selHealthCrateChance.Location = new System.Drawing.Point(144, 129);
|
||||
this.selHealthCrateChance.Name = "selHealthCrateChance";
|
||||
this.selHealthCrateChance.Size = new System.Drawing.Size(540, 23);
|
||||
this.selHealthCrateChance.Size = new System.Drawing.Size(16, 23);
|
||||
this.selHealthCrateChance.TabIndex = 32;
|
||||
this.selHealthCrateChance.Text = "0";
|
||||
this.selHealthCrateChance.Value = 0;
|
||||
|
@ -841,7 +865,7 @@
|
|||
this.selMysteryCrateChance.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.selMysteryCrateChance.Location = new System.Drawing.Point(144, 67);
|
||||
this.selMysteryCrateChance.Name = "selMysteryCrateChance";
|
||||
this.selMysteryCrateChance.Size = new System.Drawing.Size(540, 23);
|
||||
this.selMysteryCrateChance.Size = new System.Drawing.Size(16, 23);
|
||||
this.selMysteryCrateChance.TabIndex = 24;
|
||||
this.selMysteryCrateChance.Text = "0";
|
||||
this.selMysteryCrateChance.Value = 0;
|
||||
|
@ -873,7 +897,7 @@
|
|||
this.selCrateChance.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.selCrateChance.Location = new System.Drawing.Point(144, 5);
|
||||
this.selCrateChance.Name = "selCrateChance";
|
||||
this.selCrateChance.Size = new System.Drawing.Size(540, 23);
|
||||
this.selCrateChance.Size = new System.Drawing.Size(16, 23);
|
||||
this.selCrateChance.TabIndex = 22;
|
||||
this.selCrateChance.Text = "0";
|
||||
this.selCrateChance.Value = 0;
|
||||
|
@ -883,7 +907,7 @@
|
|||
this.selUtilityCrateChance.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
this.selUtilityCrateChance.Location = new System.Drawing.Point(144, 98);
|
||||
this.selUtilityCrateChance.Name = "selUtilityCrateChance";
|
||||
this.selUtilityCrateChance.Size = new System.Drawing.Size(540, 23);
|
||||
this.selUtilityCrateChance.Size = new System.Drawing.Size(16, 23);
|
||||
this.selUtilityCrateChance.TabIndex = 26;
|
||||
this.selUtilityCrateChance.Text = "0";
|
||||
this.selUtilityCrateChance.Value = 0;
|
||||
|
|
Loading…
Reference in New Issue