Beispiel #1
0
 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;
 }
Beispiel #2
0
        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);
            }
Beispiel #3
0
 public MobTypeInfo(ANIMATION_GROUPS_TYPE type, long flags)
 {
     Type  = type;
     Flags = flags;
 }
Beispiel #4
0
 public AnimInfo(ANIMATION_GROUPS_TYPE type, int offset)
 {
     Type   = type;
     Offset = offset;
 }
Beispiel #5
0
        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));
                    }
                }
            }
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
 private static void ConvertAnimation(ANIMATION_GROUPS_TYPE type)
 {
 }