public BodyConvInfo(ushort oldGraphic, ushort newGraphic, byte fileIndex, bool isUOP, ANIMATION_GROUPS_TYPE type, int offset) { OldGraphic = oldGraphic; NewGraphic = newGraphic; FileIndex = fileIndex; IsUOP = isUOP; Type = type; Offset = offset; }
private static byte GetObjectNewAnimationType_0(Mobile mobile, ushort action, byte mode) { if (action <= 10) { ref IndexAnimation ia = ref FileManager.Animations.DataIndex[mobile.Graphic]; ANIMATION_GROUPS_TYPE type = ANIMATION_GROUPS_TYPE.MONSTER; if ((ia.Flags & 0x80000000) != 0) { type = ia.Type; } if (type == ANIMATION_GROUPS_TYPE.MONSTER) { switch (mode % 4) { case 1: return(5); case 2: return(6); case 3: if ((ia.Flags & 1) != 0) { return(12); } goto case 0; case 0: return(4); } } else if (type == ANIMATION_GROUPS_TYPE.SEA_MONSTER) { if (mode % 2 != 0) { return(6); } return(5); } else if (type != ANIMATION_GROUPS_TYPE.ANIMAL) { if (mobile.Equipment[(int)Layer.Mount] != null) { if (action > 0) { if (action == 1) { return(27); } if (action == 2) { return(28); } return(26); } return(29); } switch (action) { default: return(31); case 1: return(18); case 2: return(19); case 6: return(12); case 7: return(13); case 8: return(14); case 3: return(11); case 4: return(9); case 5: return(10); } } if (mode % 2 != 0) { return(6); } return(5); }
public MobTypeInfo(ANIMATION_GROUPS_TYPE type, long flags) { Type = type; Flags = flags; }
public AnimInfo(ANIMATION_GROUPS_TYPE type, int offset) { Type = type; Offset = offset; }
private void ReadBodyconv() { FileInfo file = new FileInfo(Path.Combine(FileManager.UoFolderPath, "Bodyconv.def")); if (!file.Exists) { return; } using (DefReader defReader = new DefReader(file.FullName)) { while (defReader.Next()) { int index = defReader.ReadInt(); if (index >= Constants.MAX_ANIMATIONS_DATA_INDEX_COUNT) { continue; } int[] anim = { defReader.ReadInt(), -1, -1, -1 }; if (defReader.PartsCount >= 3) { anim[1] = defReader.ReadInt(); if (defReader.PartsCount >= 4) { anim[2] = defReader.ReadInt(); if (defReader.PartsCount >= 5) { anim[3] = defReader.ReadInt(); } } } int startAnimID = -1; int animFile = 0; ushort realAnimID = 0; sbyte mountedHeightOffset = 0; ANIMATION_GROUPS_TYPE groupType = ANIMATION_GROUPS_TYPE.UNKNOWN; if (anim[0] != -1) { animFile = 1; realAnimID = (ushort)anim[0]; if (index == 0x00C0 || index == 793) { mountedHeightOffset = -9; } if (realAnimID == 68) { realAnimID = 122; } if (realAnimID < 200) { startAnimID = realAnimID * 110; groupType = ANIMATION_GROUPS_TYPE.MONSTER; } else { if (realAnimID < 400) { startAnimID = realAnimID * 65 + 9000; groupType = ANIMATION_GROUPS_TYPE.ANIMAL; } else { startAnimID = (realAnimID - 200) * 175; groupType = ANIMATION_GROUPS_TYPE.HUMAN; } } } else if (anim[1] != -1) { animFile = 2; realAnimID = (ushort)anim[1]; if (realAnimID < 300) { if (FileManager.ClientVersion < ClientVersions.CV_70130) { startAnimID = realAnimID * 110; // 33000 + ((realAnimID - 300) * 110); groupType = ANIMATION_GROUPS_TYPE.MONSTER; } else { startAnimID = realAnimID * 65 + 9000; groupType = ANIMATION_GROUPS_TYPE.ANIMAL; } } else { if (realAnimID < 400) { if (FileManager.ClientVersion < ClientVersions.CV_70130) { startAnimID = realAnimID * 65 /*+ 9000*/; groupType = ANIMATION_GROUPS_TYPE.ANIMAL; } else { startAnimID = 33000 + ((realAnimID - 300) * 110); groupType = ANIMATION_GROUPS_TYPE.MONSTER; } } else { startAnimID = 35000 + ((realAnimID - 400) * 175); groupType = ANIMATION_GROUPS_TYPE.HUMAN; } } } else if (anim[2] != -1) { animFile = 3; realAnimID = (ushort)anim[2]; if (realAnimID < 200) { startAnimID = realAnimID * 110; groupType = ANIMATION_GROUPS_TYPE.MONSTER; } else { if (realAnimID < 400) { startAnimID = realAnimID * 65 + 9000; groupType = ANIMATION_GROUPS_TYPE.ANIMAL; } else { startAnimID = (realAnimID - 200) * 175; groupType = ANIMATION_GROUPS_TYPE.HUMAN; } } } else if (anim[3] != -1) { animFile = 4; realAnimID = (ushort)anim[3]; mountedHeightOffset = -9; if (index == 0x0115 || index == 0x00C0) { mountedHeightOffset = 0; } if (realAnimID != 34) { if (realAnimID < 200) { startAnimID = realAnimID * 110; groupType = ANIMATION_GROUPS_TYPE.MONSTER; } else { if (realAnimID < 400) { startAnimID = realAnimID * 65 + 9000; groupType = ANIMATION_GROUPS_TYPE.ANIMAL; } else { startAnimID = (realAnimID - 200) * 175; groupType = ANIMATION_GROUPS_TYPE.HUMAN; } } } else { startAnimID = 0x2BCA; groupType = ANIMATION_GROUPS_TYPE.ANIMAL; } } if (startAnimID != -1 && animFile != 0) { if (!_bodiesConv.TryGetValue(index, out var list) || list == null) { list = new List <BodyConvInfo>(); _bodiesConv.Add(index, list); } list.Add(new BodyConvInfo((ushort)index, (ushort)realAnimID, (byte)animFile, false, groupType, startAnimID)); } } } }
public static byte GetGroupForAnimation(Mobile mobile, ushort checkGraphic = 0, bool isParent = false) { Graphic graphic = checkGraphic; if (graphic == 0) { graphic = mobile.GetGraphicForAnimation(); } if (graphic >= Constants.MAX_ANIMATIONS_DATA_INDEX_COUNT) { return(0); } ANIMATION_GROUPS_TYPE type = FileManager.Animations.DataIndex[graphic].Type; ANIMATION_GROUPS_TYPE originalType = ANIMATION_GROUPS_TYPE.UNKNOWN; if (FileManager.Animations.DataIndex[graphic].IsUOP && (isParent || !FileManager.Animations.DataIndex[graphic].IsValidMUL)) { // do nothing ? } else { if (!FileManager.Animations.DataIndex[graphic].HasBodyConversion) { ushort newGraphic = FileManager.Animations.DataIndex[graphic].Graphic; if (graphic != newGraphic) { graphic = newGraphic; ANIMATION_GROUPS_TYPE newType = FileManager.Animations.DataIndex[graphic].Type; if (newType != type) { originalType = type; type = newType; } } } } ANIMATION_FLAGS flags = (ANIMATION_FLAGS)FileManager.Animations.DataIndex[graphic].Flags; if (mobile.AnimationFromServer && mobile.AnimationGroup != 0xFF) { ushort v13 = mobile.AnimationGroup; if (v13 == 12) { if (!(type == ANIMATION_GROUPS_TYPE.HUMAN || type == ANIMATION_GROUPS_TYPE.EQUIPMENT || (flags & ANIMATION_FLAGS.AF_UNKNOWN_1000) != 0)) { if (type != ANIMATION_GROUPS_TYPE.MONSTER) { if (type == ANIMATION_GROUPS_TYPE.HUMAN || type == ANIMATION_GROUPS_TYPE.EQUIPMENT) { v13 = 16; } else { v13 = 5; } } else { v13 = 4; } } } if (type != ANIMATION_GROUPS_TYPE.MONSTER) { if (type != ANIMATION_GROUPS_TYPE.SEA_MONSTER) { if (type == ANIMATION_GROUPS_TYPE.ANIMAL) { if (IsReplacedObjectAnimation(0, v13)) { originalType = ANIMATION_GROUPS_TYPE.UNKNOWN; } if (v13 > 12) { switch (v13) { case 23: v13 = 0; break; case 24: v13 = 1; break; case 26: v13 = 9; break; case 28: v13 = 10; break; default: v13 = 2; break; } } //if (v13 > 12) // v13 = 0; // 2 } else { if (IsReplacedObjectAnimation(1, v13)) { // LABEL_190: LABEL_190(flags, ref v13); return((byte)v13); } } } else { if (IsReplacedObjectAnimation(3, v13)) { originalType = ANIMATION_GROUPS_TYPE.UNKNOWN; } if (v13 > 8) { v13 = 2; } } } else { if (IsReplacedObjectAnimation(2, v13)) { originalType = ANIMATION_GROUPS_TYPE.UNKNOWN; } if (!FileManager.Animations.AnimationExists(graphic, (byte)v13)) { v13 = 1; } if ((flags & ANIMATION_FLAGS.AF_USE_UOP_ANIMATION) != 0) { // do nothing? } else if (v13 > 21) { v13 = 1; } } if (originalType == ANIMATION_GROUPS_TYPE.UNKNOWN) { LABEL_190(flags, ref v13); return((byte)v13); } if (originalType != 0) { if (originalType == ANIMATION_GROUPS_TYPE.ANIMAL && type == ANIMATION_GROUPS_TYPE.MONSTER) { switch (v13) { case 0: v13 = 0; LABEL_190(flags, ref v13); return((byte)v13); case 1: v13 = 19; LABEL_190(flags, ref v13); return((byte)v13); case 3: v13 = 11; LABEL_190(flags, ref v13); return((byte)v13); case 5: v13 = 4; LABEL_190(flags, ref v13); return((byte)v13); case 6: v13 = 5; LABEL_190(flags, ref v13); return((byte)v13); case 7: case 11: v13 = 10; LABEL_190(flags, ref v13); return((byte)v13); case 8: v13 = 2; LABEL_190(flags, ref v13); return((byte)v13); case 9: v13 = 17; LABEL_190(flags, ref v13); return((byte)v13); case 10: v13 = 18; LABEL_190(flags, ref v13); return((byte)v13); case 12: v13 = 3; LABEL_190(flags, ref v13); return((byte)v13); } // LABEL_187 v13 = 1; } LABEL_190(flags, ref v13); return((byte)v13); } switch (type) { case ANIMATION_GROUPS_TYPE.HUMAN: switch (v13) { case 0: v13 = 0; goto LABEL_189; case 2: v13 = 21; goto LABEL_189; case 3: v13 = 22; goto LABEL_189; case 4: case 9: v13 = 9; goto LABEL_189; case 5: //LABEL_163: v13 = 11; goto LABEL_189; case 6: v13 = 13; goto LABEL_189; case 7: //LABEL_165: v13 = 18; goto LABEL_189; case 8: //LABEL_172: v13 = 19; goto LABEL_189; case 10: case 21: v13 = 20; goto LABEL_189; case 12: case 14: v13 = 16; goto LABEL_189; case 13: //LABEL_164: v13 = 17; goto LABEL_189; case 15: case 16: v13 = 30; goto LABEL_189; case 17: v13 = 5; LABEL_190(flags, ref v13); return((byte)v13); case 18: v13 = 6; LABEL_190(flags, ref v13); return((byte)v13); case 19: v13 = 1; LABEL_190(flags, ref v13); return((byte)v13); } //LABEL_161: v13 = 4; goto LABEL_189; case ANIMATION_GROUPS_TYPE.ANIMAL: switch (v13) { case 0: v13 = 0; goto LABEL_189; case 2: v13 = 8; LABEL_190(flags, ref v13); return((byte)v13); case 3: v13 = 12; goto LABEL_189; case 4: case 6: case 7: case 8: case 9: case 12: case 13: case 14: v13 = 5; LABEL_190(flags, ref v13); return((byte)v13); case 5: v13 = 6; LABEL_190(flags, ref v13); return((byte)v13); case 10: case 21: v13 = 7; LABEL_190(flags, ref v13); return((byte)v13); case 11: v13 = 3; LABEL_190(flags, ref v13); return((byte)v13); case 17: //LABEL_170: v13 = 9; goto LABEL_189; case 18: //LABEL_162: v13 = 10; goto LABEL_189; case 19: v13 = 1; LABEL_190(flags, ref v13); return((byte)v13); } v13 = 2; LABEL_190(flags, ref v13); return((byte)v13); case ANIMATION_GROUPS_TYPE.SEA_MONSTER: switch (v13) { case 0: //LABEL_182: v13 = 0; goto LABEL_189; case 2: case 3: //LABEL_178: v13 = 8; goto LABEL_189; case 4: case 6: case 7: case 8: case 9: case 12: case 13: case 14: //LABEL_183: v13 = 5; goto LABEL_189; case 5: //LABEL_184: v13 = 6; goto LABEL_189; case 10: case 21: //LABEL_185: v13 = 7; goto LABEL_189; case 17: //LABEL_186: v13 = 3; goto LABEL_189; case 18: v13 = 4; goto LABEL_189; case 19: LABEL_190(flags, ref v13); return((byte)v13); } v13 = 2; LABEL_190(flags, ref v13); return((byte)v13); default: LABEL_189: LABEL_190(flags, ref v13); return((byte)v13); } // LABEL_188 v13 = 2; LABEL_190(flags, ref v13); return((byte)v13); } byte result = mobile.AnimationGroup; bool isWalking = mobile.IsWalking; bool isRun = mobile.IsRunning; if (mobile.Steps.Count != 0) { isWalking = true; isRun = mobile.Steps.Front().Run; } switch (type) { case ANIMATION_GROUPS_TYPE.ANIMAL: if ((flags & ANIMATION_FLAGS.AF_CALCULATE_OFFSET_LOW_GROUP_EXTENDED) != 0) { CalculateHight(graphic, mobile, flags, isRun, isWalking, ref result); } else { if (!isWalking) { if (result == 0xFF) { if ((flags & ANIMATION_FLAGS.AF_USE_UOP_ANIMATION) != 0) { if (mobile.InWarMode) { result = 1; } else { result = 25; } } else { result = 2; } } } else if (isRun) { if ((flags & ANIMATION_FLAGS.AF_USE_UOP_ANIMATION) != 0) { result = 24; } else { result = FileManager.Animations.AnimationExists(graphic, 1) ? (byte)1 : (byte)2; } } else if ((flags & ANIMATION_FLAGS.AF_USE_UOP_ANIMATION) != 0 && !mobile.InWarMode) { result = 22; } else { result = 0; } } break; case ANIMATION_GROUPS_TYPE.MONSTER: CalculateHight(graphic, mobile, flags, isRun, isWalking, ref result); break; case ANIMATION_GROUPS_TYPE.SEA_MONSTER: if (!isWalking) { if (result == 0xFF) { result = 2; } } else if (isRun) { result = 1; } else { result = 0; } break; default: { Item hand2 = mobile.HasEquipment ? mobile.Equipment[(int)Layer.TwoHanded] : null; if (!isWalking) { if (result == 0xFF) { bool haveLightAtHand2 = hand2 != null && hand2.ItemData.IsLight && hand2.ItemData.AnimID == graphic; if (mobile.IsMounted) { result = !haveLightAtHand2 ? (byte)25 : (byte)28; } else if (!mobile.InWarMode || mobile.IsDead) { result = !haveLightAtHand2 ? (byte)4 : (byte)0; } else if (haveLightAtHand2) { result = 2; } else { ushort[] handAnimIDs = { 0, 0 }; Item hand1 = mobile.HasEquipment ? mobile.Equipment[(int)Layer.OneHanded] : null; if (hand1 != null) { handAnimIDs[0] = hand1.ItemData.AnimID; } if (hand2 != null) { handAnimIDs[1] = hand2.ItemData.AnimID; } if (hand1 == null) { if (hand2 != null) { result = handAnimIDs.Where(handAnimID => handAnimID >= 0x0263 && handAnimID <= 0x028B) .Any(handBaseGraphic => HANDS_BASE_ANIMID.Any(s => s == handBaseGraphic)) ? (byte)8 : (byte)7; } else { result = 7; } } else { result = 7; } } } } else if (mobile.IsMounted) { if (isRun) { result = 24; } else { result = 23; } } //else if (EquippedGraphic0x3E96) //{ //} else if (isRun || !mobile.InWarMode || mobile.IsDead) { if ((flags & ANIMATION_FLAGS.AF_USE_UOP_ANIMATION) != 0 && isRun && FileManager.Animations.AnimationExists(graphic, 24)) { result = 24; } else { result = (byte)(isRun ? 2 : 0); } if (hand2 != null) { ushort hand2Graphic = hand2.ItemData.AnimID; if (hand2Graphic < 0x0240 || hand2Graphic > 0x03E1) { result = (byte)(isRun ? 3 : 1); } else { if (HAND2_BASE_ANIMID.Any(s => s == hand2Graphic)) { result = (byte)(isRun ? 3 : 1); } } } } else { result = 15; } break; } } return(result); }
private static void ConvertAnimation(ANIMATION_GROUPS_TYPE type) { }