public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadByte(); if ( version == 0 ) { Timer.DelayCall( TimeSpan.Zero, delegate() { for ( int i = 0; i < Components.Count; ++i ) { AddonComponent ac = Components[i] as AddonComponent; if ( ac != null && ac.Hue == 2118 ) ac.Hue = 1161; } } ); } if ( version <= 1 ) { Timer.DelayCall( TimeSpan.Zero, delegate() { for ( int i = 0; i < Components.Count; ++i ) { AddonComponent ac = Components[i] as AddonComponent; if ( ac != null ) ac.Name = "jack-o-lantern"; } } ); } }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadByte(); if (this.ItemID == 4678 || this.ItemID == 4679) this.ItemID = 4656; else if (this.ItemID == 4712 || this.ItemID == 4713) this.ItemID = 4702; }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); this.m_Code = reader.ReadByte(); this.m_Controller = reader.ReadItem() as PrimevalLichPuzzle; // remove if no controller exists or is deleted if (null == this.m_Controller || this.m_Controller.Deleted) this.Delete(); }
public VirtueInfo(GenericReader reader) { int version = reader.ReadByte(); switch (version) { case 1: //Changed the values throughout the virtue system case 0: { int mask = reader.ReadByte(); if (mask != 0) { m_Values = new int[8]; for (int i = 0; i < 8; ++i) { if ((mask & (1 << i)) != 0) { m_Values[i] = reader.ReadInt(); } } } break; } } if (version == 0) { Compassion *= 200; Sacrifice *= 250; //Even though 40 (the max) only gives 10k, It's because it was formerly too easy //No direct conversion factor for Justice, this is just an approximation Justice *= 500; //All the other virtues haven't been defined at 'version 0' point in time in the scripts. } }
public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadByte(); switch ( version ) { case 0: { m_LabelNumber = reader.ReadEncodedInt(); break; } } }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); switch (version) { case 0: //_PoisonChancePenaltyPerFollower = reader.ReadDouble(); _ItemsBlockPlacement = (HousePlacementItemBlocking)reader.ReadByte(); _MobsBlockPlacement = reader.ReadBool(); _PetsBlockPlacement = reader.ReadBool(); _MinPlaceDelay = reader.ReadInt(); _MaxPlaceDelay = reader.ReadInt(); break; } m_Instance = this; }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); switch (version) { case 2: { m_EventType = (EventType)reader.ReadByte(); goto case 1; } case 1: { m_TargetLocation = reader.ReadPoint3D(); m_TargetMap = reader.ReadMap(); break; } } }
public FactionItem( GenericReader reader, Faction faction ) { int version = reader.ReadEncodedInt(); switch ( version ) { case 1: { m_OrigLootType = (LootType)reader.ReadByte(); m_OrigHue = reader.ReadInt(); goto case 0; } case 0: { m_Item = reader.ReadItem(); m_Expiration = reader.ReadDateTime(); break; } } m_Faction = faction; }
public static object Object(GenericReader reader) { if (reader == null) return null; byte type = reader.ReadByte(); switch ( type ) { case 0x0: return null; // invalid case 0x1: return reader.ReadInt(); case 0x2: return reader.ReadString(); case 0x3: return reader.ReadItem(); case 0x4: return reader.ReadMobile(); } return null; }
public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); m_CollectionTitles = new ArrayList(); switch ( version ) { case 56: { bool hasAnyBardMastery = reader.ReadBool(); if ( hasAnyBardMastery ) { m_BardMastery = BardMastery.GetFromId( reader.ReadEncodedInt() ); m_BardElementDamage = (ResistanceType) reader.ReadEncodedInt(); m_NextBardMasterySwitch = reader.ReadDateTime(); m_BardMasteryLearnedMask = reader.ReadEncodedInt(); } goto case 55; } case 55: { m_NextAnkhPendantUse = reader.ReadDateTime(); goto case 54; } case 54: { m_NextTenthAnniversarySculptureUse = reader.ReadDateTime(); goto case 53; } case 53: { m_LastForgedPardonUse = reader.ReadDateTime(); goto case 52; } case 52: { m_DoomCredits = reader.ReadInt(); m_TieredQuestInfo = new TieredQuestInfo( reader ); m_LoyaltyInfo = new LoyaltyInfo( reader ); m_FloorTrapsPlaced = reader.ReadInt(); m_NextPuzzleAttempt = reader.ReadDateTime(); m_NextDrinkExplodingTarPotion = reader.ReadDateTime(); m_NextLuckyCoinWish = reader.ReadDateTime(); m_NextSilverSaplingUse = reader.ReadDateTime(); m_SacredQuestNextChance = reader.ReadDateTime(); m_HumilityQuestStatus = (HumilityQuestStatus) reader.ReadInt(); m_HumilityQuestNextChance = reader.ReadDateTime(); m_NextGemOfSalvationUse = reader.ReadDateTime(); m_AnkhNextUse = reader.ReadDateTime(); m_Quests = QuestReader.Quests( reader, this ); m_Chains = QuestReader.Chains( reader ); m_TenthAnniversaryCredits = reader.ReadDouble(); m_KRStartingQuestStep = reader.ReadByte(); m_CurrentCollectionTitle = reader.ReadInt(); int titlecount = reader.ReadInt(); for ( int i = 0; i < titlecount; i++ ) { int title = reader.ReadInt(); m_CollectionTitles.Add( title ); } int recipeCount = reader.ReadInt(); if ( recipeCount > 0 ) { m_AcquiredRecipes = new Hashtable(); for ( int i = 0; i < recipeCount; i++ ) { int r = reader.ReadInt(); if ( reader.ReadBool() ) //Don't add in recipies which we haven't gotten or have been removed m_AcquiredRecipes.Add( r, true ); } } m_AutoStabledPets = reader.ReadMobileList(); ACState = (AdvancedCharacterState) reader.ReadInt(); Deaths = reader.ReadInt(); NextDrinkConflagrationPotion = reader.ReadTimeSpan(); NextDrinkMaskOfDeathPotion = reader.ReadTimeSpan(); NextDrinkConfusionPotion = reader.ReadTimeSpan(); m_GuildRank = reader.ReadInt(); m_LastLogin = reader.ReadDateTime(); m_ToTItemsTurnedIn = reader.ReadInt(); m_ToTTotalMonsterFame = reader.ReadDouble(); LastTierLoss = reader.ReadDeltaTime(); LastChampionTierLoss = reader.ReadDeltaTime(); LastSuperChampionTierLoss = reader.ReadDeltaTime(); int length_super = reader.ReadInt(); for ( int i = 0; i < length_super; i++ ) SuperChampionTiers[i] = reader.ReadInt(); int length = reader.ReadInt(); for ( int i = 0; i < length; i++ ) ChampionTiers[i] = reader.ReadDouble(); m_LastValorLoss = reader.ReadDeltaTime(); m_LastHonorLoss = reader.ReadDeltaTime(); m_SolenFriendship = (SolenFriendship) reader.ReadEncodedInt(); m_Quest = QuestSerializer.DeserializeQuest( reader ); if ( m_Quest != null ) m_Quest.From = this; int count = reader.ReadEncodedInt(); if ( count > 0 ) { m_DoneQuests = new List<QuestRestartInfo>(); for ( int i = 0; i < count; ++i ) { Type questType = QuestSerializer.ReadType( QuestSystem.QuestTypes, reader ); DateTime restartTime = reader.ReadDateTime(); m_DoneQuests.Add( new QuestRestartInfo( questType, restartTime ) ); } } m_Profession = reader.ReadEncodedInt(); m_LastCompassionLoss = reader.ReadDeltaTime(); m_CompassionGains = reader.ReadEncodedInt(); if ( m_CompassionGains > 0 ) m_NextCompassionDay = reader.ReadDeltaTime(); m_BOBFilter = new Engines.BulkOrders.BOBFilter( reader ); if ( reader.ReadBool() ) { m_HairModID = reader.ReadInt(); m_HairModHue = reader.ReadInt(); m_BeardModID = reader.ReadInt(); m_BeardModHue = reader.ReadInt(); // We cannot call SetHairMods( -1, -1 ) here because the items have not yet loaded Timer.DelayCall( TimeSpan.Zero, new TimerCallback( RevertHair ) ); } SavagePaintExpiration = reader.ReadTimeSpan(); if ( SavagePaintExpiration > TimeSpan.Zero ) { BodyMod = ( Female ? 184 : 183 ); HueMod = 0; } m_NpcGuild = (NpcGuild) reader.ReadInt(); m_NpcGuildJoinTime = reader.ReadDateTime(); m_NpcGuildGameTime = reader.ReadTimeSpan(); m_PermaFlags = reader.ReadMobileList(); NextTailorBulkOrder = reader.ReadTimeSpan(); NextSmithBulkOrder = reader.ReadTimeSpan(); m_LastJusticeLoss = reader.ReadDeltaTime(); m_JusticeProtectors = reader.ReadMobileList(); m_LastSacrificeGain = reader.ReadDeltaTime(); m_LastSacrificeLoss = reader.ReadDeltaTime(); m_AvailableResurrects = reader.ReadInt(); m_Flags = (PlayerFlag) reader.ReadInt(); m_LongTermElapse = reader.ReadTimeSpan(); m_ShortTermElapse = reader.ReadTimeSpan(); m_GameTime = reader.ReadTimeSpan(); break; } } #region ML Quest System if ( m_Quests == null ) m_Quests = new List<BaseQuest>(); if ( m_Chains == null ) m_Chains = new Dictionary<QuestChain, BaseChain>(); if ( m_DoneQuests == null ) m_DoneQuests = new List<QuestRestartInfo>(); #endregion if ( this != null && this.Region.IsPartOf( typeof( DoomLampRoom ) ) ) { Rectangle2D rect = new Rectangle2D( 342, 168, 16, 16 ); int x = Utility.Random( rect.X, rect.Width ); int y = Utility.Random( rect.Y, rect.Height ); if ( x >= 345 && x <= 352 && y >= 173 && y <= 179 ) { x = 353; y = 172; } this.MoveToWorld( new Point3D( x, y, -1 ), Map.Malas ); } // Professions weren't verified on 1.0 RC0 if ( !CharacterCreation.VerifyProfession( m_Profession ) ) m_Profession = 0; if ( m_PermaFlags == null ) m_PermaFlags = new ArrayList(); if ( m_JusticeProtectors == null ) m_JusticeProtectors = new ArrayList(); if ( m_BOBFilter == null ) m_BOBFilter = new Engines.BulkOrders.BOBFilter(); if ( m_LoyaltyInfo == null ) m_LoyaltyInfo = new LoyaltyInfo(); if ( m_TieredQuestInfo == null ) m_TieredQuestInfo = new TieredQuestInfo(); List<Mobile> list = this.Stabled; for ( int i = 0; i < list.Count; ++i ) { BaseCreature bc = list[i] as BaseCreature; if ( bc != null ) bc.IsStabled = true; } if ( Hidden ) // Hiding is the only buff where it has an effect that's serialized. this.AddBuff( new BuffInfo( BuffIcon.HidingAndOrStealth, 1075655 ) ); }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.GetVersion(); switch (version) { case 3: AllowNoOwner = reader.ReadBool(); goto case 2; case 2: case 1: Silent = reader.ReadBool(); goto case 0; case 0: { Usage = reader.ReadString(); Token = reader.ReadString(); AllowCombat = reader.ReadBool(); AllowDeadUser = reader.ReadBool(); Consumable = reader.ReadBool(); ClearHands = reader.ReadBool(); DismountUser = reader.ReadBool(); EffectID = reader.ReadInt(); EffectHue = reader.ReadInt(); EffectSpeed = reader.ReadInt(); if (version < 2) { EffectRender = (EffectRender)reader.ReadShort(); TargetFlags = (TargetFlags)reader.ReadByte(); } else { EffectRender = reader.ReadFlag <EffectRender>(); TargetFlags = reader.ReadFlag <TargetFlags>(); } ThrowSound = reader.ReadInt(); ImpactSound = reader.ReadInt(); ThrowRange = reader.ReadInt(); ThrowRecovery = reader.ReadTimeSpan(); ThrownLast = reader.ReadDateTime(); if (version < 2) { RequiredSkill = (SkillName)reader.ReadShort(); } else { RequiredSkill = reader.ReadFlag <SkillName>(); } RequiredSkillValue = reader.ReadDouble(); } break; } }
public SecureInfo(GenericReader reader) { this.m_Item = reader.ReadItem() as Container; this.m_Level = (SecureLevel)reader.ReadByte(); }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); switch (version) { case 2: { SaveFlag flags = (SaveFlag)reader.ReadByte(); if (GetSaveFlag(flags, SaveFlag.MaxItems)) { m_MaxItems = reader.ReadEncodedInt(); } else { m_MaxItems = -1; } if (GetSaveFlag(flags, SaveFlag.GumpID)) { m_GumpID = reader.ReadEncodedInt(); } else { m_GumpID = -1; } if (GetSaveFlag(flags, SaveFlag.DropSound)) { m_DropSound = reader.ReadEncodedInt(); } else { m_DropSound = -1; } break; } case 1: { m_MaxItems = reader.ReadInt(); goto case 0; } case 0: { if (version < 1) { m_MaxItems = m_GlobalMaxItems; } m_GumpID = reader.ReadInt(); m_DropSound = reader.ReadInt(); if (m_GumpID == DefaultGumpID) { m_GumpID = -1; } if (m_DropSound == DefaultDropSound) { m_DropSound = -1; } if (m_MaxItems == DefaultMaxItems) { m_MaxItems = -1; } //m_Bounds = new Rectangle2D( reader.ReadPoint2D(), reader.ReadPoint2D() ); reader.ReadPoint2D(); reader.ReadPoint2D(); break; } } }
public DaviesDeedEntry(GenericReader reader) { int version = reader.ReadByte(); m_type = reader.ReadInt(); m_Level = reader.ReadInt(); m_Decoder = reader.ReadMobile(); m_Map = reader.ReadMap(); m_Location2d = reader.ReadPoint2D(); m_Location3d = reader.ReadPoint3D(); m_Bounds = reader.ReadRect2D(); m_Mapnumber = reader.ReadString(); }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); switch (version) { case 1: _AnybodyAllowedInStronghold = reader.ReadBool(); goto case 0; case 0: //_PoisonChancePenaltyPerFollower = reader.ReadDouble(); _CriminalCanUseOthersGates = reader.ReadBool(); _SigilAnnounceStolen = (SigilStolenAnnouncing)reader.ReadByte(); _SigilCorruptionGrace = reader.ReadTimeSpan(); _SigilCorruptionPeriod = reader.ReadTimeSpan(); _SigilReturnPeriod = reader.ReadTimeSpan(); _SigilPurificationPeriod = reader.ReadTimeSpan(); break; } m_Instance = this; }
/// <summary> /// Loads an archived file's data. /// </summary> Task <byte[]> LoadFileDataAsync(FileMetadata file) { var fileSize = (int)file.Size; byte[] fileData; bool bsaCompressed; int newFileSize; lock (_r) { _r.Position = file.Offset; if (_hasNamePrefix) { var len = _r.ReadByte(); fileSize -= len + 1; _r.Position = file.Offset + 1 + len; } fileData = _r.ReadBytes(fileSize); bsaCompressed = file.SizeFlags > 0 && file.Compressed ^ _compressToggle; newFileSize = Version == SSE_BSAHEADER_VERSION && bsaCompressed?_r.ReadInt32() - 4 : fileSize; } // BSA if (bsaCompressed) { var newFileData = new byte[newFileSize]; if (Version != SSE_BSAHEADER_VERSION) { if (fileData.Length > 4) { using (var s = new MemoryStream(fileData, 4, fileSize - 4)) using (var gs = new InflaterInputStream(s)) gs.Read(newFileData, 0, newFileData.Length); } else { newFileData = fileData; } } else { using (var s = new MemoryStream(fileData)) using (var gs = new LzwInputStream(s)) gs.Read(newFileData, 0, newFileData.Length); } fileData = newFileData; } // General BA2 else if (file.PackedSize > 0 && file.Tex.Chunks == null) { var newFileData = new byte[file.UnpackedSize]; using (var s = new MemoryStream(fileData)) using (var gs = new InflaterInputStream(s)) gs.Read(newFileData, 0, newFileData.Length); fileData = newFileData; } // Fill DDS Header else if (file.Tex.Chunks != null) { // Fill DDS Header var ddsHeader = new DDSHeader { dwFlags = DDSFlags.HEADER_FLAGS_TEXTURE | DDSFlags.HEADER_FLAGS_LINEARSIZE | DDSFlags.HEADER_FLAGS_MIPMAP, dwHeight = file.Tex.Height, dwWidth = file.Tex.Width, dwMipMapCount = file.Tex.NumMips, dwCaps = DDSCaps.SURFACE_FLAGS_TEXTURE | DDSCaps.SURFACE_FLAGS_MIPMAP, dwCaps2 = file.Tex.Unk16 == 2049 ? DDSCaps2.CUBEMAP_ALLFACES : 0, }; var dx10Header = new DDSHeader_DXT10(); var dx10 = false; // map tex format switch (file.Tex.Format) { case DXGIFormat.BC1_UNORM: ddsHeader.ddspf.dwFlags = DDSPixelFormats.FourCC; ddsHeader.ddspf.dwFourCC = Encoding.ASCII.GetBytes("DXT1"); ddsHeader.dwPitchOrLinearSize = (uint)file.Tex.Width * file.Tex.Height / 2U; // 4bpp break; case DXGIFormat.BC2_UNORM: ddsHeader.ddspf.dwFlags = DDSPixelFormats.FourCC; ddsHeader.ddspf.dwFourCC = Encoding.ASCII.GetBytes("DXT3"); ddsHeader.dwPitchOrLinearSize = (uint)file.Tex.Width * file.Tex.Height; // 8bpp break; case DXGIFormat.BC3_UNORM: ddsHeader.ddspf.dwFlags = DDSPixelFormats.FourCC; ddsHeader.ddspf.dwFourCC = Encoding.ASCII.GetBytes("DXT5"); ddsHeader.dwPitchOrLinearSize = (uint)file.Tex.Width * file.Tex.Height; // 8bpp break; case DXGIFormat.BC5_UNORM: ddsHeader.ddspf.dwFlags = DDSPixelFormats.FourCC; ddsHeader.ddspf.dwFourCC = Encoding.ASCII.GetBytes("ATI2"); ddsHeader.dwPitchOrLinearSize = (uint)file.Tex.Width * file.Tex.Height; // 8bpp break; case DXGIFormat.BC7_UNORM: ddsHeader.ddspf.dwFlags = DDSPixelFormats.FourCC; ddsHeader.ddspf.dwFourCC = Encoding.ASCII.GetBytes("DX10"); ddsHeader.dwPitchOrLinearSize = (uint)file.Tex.Width * file.Tex.Height; // 8bpp dx10 = true; dx10Header.dxgiFormat = DXGIFormat.BC7_UNORM; break; case DXGIFormat.DXGI_FORMAT_B8G8R8A8_UNORM: ddsHeader.ddspf.dwFlags = DDSPixelFormats.RGB | DDSPixelFormats.AlphaPixels; ddsHeader.ddspf.dwRGBBitCount = 32; ddsHeader.ddspf.dwRBitMask = 0x00FF0000; ddsHeader.ddspf.dwGBitMask = 0x0000FF00; ddsHeader.ddspf.dwBBitMask = 0x000000FF; ddsHeader.ddspf.dwABitMask = 0xFF000000; ddsHeader.dwPitchOrLinearSize = (uint)file.Tex.Width * file.Tex.Height * 4; // 32bpp break; case DXGIFormat.DXGI_FORMAT_R8_UNORM: ddsHeader.ddspf.dwFlags = DDSPixelFormats.RGB; ddsHeader.ddspf.dwRGBBitCount = 8; ddsHeader.ddspf.dwRBitMask = 0xFF; ddsHeader.dwPitchOrLinearSize = (uint)file.Tex.Width * file.Tex.Height; // 8bpp break; default: throw new InvalidOperationException("DDS FAILED"); } if (dx10) { dx10Header.resourceDimension = DDSDimension.Texture2D; dx10Header.miscFlag = 0; dx10Header.arraySize = 1; dx10Header.miscFlags2 = 0; dx10Header.Write(null); //char dds2[sizeof(dx10Header)]; //memcpy(dds2, &dx10Header, sizeof(dx10Header)); //content.append(QByteArray::fromRawData(dds2, sizeof(dx10Header))); } } return(Task.FromResult(fileData)); }
private static bool ParseBlock(GenericReader gr, StringBuilder sb, StreamWriter swe, StreamWriter data) { ulong guid = 0; UpdateTypes updatetype = (UpdateTypes)gr.ReadByte(); sb.AppendLine("Updatetype: " + updatetype); // check if updatetype is valid if (updatetype < UpdateTypes.UPDATETYPE_VALUES || updatetype > UpdateTypes.UPDATETYPE_NEAR_OBJECTS) { long pos = gr.BaseStream.Position; swe.WriteLine("wrong updatetype at position {0}", pos.ToString("X16")); // we there only if we read packet wrong way swe.WriteLine("Updatetype {0} is not supported", updatetype); return(false); } switch (updatetype) { case UpdateTypes.UPDATETYPE_VALUES: guid = gr.ReadPackedGuid(); sb.AppendLine("Object guid: " + guid.ToString("X16")); if (guid == 0) { long pos = gr.BaseStream.Position; swe.WriteLine("wrong guid at position {0}", pos.ToString("X2")); // we there only if we read packet wrong way swe.WriteLine("Updatetype {0} can't be with NULL guid", updatetype); return(false); } ObjectTypes objecttype = ObjectTypes.TYPEID_OBJECT; // 0 if (Binparser.m_objects.ContainsKey(guid)) { objecttype = Binparser.m_objects[guid]; } else // try old method... { // object type auto detection: // F00C0000, F02B0000 - gameobjects // F00CXXXX, F02BXXXX - units (XXXX == 0000 for pets etc...) // F02B00000000XXXX - corpses // F02B00000000XXXX - dynamicobjects if (guid.ToString("X16").Substring(0, 8).Equals("40000000")) { objecttype = ObjectTypes.TYPEID_ITEM; } else if (guid.ToString("X16").Substring(0, 8).Equals("00000000")) { objecttype = ObjectTypes.TYPEID_PLAYER; } else { objecttype = ObjectTypes.TYPEID_UNIT; // also can be go, do, corpse } swe.WriteLine("problem with objecttypeid detection for UPDATETYPE_VALUES"); } sb.AppendLine("objectTypeId " + objecttype); if (!ParseValuesUpdateBlock(gr, sb, swe, data, objecttype, updatetype, null)) { return(false); } return(true); case UpdateTypes.UPDATETYPE_MOVEMENT: guid = gr.ReadPackedGuid(); sb.AppendLine("Object guid: " + guid.ToString("X16")); if (!ParseMovementUpdateBlock(gr, sb, swe, data, ObjectTypes.TYPEID_UNIT, null)) { return(false); } return(true); case UpdateTypes.UPDATETYPE_CREATE_OBJECT: case UpdateTypes.UPDATETYPE_CREATE_OBJECT2: guid = gr.ReadPackedGuid(); sb.AppendLine("Object guid: " + guid.ToString("X16")); ObjectTypes objectTypeId = (ObjectTypes)gr.ReadByte(); sb.AppendLine("objectTypeId " + objectTypeId); // check object existance and remove it if needed... //if (Binparser.m_objects.ContainsKey(guid)) // Binparser.m_objects.Remove(guid); // now we can add this object to Dictionary to get correct object type later... //Binparser.m_objects.Add(guid, objectTypeId); WoWObject obj = new WoWObject(0, objectTypeId); // add new object only if we not have it already if (!Binparser.m_objects.ContainsKey(guid)) { obj.IsNew = true; Binparser.m_objects.Add(guid, objectTypeId); } switch (objectTypeId) { case ObjectTypes.TYPEID_OBJECT: case ObjectTypes.TYPEID_AIGROUP: case ObjectTypes.TYPEID_AREATRIGGER: swe.WriteLine("Unhandled object type {0}", objectTypeId); return(false); case ObjectTypes.TYPEID_ITEM: case ObjectTypes.TYPEID_CONTAINER: case ObjectTypes.TYPEID_UNIT: case ObjectTypes.TYPEID_PLAYER: case ObjectTypes.TYPEID_GAMEOBJECT: case ObjectTypes.TYPEID_DYNAMICOBJECT: case ObjectTypes.TYPEID_CORPSE: if (!ParseMovementUpdateBlock(gr, sb, swe, data, objectTypeId, obj)) { return(false); } if (!ParseValuesUpdateBlock(gr, sb, swe, data, objectTypeId, updatetype, obj)) { return(false); } return(true); default: swe.WriteLine("Unknown object type {0}", objectTypeId); return(false); } case UpdateTypes.UPDATETYPE_OUT_OF_RANGE_OBJECTS: case UpdateTypes.UPDATETYPE_NEAR_OBJECTS: uint objects_count = gr.ReadUInt32(); if (objects_count > 1000) // we read packet wrong way { long pos = gr.BaseStream.Position; swe.WriteLine("error position {0}", pos.ToString("X2")); swe.WriteLine("Too many {0} objects", updatetype); return(false); } sb.AppendLine("guids_count " + objects_count); for (uint i = 0; i < objects_count; i++) { sb.AppendLine("Guid" + i + ": " + gr.ReadPackedGuid().ToString("X16")); } return(true); default: swe.WriteLine("Unknown updatetype {0}", updatetype); return(false); } }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadByte(); }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); switch (version) { case 6: { m_NegativeAttributes = new NegativeAttributes(this, reader); m_MaxHitPoints = reader.ReadInt(); m_HitPoints = reader.ReadInt(); _VvVItem = reader.ReadBool(); _Owner = reader.ReadMobile(); _OwnerName = reader.ReadString(); goto case 5; } case 5: { m_Quality = (BookQuality)reader.ReadByte(); goto case 4; } case 4: { m_EngravedText = reader.ReadString(); goto case 3; } case 3: { m_Crafter = reader.ReadMobile(); goto case 2; } case 2: { m_Slayer = (SlayerName)reader.ReadInt(); m_Slayer2 = (SlayerName)reader.ReadInt(); goto case 1; } case 1: { m_AosAttributes = new AosAttributes(this, reader); m_AosSkillBonuses = new AosSkillBonuses(this, reader); goto case 0; } case 0: { m_Content = reader.ReadULong(); m_Count = reader.ReadInt(); break; } } if (m_AosAttributes == null) { m_AosAttributes = new AosAttributes(this); } if (m_AosSkillBonuses == null) { m_AosSkillBonuses = new AosSkillBonuses(this); } if (m_NegativeAttributes == null) { m_NegativeAttributes = new NegativeAttributes(this); } if (Core.AOS && Parent is Mobile) { m_AosSkillBonuses.AddTo((Mobile)Parent); } int strBonus = m_AosAttributes.BonusStr; int dexBonus = m_AosAttributes.BonusDex; int intBonus = m_AosAttributes.BonusInt; if (Parent is Mobile && (strBonus != 0 || dexBonus != 0 || intBonus != 0)) { Mobile m = (Mobile)Parent; string modName = Serial.ToString(); if (strBonus != 0) { m.AddStatMod(new StatMod(StatType.Str, modName + "Str", strBonus, TimeSpan.Zero)); } if (dexBonus != 0) { m.AddStatMod(new StatMod(StatType.Dex, modName + "Dex", dexBonus, TimeSpan.Zero)); } if (intBonus != 0) { m.AddStatMod(new StatMod(StatType.Int, modName + "Int", intBonus, TimeSpan.Zero)); } } if (Parent is Mobile) { ((Mobile)Parent).CheckStatTimers(); } }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); switch (version) { case 4: { m_SecureLevel = (SecureLevel)reader.ReadInt(); goto case 3; } case 3: case 2: { BookContent content = DefaultContent; SaveFlags flags = (SaveFlags)reader.ReadByte(); if ((flags & SaveFlags.Title) != 0) { m_Title = Utility.Intern(reader.ReadString()); } else if (content != null) { m_Title = content.Title; } if ((flags & SaveFlags.Author) != 0) { m_Author = reader.ReadString(); } else if (content != null) { m_Author = content.Author; } m_Writable = (flags & SaveFlags.Writable) != 0; if ((flags & SaveFlags.Content) != 0) { m_Pages = new BookPageInfo[reader.ReadEncodedInt()]; for (int i = 0; i < m_Pages.Length; ++i) { m_Pages[i] = new BookPageInfo(reader); } } else { if (content != null) { m_Pages = content.Copy(); } else { m_Pages = new BookPageInfo[0]; } } break; } case 1: case 0: { m_Title = reader.ReadString(); m_Author = reader.ReadString(); m_Writable = reader.ReadBool(); if (version == 0 || reader.ReadBool()) { m_Pages = new BookPageInfo[reader.ReadInt()]; for (int i = 0; i < m_Pages.Length; ++i) { m_Pages[i] = new BookPageInfo(reader); } } else { BookContent content = DefaultContent; if (content != null) { m_Pages = content.Copy(); } else { m_Pages = new BookPageInfo[0]; } } break; } } if (version < 3 && (Weight == 1 || Weight == 2)) { Weight = -1; } }
private static bool ParseValuesUpdateBlock(GenericReader gr, StringBuilder sb, StreamWriter swe, StreamWriter data, ObjectTypes objectTypeId, UpdateTypes updatetype, WoWObject obj) { sb.AppendLine("=== values_update_block_start ==="); byte blocks_count = gr.ReadByte(); // count of update blocks (4 bytes for each update block) sb.AppendLine("Bit mask blocks count: " + blocks_count); int[] updatemask = new int[blocks_count]; // create array of update blocks for (int j = 0; j < blocks_count; j++) { updatemask[j] = gr.ReadInt32(); // populate array of update blocks with data } Mask = new BitArray(updatemask); int reallength = Mask.Count; // bitmask size (bits) int bitmask_max_size = 0; uint values_end = 0; switch (objectTypeId) { case ObjectTypes.TYPEID_ITEM: bitmask_max_size = 64; values_end = UpdateFieldsLoader.ITEM_END; break; case ObjectTypes.TYPEID_CONTAINER: bitmask_max_size = 160; values_end = UpdateFieldsLoader.CONTAINER_END; break; case ObjectTypes.TYPEID_UNIT: bitmask_max_size = 256; values_end = UpdateFieldsLoader.UNIT_END; break; case ObjectTypes.TYPEID_PLAYER: bitmask_max_size = 1536; // 2.3.2 - 1472 values_end = UpdateFieldsLoader.PLAYER_END; break; case ObjectTypes.TYPEID_GAMEOBJECT: bitmask_max_size = 32; values_end = UpdateFieldsLoader.GO_END; break; case ObjectTypes.TYPEID_DYNAMICOBJECT: bitmask_max_size = 32; values_end = UpdateFieldsLoader.DO_END; break; case ObjectTypes.TYPEID_CORPSE: bitmask_max_size = 64; values_end = UpdateFieldsLoader.CORPSE_END; break; } if (reallength > bitmask_max_size) { long pos = gr.BaseStream.Position; swe.WriteLine("error position {0}", pos.ToString("X2")); swe.WriteLine("error while parsing {0} values update block, count {1}", objectTypeId, reallength); return(false); } for (int index = 0; index < reallength; index++) { if (index > values_end) { break; } if (Mask[index]) { UpdateField uf = new UpdateField(); switch (objectTypeId) { case ObjectTypes.TYPEID_ITEM: case ObjectTypes.TYPEID_CONTAINER: uf = UpdateFieldsLoader.item_uf[index]; break; case ObjectTypes.TYPEID_UNIT: case ObjectTypes.TYPEID_PLAYER: uf = UpdateFieldsLoader.unit_uf[index]; break; case ObjectTypes.TYPEID_GAMEOBJECT: uf = UpdateFieldsLoader.go_uf[index]; break; case ObjectTypes.TYPEID_DYNAMICOBJECT: uf = UpdateFieldsLoader.do_uf[index]; break; case ObjectTypes.TYPEID_CORPSE: uf = UpdateFieldsLoader.corpse_uf[index]; break; } ReadAndDumpField(uf, sb, gr, updatetype, data, obj); } } if ((objectTypeId == ObjectTypes.TYPEID_GAMEOBJECT || objectTypeId == ObjectTypes.TYPEID_UNIT) && (updatetype == UpdateTypes.UPDATETYPE_CREATE_OBJECT || updatetype == UpdateTypes.UPDATETYPE_CREATE_OBJECT2) && obj.IsNew) { obj.Save(); } sb.AppendLine("=== values_update_block_end ==="); return(true); }
public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); switch ( version ) { case 1: { m_VilleRace = (VilleRaciale)reader.ReadByte(); goto case 0; } case 0: { m_Citoyens = reader.ReadMobileList(); m_Candidats = reader.ReadMobileList(); m_HLL = reader.ReadMobileList(); m_Gardes = reader.ReadMobileList(); m_gardes_pnj = reader.ReadItemList(); m_Maire = (PlayerMobile)reader.ReadMobile(); m_Conseiller = (PlayerMobile)reader.ReadMobile(); m_Ambassadeur = (PlayerMobile)reader.ReadMobile(); m_Capitaine = (PlayerMobile)reader.ReadMobile(); m_Pomi = (POMI)reader.ReadItem(); m_MaireCloak = (PomiCloak)reader.ReadItem(); m_ConseillerCloak = (PomiCloak)reader.ReadItem(); m_AmbassadeurCloak = (PomiCloak)reader.ReadItem(); m_CapitaineCloak = (PomiCloak)reader.ReadItem(); m_CapitaineBook = (CapitaineBook)reader.ReadItem(); m_GardeCloak = reader.ReadItemList(); m_Nom = reader.ReadString(); m_Charte0 = reader.ReadString(); m_Charte1 = reader.ReadString(); m_Charte2 = reader.ReadString(); m_Charte3 = reader.ReadString(); m_Charte4 = reader.ReadString(); m_Charte5 = reader.ReadString(); m_Charte6 = reader.ReadString(); m_Charte7 = reader.ReadString(); m_Votants = reader.ReadMobileList(); m_Elections = reader.ReadMobileList(); m_Resultats = reader.ReadMobileList(); m_EndDate = reader.ReadDateTime(); m_ElecTimer = new ElectionTimer(this, m_EndDate - DateTime.Now); m_ElecTimer.Start(); m_ElecDelay = reader.ReadTimeSpan(); m_MaxDistance = reader.ReadInt(); m_Allies = reader.ReadItemList(); m_Paix = reader.ReadItemList(); m_Guerre = reader.ReadItemList(); m_Neutre = reader.ReadItemList(); m_Box = (TownBox)reader.ReadItem(); break; } } }
public override void Deserialize( GenericReader gr ) { int version = gr.ReadInt(); // id = gr.ReadInt(); UInt64 g = gr.ReadInt64(); SpawnerLink = null;//(BaseSpawner)MobileList.TempSpawner[ g ]; int esu = 0; int ech = 0; esu = gr.ReadInt(); ech = gr.ReadInt(); name = gr.ReadString(); if ( version > 0 ) classe = (Classes)gr.ReadInt(); talent = gr.ReadInt(); Level = gr.ReadInt(); model = gr.ReadInt(); exp = (uint)gr.ReadInt(); guildId = (uint)gr.ReadInt(); petLevel = (uint)gr.ReadInt(); petCreatureFamily = (uint)gr.ReadInt(); petDisplayId = (uint)gr.ReadInt(); speed = gr.ReadFloat(); size = gr.ReadFloat(); faction = (Factions)gr.ReadInt(); str = gr.ReadInt(); agility = gr.ReadInt(); stamina = gr.ReadInt(); iq = gr.ReadInt(); spirit = gr.ReadInt(); baseStr = gr.ReadFloat(); baseAgility = gr.ReadFloat(); baseStamina = gr.ReadFloat(); baseIq = gr.ReadFloat(); baseSpirit = gr.ReadFloat(); walkSpeed = gr.ReadFloat(); if ( walkSpeed == 0 ) walkSpeed = 4.7777f; runSpeed = gr.ReadFloat(); if ( runSpeed == 0 ) runSpeed = 7f; swimSpeed = gr.ReadFloat(); if ( swimSpeed == 0 ) swimSpeed = 4.72f; swimBackSpeed = gr.ReadFloat(); if ( swimBackSpeed == 0 ) swimBackSpeed = 2.5f; hitPoints = gr.ReadInt(); mana = gr.ReadInt(); energy = gr.ReadInt(); rage = gr.ReadInt(); focus = gr.ReadInt(); baseHitPoints = gr.ReadInt(); baseMana = gr.ReadInt(); baseEnergy = gr.ReadInt(); baseRage = gr.ReadInt(); baseFocus = gr.ReadInt(); block = gr.ReadInt(); armor = gr.ReadInt(); resistHoly = gr.ReadInt(); resistFire = gr.ReadInt(); resistNature = gr.ReadInt(); resistFrost = gr.ReadInt(); resistShadow = gr.ReadInt(); resistArcane = gr.ReadInt(); int nSkills = gr.ReadInt(); for(int t = 0;t < nSkills;t++ ) { ushort skill = (ushort)gr.ReadShort(); allSkills[ skill ] = Skill.Deserialize( gr, t ); } int nSpells = gr.ReadInt(); for(int t = 0;t < nSpells;t++ ) { ushort spell = (ushort)gr.ReadShort(); byte place = gr.ReadByte(); knownAbilities[ (int)spell ] = (int)place; /* if ( TalentDescription.IsTalent( (int)spell ) ) { if ( onInitialiseTalent[ (int)spell ] != null ) { ( onInitialiseTalent[ (int)spell ] as TalentHandlers.TalentHandler )( Abilities.abilities[ (int)spell ], this ); } // this.AddPermanentAura( Abilities.abilities[ (int)spell ], new Aura() ); // permanentAura.Add( spell ); }*/ } int nTalentList = gr.ReadInt(); for(int t = 0;t < nTalentList;t++ ) { int spell = gr.ReadInt(); int lev = gr.ReadInt(); talentList[ spell ] = (int)lev; } if ( gr.ReadInt() != 0 ) freeze = true; int nit = gr.ReadInt(); for(int t = 0;t < nit;t++ ) { int n = gr.ReadInt(); if ( n == 1 ) items[ t ] = Item.Load( gr ); else items[ t ] = null; } if ( gr.ReadInt() != 0 ) movementChange = true; manaType = gr.ReadInt(); professions = gr.ReadByte(); standState = (StandStates)gr.ReadInt(); base.Deserialize( gr ); moveVector = new MoveVector( this, X, Y, Z ); // if ( this is BaseSpawner ) // MobileList.TempSpawner[ Guid ] = this; if ( esu != 0 ) MobileList.TempSummon[ Guid ] = this; if ( ech != 0 ) MobileList.TempSummon[ Guid ] = this; //movementTimer = new MovementTimer( this ); }
public void Deserialize(GenericReader reader) { Flag = reader.ReadFlag <DataType>(); Type = Flag.ToType(); switch (Flag) { case DataType.Null: Value = null; break; case DataType.Bool: Value = reader.ReadBool(); break; case DataType.Char: Value = reader.ReadChar(); break; case DataType.Byte: Value = reader.ReadByte(); break; case DataType.SByte: Value = reader.ReadSByte(); break; case DataType.Short: Value = reader.ReadShort(); break; case DataType.UShort: Value = reader.ReadUShort(); break; case DataType.Int: Value = reader.ReadInt(); break; case DataType.UInt: Value = reader.ReadUInt(); break; case DataType.Long: Value = reader.ReadLong(); break; case DataType.ULong: Value = reader.ReadULong(); break; case DataType.Float: Value = reader.ReadFloat(); break; case DataType.Decimal: Value = reader.ReadDecimal(); break; case DataType.Double: Value = reader.ReadDouble(); break; case DataType.String: Value = reader.ReadString() ?? String.Empty; break; case DataType.DateTime: Value = reader.ReadDateTime(); break; case DataType.TimeSpan: Value = reader.ReadTimeSpan(); break; } }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); switch (version) { case 5: { m_Quality = (BookQuality)reader.ReadByte(); goto case 4; } case 4: { m_EngravedText = reader.ReadString(); goto case 3; } case 3: { m_Crafter = reader.ReadMobile(); goto case 2; } case 2: { m_Slayer = (SlayerName)reader.ReadInt(); m_Slayer2 = (SlayerName)reader.ReadInt(); goto case 1; } case 1: { m_AosAttributes = new AosAttributes(this, reader); m_AosSkillBonuses = new AosSkillBonuses(this, reader); goto case 0; } case 0: { m_Content = reader.ReadULong(); m_Count = reader.ReadInt(); break; } } if (m_AosAttributes == null) { m_AosAttributes = new AosAttributes(this); } if (m_AosSkillBonuses == null) { m_AosSkillBonuses = new AosSkillBonuses(this); } if (Core.AOS && Parent is Mobile) { m_AosSkillBonuses.AddTo((Mobile)Parent); } int strBonus = m_AosAttributes.BonusStr; int dexBonus = m_AosAttributes.BonusDex; int intBonus = m_AosAttributes.BonusInt; if (Parent is Mobile && (strBonus != 0 || dexBonus != 0 || intBonus != 0)) { Mobile m = (Mobile)Parent; string modName = Serial.ToString(); if (strBonus != 0) { m.AddStatMod(new StatMod(StatType.Str, modName + "Str", strBonus, TimeSpan.Zero)); } if (dexBonus != 0) { m.AddStatMod(new StatMod(StatType.Dex, modName + "Dex", dexBonus, TimeSpan.Zero)); } if (intBonus != 0) { m.AddStatMod(new StatMod(StatType.Int, modName + "Int", intBonus, TimeSpan.Zero)); } } if (Parent is Mobile) { ((Mobile)Parent).CheckStatTimers(); } }
public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); switch ( version ) { case 2: { SaveFlag flags = (SaveFlag)reader.ReadByte(); if ( GetSaveFlag( flags, SaveFlag.MaxItems ) ) m_MaxItems = reader.ReadEncodedInt(); else m_MaxItems = -1; if ( GetSaveFlag( flags, SaveFlag.GumpID ) ) m_GumpID = reader.ReadEncodedInt(); else m_GumpID = -1; if ( GetSaveFlag( flags, SaveFlag.DropSound ) ) m_DropSound = reader.ReadEncodedInt(); else m_DropSound = -1; break; } case 1: { m_MaxItems = reader.ReadInt(); goto case 0; } case 0: { if ( version < 1 ) m_MaxItems = m_GlobalMaxItems; m_GumpID = reader.ReadInt(); m_DropSound = reader.ReadInt(); if ( m_GumpID == DefaultGumpID ) m_GumpID = -1; if ( m_DropSound == DefaultDropSound ) m_DropSound = -1; if ( m_MaxItems == DefaultMaxItems ) m_MaxItems = -1; //m_Bounds = new Rectangle2D( reader.ReadPoint2D(), reader.ReadPoint2D() ); reader.ReadPoint2D(); reader.ReadPoint2D(); break; } } }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); switch ( version ) { case 4: { this.m_SecureLevel = (SecureLevel)reader.ReadInt(); goto case 3; } case 3: case 2: { BookContent content = this.DefaultContent; SaveFlags flags = (SaveFlags)reader.ReadByte(); if ((flags & SaveFlags.Title) != 0) this.m_Title = Utility.Intern(reader.ReadString()); else if (content != null) this.m_Title = content.Title; if ((flags & SaveFlags.Author) != 0) this.m_Author = reader.ReadString(); else if (content != null) this.m_Author = content.Author; this.m_Writable = (flags & SaveFlags.Writable) != 0; if ((flags & SaveFlags.Content) != 0) { this.m_Pages = new BookPageInfo[reader.ReadEncodedInt()]; for (int i = 0; i < this.m_Pages.Length; ++i) this.m_Pages[i] = new BookPageInfo(reader); } else { if (content != null) this.m_Pages = content.Copy(); else this.m_Pages = new BookPageInfo[0]; } break; } case 1: case 0: { this.m_Title = reader.ReadString(); this.m_Author = reader.ReadString(); this.m_Writable = reader.ReadBool(); if (version == 0 || reader.ReadBool()) { this.m_Pages = new BookPageInfo[reader.ReadInt()]; for (int i = 0; i < this.m_Pages.Length; ++i) this.m_Pages[i] = new BookPageInfo(reader); } else { BookContent content = this.DefaultContent; if (content != null) this.m_Pages = content.Copy(); else this.m_Pages = new BookPageInfo[0]; } break; } } if (version < 3 && (this.Weight == 1 || this.Weight == 2)) this.Weight = -1; }
public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); switch ( version ) { case 44: { AntiMacroGump = reader.ReadBool(); goto case 43; } case 43: { ShowTipsOnLogin = reader.ReadBool(); goto case 42; } case 42: { AllowMulti = reader.ReadBool(); goto case 41; } case 41: { GameInfoGumpType = (GameInfoGumpType)reader.ReadInt(); goto case 40; } case 40: { m_EventType = (EventType)reader.ReadByte(); m_CurrentEvent = reader.ReadItem() as BaseGame; goto case 39; } case 39: { TempCheck = reader.ReadBool(); goto case 38; } case 38: { m_AutoStabled = reader.ReadStrongMobileList(); m_AnkhNextUse = reader.ReadDateTime(); m_PeacedUntil = reader.ReadDateTime(); goto case 37; } case 37: { ShowArriveMsg = reader.ReadBool(); goto case 36; } case 36: { m_Rating = reader.ReadInt(); m_TournamentRating = reader.ReadInt(); m_CurrentEvent = null; goto case 35; } case 35: { m_Snoopers = reader.ReadStrongMobileList(); goto case 34; } case 34: m_HasStartingSkillBoost = reader.ReadBool(); goto case 33; case 33: { m_OriginalHairHue = reader.ReadInt(); m_OriginalHairItemID = reader.ReadInt(); m_OriginalHue = reader.ReadInt(); m_HasCustomRace = reader.ReadBool(); goto case 32; } case 32: VirtualArmor = reader.ReadInt(); goto case 31; case 31: m_PlayerGuildGameTime = reader.ReadTimeSpan(); goto case 30; case 30: m_AlwaysMurderer = reader.ReadBool(); goto case 29; case 29: m_Imported = reader.ReadBool(); goto case 28; case 28: /*Item nullItem = reader.ReadItem(); goto case 27;*/ case 27: m_Stoned = reader.ReadBool(); goto case 26; case 26: UseUnicodeSpeech = reader.ReadBool(); goto case 25; case 25: { int recipeCount = reader.ReadInt(); if( recipeCount > 0 ) { m_AcquiredRecipes = new Dictionary<int, bool>(); for( int i = 0; i < recipeCount; i++ ) { int r = reader.ReadInt(); if( reader.ReadBool() ) //Don't add in recipies which we haven't gotten or have been removed m_AcquiredRecipes.Add( r, true ); } } goto case 24; } case 24: { m_LastHonorLoss = reader.ReadDeltaTime(); goto case 23; } case 23: { m_ChampionTitles = new ChampionTitleInfo( reader ); goto case 22; } case 22: { m_LastValorLoss = reader.ReadDateTime(); goto case 21; } case 21: { m_ToTItemsTurnedIn = reader.ReadEncodedInt(); m_ToTTotalMonsterFame = reader.ReadInt(); goto case 20; } case 20: { AllianceMessageHue = reader.ReadEncodedInt(); GuildMessageHue = reader.ReadEncodedInt(); goto case 19; } case 19: { int rank = reader.ReadEncodedInt(); int maxRank = RankDefinition.Ranks.Length -1; if( rank > maxRank ) rank = maxRank; m_GuildRank = RankDefinition.Ranks[rank]; LastOnline = reader.ReadDateTime(); goto case 18; } case 18: { m_SolenFriendship = (SolenFriendship) reader.ReadEncodedInt(); goto case 17; } case 17: // changed how DoneQuests is serialized case 16: { m_Quest = QuestSerializer.DeserializeQuest( reader ); if ( m_Quest != null ) m_Quest.From = this; int count = reader.ReadEncodedInt(); if ( count > 0 ) { m_DoneQuests = new List<QuestRestartInfo>(); for ( int i = 0; i < count; ++i ) { Type questType = QuestSerializer.ReadType( QuestSystem.QuestTypes, reader ); DateTime restartTime; if ( version < 17 ) restartTime = DateTime.MaxValue; else restartTime = reader.ReadDateTime(); m_DoneQuests.Add( new QuestRestartInfo( questType, restartTime ) ); } } Profession = reader.ReadEncodedInt(); goto case 15; } case 15: { m_LastCompassionLoss = reader.ReadDeltaTime(); goto case 14; } case 14: { m_CompassionGains = reader.ReadEncodedInt(); if ( m_CompassionGains > 0 ) m_NextCompassionDay = reader.ReadDeltaTime(); goto case 13; } case 13: // just removed m_PayedInsurance list case 12: { m_BOBFilter = new BOBFilter( reader ); goto case 11; } case 11: { if ( version < 13 ) { List<Item> payed = reader.ReadStrongItemList(); for ( int i = 0; i < payed.Count; ++i ) payed[i].PayedInsurance = true; } goto case 10; } case 10: { if ( reader.ReadBool() ) { m_HairModID = reader.ReadInt(); m_HairModHue = reader.ReadInt(); m_BeardModID = reader.ReadInt(); m_BeardModHue = reader.ReadInt(); } goto case 9; } case 9: { SavagePaintExpiration = reader.ReadTimeSpan(); if ( SavagePaintExpiration > TimeSpan.Zero ) { BodyMod = ( Female ? 184 : 183 ); HueMod = 0; } goto case 8; } case 8: { NpcGuild = (NpcGuild)reader.ReadInt(); NpcGuildJoinTime = reader.ReadDateTime(); NpcGuildGameTime = reader.ReadTimeSpan(); goto case 7; } case 7: { m_PermaFlags = reader.ReadStrongMobileList(); goto case 6; } case 6: { NextTailorBulkOrder = reader.ReadTimeSpan(); goto case 5; } case 5: { NextSmithBulkOrder = reader.ReadTimeSpan(); goto case 4; } case 4: { m_LastJusticeLoss = reader.ReadDeltaTime(); m_JusticeProtectors = reader.ReadStrongMobileList(); goto case 3; } case 3: { m_LastSacrificeGain = reader.ReadDeltaTime(); m_LastSacrificeLoss = reader.ReadDeltaTime(); m_AvailableResurrects = reader.ReadInt(); goto case 2; } case 2: { m_Flags = (PlayerFlag)reader.ReadInt(); goto case 1; } case 1: { m_LongTermElapse = reader.ReadTimeSpan(); m_ShortTermElapse = reader.ReadTimeSpan(); m_GameTime = reader.ReadTimeSpan(); goto case 0; } case 0: { if (version < 43) ShowTipsOnLogin = true; if (version < 38) m_AutoStabled = new List<Mobile>(); break; } } // Professions weren't verified on 1.0 RC0 if ( !CharacterCreation.VerifyProfession( Profession ) ) Profession = 0; if ( m_PermaFlags == null ) m_PermaFlags = new List<Mobile>(); if ( m_Snoopers == null) m_Snoopers = new List<Mobile>(); if ( m_JusticeProtectors == null ) m_JusticeProtectors = new List<Mobile>(); if ( m_BOBFilter == null ) m_BOBFilter = new BOBFilter(); if( m_GuildRank == null ) m_GuildRank = RankDefinition.Member; //Default to member if going from older verstion to new version (only time it should be null) if( LastOnline == DateTime.MinValue && Account != null ) LastOnline = ((Account)Account).LastLogin; if( m_ChampionTitles == null ) m_ChampionTitles = new ChampionTitleInfo(); if (AccessLevel > AccessLevel.Player) m_IgnoreMobiles = true; List<Mobile> list = Stabled; for ( int i = 0; i < list.Count; ++i ) { BaseCreature bc = list[i] as BaseCreature; if ( bc != null ) bc.IsStabled = true; } CheckAtrophies( this ); if( Hidden ) //Hiding is the only buff where it has an effect that's serialized. AddBuff( new BuffInfo( BuffIcon.HidingAndOrStealth, 1075655 ) ); }
public override void Deserialize( GenericReader gr ) { base.Deserialize( gr ); int version = gr.ReadInt(); if ( version > 6 ) { int nreput = gr.ReadInt(); for(int t = 0;t < nreput;t++ ) { int krep = gr.ReadInt(); int vrep = gr.ReadInt(); reputationAdjustments[ krep ] = vrep; } } if ( version > 5 ) { int nact = gr.ReadInt(); for(int t = 0;t < nact;t++ ) actionBar.Add( new Action( gr ) ); } if ( version > 4 ) { int nf = gr.ReadInt(); for(int t = 0;t < nf;t++ ) { UInt64 gu = (UInt64)gr.ReadInt64(); friends.Add( gu ); string user = gr.ReadString(); friends.Add( user ); } } if ( version > 2 ) { BindingPointX = gr.ReadFloat(); BindingPointY = gr.ReadFloat(); BindingPointZ = gr.ReadFloat(); BindingPointMapId = (UInt16)gr.ReadInt(); } if ( version > 1 ) { bool pa = gr.ReadBool(); if ( pa ) { petActions = new int[ 11 ]; for(int t = 0;t < 11;t++ ) petActions[ t ] = gr.ReadInt(); } } int sum = gr.ReadInt(); if ( sum != 0 ) { UInt64 g = gr.ReadInt64(); if ( version > 7 ) { int sid = gr.ReadInt(); Summon = new BaseCreature( gr ); Summon.Id = sid; } // Summon = (Mobile)MobileList.TempSummon[ g ]; Summon.SummonedBy = this; ( Summon as BaseCreature ).AIEngine = new SummonedAI( this, Summon as BaseCreature ); } sum = gr.ReadInt(); if ( sum != 0 ) { Charm = (Mobile)MobileList.TempSummon[ gr.ReadInt64() ]; Charm.CharmedBy = this; ( Charm as BaseCreature ).AIEngine = new SummonedAI( this, Charm as BaseCreature ); } CorpseLocationX = gr.ReadFloat(); CorpseLocationY = gr.ReadFloat(); CorpseLocationZ = gr.ReadFloat(); if ( version > 3 ) CorpseMapId = (ushort)gr.ReadShort(); corpsGuid = gr.ReadInt64(); zones = new uint[ 32 ]; for(int t = 0;t < 32;t++ ) zones[ t ] = (uint)gr.ReadInt(); int exi = gr.ReadInt(); if ( exi == 1 ) { mark = new Position( gr.ReadFloat(), gr.ReadFloat(), gr.ReadFloat(), gr.ReadInt() ); } ammoType = gr.ReadInt(); race = (Races)gr.ReadByte(); if ( version == 0 ) Classe = (Classes)gr.ReadByte(); gender = gr.ReadByte(); skin = gr.ReadByte(); face = gr.ReadByte(); hairStyle = gr.ReadByte(); hairColour = gr.ReadByte(); facialHair = gr.ReadByte(); copper = (uint)gr.ReadInt(); int nactq = 20; for(int t = 0;t < nactq;t++ ) { int vv = gr.ReadInt(); if ( vv == 1 ) { ActiveQuest aq = new ActiveQuest( gr ); if ( aq.Id > 0 ) AddQuest( aq ); } } int nq = gr.ReadInt(); for(int t = 0;t < nq;t++ ) { int id = gr.ReadInt(); questsDone[ id ] = true; } for(int g = 0;g < 8;g++ ) { int field = gr.ReadInt(); TaxiField[ g ] = (uint)field; } // RunSpeed = 11f; }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); switch (version) { case 21: _FastWalkPrevention = reader.ReadBool(); goto case 20; case 20: { OnPlayerDeathUberScript = reader.ReadString(); CreaturesStealthLikePlayers = reader.ReadBool(); } goto case 19; case 19: TreasureMapMobSpawnChance = reader.ReadDouble(); goto case 18; case 18: OnLoginUberScript = reader.ReadString(); goto case 17; case 17: AllowThirdDawnClient = reader.ReadBool(); goto case 16; case 16: { MaxBODGoldRewardAllowed = reader.ReadInt(); HoursBetweenBODs = reader.ReadDouble(); BondingAbandonDelay = reader.ReadTimeSpan(); } goto case 15; case 15: { TreasureChestDamageModifierChance = reader.ReadDouble(); TreasureChestVanqChance = reader.ReadDouble(); TreasureChestPowerChance = reader.ReadDouble(); TreasureChestForceChance = reader.ReadDouble(); TreasureChestMightChance = reader.ReadDouble(); TreasureChestDurabilityModifierChance = reader.ReadDouble(); TreasureChestIndestructibleChance = reader.ReadDouble(); TreasureChestFortifiedChance = reader.ReadDouble(); TreasureChestMassiveChance = reader.ReadDouble(); TreasureChestSubstantialChance = reader.ReadDouble(); TreasureChestAccuracyModifierChance = reader.ReadDouble(); TreasureChestSupremelyChance = reader.ReadDouble(); TreasureChestExceedinglyChance = reader.ReadDouble(); TreasureChestEminentlyChance = reader.ReadDouble(); TreasureChestSurpassinglyChance = reader.ReadDouble(); } goto case 14; case 14: { AllowRedsInTown = reader.ReadBool(); CompanionMinutesBetweenHelp = reader.ReadDouble(); ParagonRevertInHours = reader.ReadDouble(); AllowCriminalUseGate = reader.ReadBool(); } goto case 13; case 13: { AllowAllPossessedMobsSpeedBoost = reader.ReadBool(); AllowPseudoseerMobsSpeedBoost = reader.ReadBool(); } goto case 12; case 12: JustMurderedMinutesTracked = reader.ReadDouble(); goto case 11; case 11: SpeedHackSeriousThreshold = reader.ReadDouble(); goto case 10; case 10: { ParagonChestPlatinumPerLevel = reader.ReadInt(); MobStatueChance = reader.ReadDouble(); } goto case 9; case 9: { ParagonChestChance = reader.ReadDouble(); PlatinumPerMissedDamageLevel = reader.ReadInt(); ReplaceVanqWithSkillScrolls = reader.ReadBool(); } goto case 8; case 8: { ParagonMaxChance = reader.ReadDouble(); ParagonMinChance = reader.ReadDouble(); } goto case 7; case 7: HighestDamageLevelSpawn = reader.ReadInt(); goto case 6; case 6: reader.ReadByte(); goto case 5; case 5: { reader.ReadBool(); _FastWalkThreshold = reader.ReadTimeSpan(); } goto case 4; case 4: CreatureLootDropMultiplier = reader.ReadDouble(); goto case 3; case 3: MovePSeerToLastPossessed = reader.ReadBool(); goto case 2; case 2: { int numPseudoseers = reader.ReadInt(); for (int i = 0; i < numPseudoseers; i++) { PseudoseerUserNamesToReinstate.Add(reader.ReadString()); PseudoseerPermissionsToReinstate.Add(reader.ReadString()); } } goto case 1; case 1: { CurrentPermissionsClipboard = reader.ReadString(); SeerDuration = reader.ReadTimeSpan(); MessageStaff = reader.ReadBool(); } break; } _Instance = this; }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); this.LootType = LootType.Blessed; if (Core.SE && this.Weight == 3.0) this.Weight = 1.0; int version = reader.ReadInt(); switch ( version ) { case 3: { this.m_Quality = (BookQuality)reader.ReadByte(); goto case 2; } case 2: { this.m_Crafter = reader.ReadMobile(); goto case 1; } case 1: { this.m_Level = (SecureLevel)reader.ReadInt(); goto case 0; } case 0: { int count = reader.ReadInt(); this.m_Entries = new List<RunebookEntry>(count); for (int i = 0; i < count; ++i) this.m_Entries.Add(new RunebookEntry(reader)); this.m_Description = reader.ReadString(); this.m_CurCharges = reader.ReadInt(); this.m_MaxCharges = reader.ReadInt(); this.m_DefaultIndex = reader.ReadInt(); break; } } }
public AdresseeEntry(GenericReader reader) { int version = reader.ReadByte(); m_Adressee = reader.ReadMobile(); }
public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); switch ( version ) { case 3: { m_Quality = (BookQuality) reader.ReadByte(); goto case 2; } case 2: { m_Crafter = reader.ReadMobile(); goto case 1; } case 1: case 0: { int count = reader.ReadInt(); m_Entries = new List<RunebookEntry>( count ); for ( int i = 0; i < count; ++i ) m_Entries.Add( new RunebookEntry( reader ) ); m_Description = reader.ReadString(); m_CurCharges = reader.ReadInt(); m_MaxCharges = reader.ReadInt(); m_DefaultIndex = reader.ReadInt(); break; } } }
private static bool ParseMovementUpdateBlock(GenericReader gr, StringBuilder sb, StreamWriter swe, StreamWriter data, ObjectTypes objectTypeId, WoWObject obj) { Coords4 coords; coords.X = 0; coords.Y = 0; coords.Z = 0; coords.O = 0; sb.AppendLine("=== movement_update_block_start ==="); MovementFlags mf = MovementFlags.MOVEMENTFLAG_NONE; // movement flags UpdateFlags flags = (UpdateFlags)gr.ReadByte(); sb.AppendLine("Update Flags: " + flags.ToString("X") + " : " + flags); if ((UpdateFlags.UPDATEFLAG_LIVING & flags) != 0) // 0x20 { mf = (MovementFlags)gr.ReadUInt32(); sb.AppendLine("Movement Flags: " + mf.ToString("X") + " : " + mf); byte unk = gr.ReadByte(); sb.AppendLine("Unknown Byte: " + unk.ToString("X2")); uint time = gr.ReadUInt32(); sb.AppendLine("Time: " + time.ToString("X8")); } if ((UpdateFlags.UPDATEFLAG_HASPOSITION & flags) != 0) // 0x40 { coords = gr.ReadCoords4(); sb.AppendLine("Coords: " + coords.GetCoordsAsString()); if (objectTypeId == ObjectTypes.TYPEID_UNIT || objectTypeId == ObjectTypes.TYPEID_GAMEOBJECT) { if (obj != null) { obj.SetPosition(coords.X, coords.Y, coords.Z, coords.O); } } } if ((flags & UpdateFlags.UPDATEFLAG_LIVING) != 0) // 0x20 { /*if (objectTypeId == ObjectTypes.TYPEID_UNIT || objectTypeId == ObjectTypes.TYPEID_GAMEOBJECT) * { * data.WriteLine(); * data.WriteLine(objectTypeId + ": " + coords.GetCoordsAsString()); * }*/ if ((mf & MovementFlags.MOVEMENTFLAG_ONTRANSPORT) != 0) // transport { ulong t_guid = gr.ReadUInt64(); sb.Append("Transport GUID: " + t_guid.ToString("X16") + ", "); Coords4 transport = gr.ReadCoords4(); sb.AppendLine("Transport Coords: " + transport.GetCoordsAsString()); uint unk2 = gr.ReadUInt32(); // unk, probably timestamp sb.AppendLine("Transport Unk: " + unk2.ToString("X8")); } if ((mf & (MovementFlags.MOVEMENTFLAG_SWIMMING | MovementFlags.MOVEMENTFLAG_UNK5)) != 0) { float unkf1 = gr.ReadSingle(); sb.AppendLine("MovementFlags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_UNK5): " + unkf1); } uint unk1 = gr.ReadUInt32(); sb.AppendLine("Unk1: " + unk1.ToString("X8")); if ((mf & MovementFlags.MOVEMENTFLAG_JUMPING) != 0) { // looks like orientation/coords/speed float unk3 = gr.ReadSingle(); sb.AppendLine("unk3: " + unk3); float unk4 = gr.ReadSingle(); sb.AppendLine("unk4: " + unk4); float unk5 = gr.ReadSingle(); sb.AppendLine("unk5: " + unk5); float unk6 = gr.ReadSingle(); sb.AppendLine("unk6: " + unk6); } if ((mf & MovementFlags.MOVEMENTFLAG_SPLINE) != 0) { float unkf2 = gr.ReadSingle(); sb.AppendLine("MovementFlags & MOVEMENTFLAG_SPLINE: " + unkf2); } float ws = gr.ReadSingle(); sb.AppendLine("Walk speed: " + ws); float rs = gr.ReadSingle(); sb.AppendLine("Run speed: " + rs); float sbs = gr.ReadSingle(); sb.AppendLine("Swimback speed: " + sbs); float ss = gr.ReadSingle(); sb.AppendLine("Swim speed: " + ss); float wbs = gr.ReadSingle(); sb.AppendLine("Walkback speed: " + wbs); float fs = gr.ReadSingle(); sb.AppendLine("Fly speed: " + fs); float fbs = gr.ReadSingle(); sb.AppendLine("Flyback speed: " + fbs); float ts = gr.ReadSingle(); sb.AppendLine("Turn speed: " + ts); // pi = 3.14 if ((mf & MovementFlags.MOVEMENTFLAG_SPLINE2) != 0) { uint flags3 = gr.ReadUInt32(); sb.AppendLine("SplineFlags " + flags3.ToString("X8")); if ((flags3 & 0x10000) != 0) { Coords3 c = gr.ReadCoords3(); sb.AppendLine("SplineFlags & 0x10000: " + c.GetCoords()); } if ((flags3 & 0x20000) != 0) { ulong g3 = gr.ReadUInt64(); sb.AppendLine("flags3_guid: " + g3.ToString("X16")); // ???? } if ((flags3 & 0x40000) != 0) { uint f3_3 = gr.ReadUInt32(); sb.AppendLine("flags3_unk_value3: " + f3_3.ToString("X8")); } uint t1 = gr.ReadUInt32(); sb.AppendLine("curr tick: " + t1.ToString("X8")); uint t2 = gr.ReadUInt32(); sb.AppendLine("last tick: " + t2.ToString("X8")); uint t3 = gr.ReadUInt32(); sb.AppendLine("tick count " + t3.ToString("X8")); uint coords_count = gr.ReadUInt32(); sb.AppendLine("coords_count: " + coords_count.ToString("X8")); for (uint i = 0; i < coords_count; i++) { Coords3 v = gr.ReadCoords3(); sb.AppendLine("coord" + i + ": " + v.GetCoords()); } Coords3 end = gr.ReadCoords3(); sb.AppendLine("end: " + end.GetCoords()); } } if ((flags & UpdateFlags.UPDATEFLAG_LOWGUID) != 0) // 0x08 { uint temp = gr.ReadUInt32(); // timestamp or something like it sb.AppendLine("UpdateFlags & 0x08 (lowguid): " + temp.ToString("X8")); } if ((UpdateFlags.UPDATEFLAG_HIGHGUID & flags) != 0) // 0x10 { uint guid_high = gr.ReadUInt32(); // timestamp or something like it sb.AppendLine("UpdateFlags & 0x10 (highguid): " + guid_high.ToString("X8")); } if ((UpdateFlags.UPDATEFLAG_FULLGUID & flags) != 0) // 0x04 { ulong guid2 = gr.ReadPackedGuid(); // guid, but what guid? sb.AppendLine("UpdateFlags & 0x04 guid: " + guid2.ToString("X16")); } if ((UpdateFlags.UPDATEFLAG_TRANSPORT & flags) != 0) // 0x02 { uint time = gr.ReadUInt32(); // time sb.AppendLine("UpdateFlags & 0x02 t_time: " + time.ToString("X8")); } if ((UpdateFlags.UPDATEFLAG_SELFTARGET & flags) != 0) // 0x01 { sb.AppendLine("updating self!"); } sb.AppendLine("=== movement_update_block_end ==="); return(true); }
public void Deserialize(GenericReader reader) { reader.ReadByte(); Level = reader.ReadInt(); Decoder = reader.ReadMobile(); Map = reader.ReadMap(); Location = reader.ReadPoint2D(); Bounds = reader.ReadRect2D(); }
public RunebookEntry( GenericReader reader ) { int version = reader.ReadByte(); switch ( version ) { case 1: case 0: { m_Location = reader.ReadPoint3D(); m_Map = reader.ReadMap(); m_Description = reader.ReadString(); break; } } }
public void Deserialize( GenericReader gr ) { place = gr.ReadByte(); action = (ushort)gr.ReadShort(); type = gr.ReadByte(); other = gr.ReadByte(); }
public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); m_TreasureLevel = (TreasureLevel)reader.ReadByte(); m_MinSpawnTime = reader.ReadShort(); m_MaxSpawnTime = reader.ReadShort(); if( !Locked ) StartResetTimer(); }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadEncodedInt(); switch (version) { case 0: { if (SkillBonus == 0) SkillBonus = 1; m_Flags = (SkillScrollFlags) reader.ReadEncodedInt(); m_SkillBonus = reader.ReadInt(); m_SkillName = (SkillName) reader.ReadByte(); break; } } }
public static void Deserialize( GenericReader reader, int version, BaseObjectiveInstance objInstance ) { if ( reader.ReadBool() ) { DateTime endTime = reader.ReadDeltaTime(); if ( objInstance != null ) objInstance.EndTime = endTime; } DataType extraDataType = (DataType)reader.ReadByte(); switch ( extraDataType ) { case DataType.EscortObjective: { bool completed = reader.ReadBool(); if ( objInstance is EscortObjectiveInstance ) ( (EscortObjectiveInstance)objInstance ).HasCompleted = completed; break; } case DataType.KillObjective: { int slain = reader.ReadInt(); if ( objInstance is KillObjectiveInstance ) ( (KillObjectiveInstance)objInstance ).Slain = slain; break; } case DataType.DeliverObjective: { bool completed = reader.ReadBool(); if ( objInstance is DeliverObjectiveInstance ) ( (DeliverObjectiveInstance)objInstance ).HasCompleted = completed; break; } } }
public RunebookEntry(GenericReader reader) { int version = reader.ReadByte(); switch ( version ) { case 1: { this.m_House = reader.ReadItem() as BaseHouse; goto case 0; } case 0: { this.m_Location = reader.ReadPoint3D(); this.m_Map = reader.ReadMap(); this.m_Description = reader.ReadString(); break; } } }
/// <summary> /// Decodes a DXT5-compressed 4x4 block of texels. /// </summary> /// <remarks>See https://msdn.microsoft.com/en-us/library/windows/desktop/bb694531(v=vs.85).aspx#BC3 </remarks> static Color32[] DecodeDXT5TexelBlock(GenericReader r) { // Create the alpha table. var alphaTable = new float[8]; alphaTable[0] = r.ReadByte(); alphaTable[1] = r.ReadByte(); if (alphaTable[0] > alphaTable[1]) { for (var i = 0; i < 6; i++) { alphaTable[2 + i] = Mathf.Lerp(alphaTable[0], alphaTable[1], (float)(1 + i) / 7); } } else { for (var i = 0; i < 4; i++) { alphaTable[2 + i] = Mathf.Lerp(alphaTable[0], alphaTable[1], (float)(1 + i) / 5); } alphaTable[6] = 0; alphaTable[7] = 255; } // Read pixel alpha indices. var alphaIndices = new uint[16]; var alphaIndexBytesRow0 = new byte[3]; r.Read(alphaIndexBytesRow0, 0, alphaIndexBytesRow0.Length); Array.Reverse(alphaIndexBytesRow0); // Take care of little-endianness. var alphaIndexBytesRow1 = new byte[3]; r.Read(alphaIndexBytesRow1, 0, alphaIndexBytesRow1.Length); Array.Reverse(alphaIndexBytesRow1); // Take care of little-endianness. const uint bitsPerAlphaIndex = 3U; alphaIndices[0] = (uint)Utils.GetBits(21, bitsPerAlphaIndex, alphaIndexBytesRow0); alphaIndices[1] = (uint)Utils.GetBits(18, bitsPerAlphaIndex, alphaIndexBytesRow0); alphaIndices[2] = (uint)Utils.GetBits(15, bitsPerAlphaIndex, alphaIndexBytesRow0); alphaIndices[3] = (uint)Utils.GetBits(12, bitsPerAlphaIndex, alphaIndexBytesRow0); alphaIndices[4] = (uint)Utils.GetBits(9, bitsPerAlphaIndex, alphaIndexBytesRow0); alphaIndices[5] = (uint)Utils.GetBits(6, bitsPerAlphaIndex, alphaIndexBytesRow0); alphaIndices[6] = (uint)Utils.GetBits(3, bitsPerAlphaIndex, alphaIndexBytesRow0); alphaIndices[7] = (uint)Utils.GetBits(0, bitsPerAlphaIndex, alphaIndexBytesRow0); alphaIndices[8] = (uint)Utils.GetBits(21, bitsPerAlphaIndex, alphaIndexBytesRow1); alphaIndices[9] = (uint)Utils.GetBits(18, bitsPerAlphaIndex, alphaIndexBytesRow1); alphaIndices[10] = (uint)Utils.GetBits(15, bitsPerAlphaIndex, alphaIndexBytesRow1); alphaIndices[11] = (uint)Utils.GetBits(12, bitsPerAlphaIndex, alphaIndexBytesRow1); alphaIndices[12] = (uint)Utils.GetBits(9, bitsPerAlphaIndex, alphaIndexBytesRow1); alphaIndices[13] = (uint)Utils.GetBits(6, bitsPerAlphaIndex, alphaIndexBytesRow1); alphaIndices[14] = (uint)Utils.GetBits(3, bitsPerAlphaIndex, alphaIndexBytesRow1); alphaIndices[15] = (uint)Utils.GetBits(0, bitsPerAlphaIndex, alphaIndexBytesRow1); // Create the color table. var colorTable = new Color[4]; colorTable[0] = r.ReadUInt16().B565ToColor(); colorTable[1] = r.ReadUInt16().B565ToColor(); colorTable[2] = Color.Lerp(colorTable[0], colorTable[1], 1.0f / 3); colorTable[3] = Color.Lerp(colorTable[0], colorTable[1], 2.0f / 3); // Calculate pixel colors. var colors = DecodeDXT1TexelBlock(r, colorTable); for (var i = 0; i < 16; i++) { colors[i].a = (byte)Mathf.Round(alphaTable[alphaIndices[i]]); } return(colors); }