コード例 #1
0
        private void ParsePreyData(Internal.ByteArray message)
        {
            int slot  = message.ReadUnsignedByte();
            var state = message.ReadEnum <PreySlotStates>();

            switch (state)
            {
            case PreySlotStates.Locked: {
                message.ReadEnum <PreySlotUnlockType>();
                break;
            }

            case PreySlotStates.Inactive: {
                break;
            }

            case PreySlotStates.Active: {
                string monsterName   = message.ReadString();
                var    monsterOutfit = ReadCreatureOutfit(message);
                var    bonusType     = message.ReadEnum <PreyBonusTypes>();
                int    bonusValue    = message.ReadUnsignedShort();
                int    bonusGrade    = message.ReadUnsignedByte();
                int    timeLeft      = message.ReadUnsignedShort();
                break;
            }

            case PreySlotStates.Selection: {
                byte size = message.ReadUnsignedByte();
                for (int i = 0; i < size; i++)
                {
                    string monsterName   = message.ReadString();
                    var    monsterOutfit = ReadCreatureOutfit(message);
                }
                break;
            }

            case PreySlotStates.SelectionChangeMonster: {
                var  bonusType  = message.ReadEnum <PreyBonusTypes>();
                int  bonusValue = message.ReadUnsignedShort();
                int  bonusGrade = message.ReadUnsignedByte();
                byte size       = message.ReadUnsignedByte();
                for (int i = 0; i < size; i++)
                {
                    string monsterName   = message.ReadString();
                    var    monsterOutfit = ReadCreatureOutfit(message);
                }
                break;
            }

            default:
                break;
            }

            message.ReadUnsignedShort(); // timeUntilFreeListReroll
            if (OpenTibiaUnity.GameManager.ClientVersion >= 1190)
            {
                message.ReadUnsignedByte(); // preyWildCards
            }
        }
コード例 #2
0
        private void ParseChannelEvent(Internal.ByteArray message)
        {
            int    channelId  = message.ReadUnsignedShort();
            var    channel    = ChatStorage.GetChannel(channelId);
            string playerName = message.ReadString();
            var    eventType  = message.ReadEnum <ChannelEvent>();

            switch (eventType)
            {
            case ChannelEvent.PlayerJoined:
                channel.PlayerJoined(playerName);
                break;

            case ChannelEvent.PlayerLeft:
                channel.PlayerLeft(playerName);
                break;

            case ChannelEvent.PlayerInvited:
                channel.PlayerInvited(playerName);
                break;

            case ChannelEvent.PlayerExcluded:
                channel.PlayerExcluded(playerName);
                break;

            case ChannelEvent.PlayerPending:
                channel.PlayerPending(playerName);
                break;
            }
        }
コード例 #3
0
        private void ParseSetInventory(Internal.ByteArray message)
        {
            var slot    = message.ReadEnum <ClothSlots>();
            var @object = ReadObjectInstance(message);

            OpenTibiaUnity.ContainerStorage.BodyContainerView.SetObject(slot, @object);
        }
コード例 #4
0
        private void ParseInspectionList(Internal.ByteArray message)
        {
            bool isPlayer = message.ReadBoolean();

            int size = message.ReadUnsignedByte();

            for (int i = 0; i < size; i++)
            {
                var @object = ReadObjectInstance(message);
                if (isPlayer)
                {
                    var slot = message.ReadEnum <ClothSlots>();
                }


                int imbuementSlots = message.ReadUnsignedByte();
                for (int j = 0; j < imbuementSlots; j++)
                {
                    int imbuementID = message.ReadUnsignedByte();
                }

                int details = message.ReadUnsignedByte();
                for (int j = 0; j < details; j++)
                {
                    string name        = message.ReadString();
                    string description = message.ReadString();
                }
            }
        }
コード例 #5
0
        private void ParseUpdateLootContainers(Internal.ByteArray message)
        {
            byte unknown = message.ReadUnsignedByte();
            int  count   = message.ReadUnsignedByte();

            for (int i = 0; i < count; i++)
            {
                var    type     = message.ReadEnum <ObjectCategory>();
                ushort objectId = message.ReadUnsignedShort();
            }
        }
コード例 #6
0
 public static LoginserverMessageType ReadLoginType(this Internal.ByteArray message)
 {
     return(message.ReadEnum <LoginserverMessageType>());
 }
コード例 #7
0
        private Creatures.Creature ReadCreatureInstance(Internal.ByteArray message, int type    = -1,
                                                        UnityEngine.Vector3Int?absolutePosition = null)
        {
            if (type == -1)
            {
                type = message.ReadUnsignedShort();
            }

            if (type != AppearanceInstance.Creature && type != AppearanceInstance.OutdatedCreature && type != AppearanceInstance.UnknownCreature)
            {
                throw new System.Exception("ProtocolGame.ReadCreatureInstance: Invalid creature type");
            }

            var gameManager = OpenTibiaUnity.GameManager;

            Creatures.Creature creature;
            switch (type)
            {
            case AppearanceInstance.UnknownCreature:
            case AppearanceInstance.OutdatedCreature: {
                if (type == AppearanceInstance.UnknownCreature)
                {
                    uint         removeID = message.ReadUnsignedInt();
                    uint         newID    = message.ReadUnsignedInt();
                    CreatureType creatureType;

                    if (gameManager.ClientVersion >= 910)
                    {
                        creatureType = message.ReadEnum <CreatureType>();
                    }
                    else
                    {
                        if (newID >= Constants.PlayerStartID && newID < Constants.PlayerEndID)
                        {
                            creatureType = CreatureType.Player;
                        }
                        else if (newID >= Constants.MonsterStartID && newID < Constants.MonsterEndID)
                        {
                            creatureType = CreatureType.Monster;
                        }
                        else
                        {
                            creatureType = CreatureType.NPC;
                        }
                    }

                    if (newID == Player.ID)
                    {
                        creature = Player;
                    }
                    else
                    {
                        creature = new Creatures.Creature(newID);
                    }

                    creature = CreatureStorage.ReplaceCreature(creature, removeID);
                    if (!creature)
                    {
                        throw new System.Exception("ProtocolGame.ReadCreatureInstance: Failed to append creature.");
                    }

                    creature.Type = creatureType;
                    if (gameManager.ClientVersion >= 1120)
                    {
                        creature.SetSummonerID(creature.IsSummon ? message.ReadUnsignedInt() : 0);
                    }

                    creature.Name = message.ReadString();
                }
                else
                {
                    uint creatureId = message.ReadUnsignedInt();
                    creature = CreatureStorage.GetCreature(creatureId);
                    if (!creature)
                    {
                        throw new System.Exception("ProtocolGame.ReadCreatureInstance: Outdated creature not found.");
                    }
                }

                creature.SetSkill(SkillType.HealthPercent, message.ReadUnsignedByte());
                creature.Direction = message.ReadEnum <Direction>();
                creature.Outfit    = ReadCreatureOutfit(message, creature.Outfit);
                if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerMounts))
                {
                    creature.MountOutfit = ReadMountOutfit(message, creature.MountOutfit);
                }
                creature.Brightness = message.ReadUnsignedByte();
                creature.LightColor = Colors.ColorFrom8Bit(message.ReadUnsignedByte());
                creature.SetSkill(SkillType.Speed, message.ReadUnsignedShort());
                creature.SetPKFlag(message.ReadEnum <PKFlag>());
                creature.SetPartyFlag(message.ReadEnum <PartyFlag>());

                if (gameManager.GetFeature(GameFeature.GameCreatureEmblems) && type == AppearanceInstance.UnknownCreature)
                {
                    creature.SetGuildFlag(message.ReadEnum <GuildFlag>());
                }

                if (gameManager.GetFeature(GameFeature.GameCreatureMarks))
                {
                    creature.Type = message.ReadEnum <CreatureType>();
                    if (gameManager.ClientVersion >= 1120)
                    {
                        creature.SetSummonerID(creature.IsSummon ? message.ReadUnsignedInt() : 0);
                    }
                }

                if (gameManager.GetFeature(GameFeature.GameCreatureIcons))
                {
                    creature.SetSpeechCategory(message.ReadEnum <SpeechCategory>());
                }

                if (gameManager.GetFeature(GameFeature.GameCreatureMarks))
                {
                    creature.Marks.SetMark(MarkType.Permenant, message.ReadUnsignedByte());

                    if (gameManager.GetFeature(GameFeature.GameInspectionWindow))
                    {
                        message.ReadUnsignedByte();     // inspection state
                    }
                    if (gameManager.ClientVersion < 1185)
                    {
                        creature.NumberOfPvPHelpers = message.ReadUnsignedShort();
                    }
                }

                if (gameManager.ClientVersion >= 854)
                {
                    creature.Unpassable = message.ReadUnsignedByte() != 0;
                }
                else
                {
                    creature.Unpassable = true;
                }
                break;
            }

            case AppearanceInstance.Creature: {
                uint creatureId = message.ReadUnsignedInt();
                creature = CreatureStorage.GetCreature(creatureId);
                if (!creature)
                {
                    throw new System.Exception(string.Format("ProtocolGame.ReadCreatureInstance: Known creature not found ({0}).", creatureId));
                }

                creature.Direction = message.ReadEnum <Direction>();

                if (gameManager.ClientVersion >= 953)
                {
                    creature.Unpassable = message.ReadUnsignedByte() != 0;
                }
                break;
            }

            default:
                throw new System.Exception("ProtocolGame.ReadCreatureInstance: unknown creature identity type.");
            }

            if (absolutePosition.HasValue)
            {
                creature.Position = absolutePosition.Value;
            }

            CreatureStorage.MarkOpponentVisible(creature, true);
            CreatureStorage.InvalidateOpponents();
            return(creature);
        }
コード例 #8
0
        private DailyReward.DailyReward ReadDailyReward(Internal.ByteArray message)
        {
            var rewardState = message.ReadEnum <DailyRewardStates>();

            var reward = new DailyReward.DailyReward(rewardState);

            switch (rewardState)
            {
            case DailyRewardStates.PickedItems: {
                reward.AllowedMaximumItems = message.ReadUnsignedByte();
                int objectCount = message.ReadUnsignedByte();

                for (int i = 0; i < objectCount; i++)
                {
                    ushort objectId     = message.ReadUnsignedShort();
                    string objectName   = message.ReadString();
                    uint   objectWeight = message.ReadUnsignedInt();

                    reward.AddItem(new DailyReward.Types.Object(objectId, objectName, objectWeight, -1));
                }

                break;
            }

            case DailyRewardStates.FixedItems: {
                int itemsCount = message.ReadUnsignedByte();
                for (int i = 0; i < itemsCount; i++)
                {
                    var rewardType = message.ReadEnum <DailyRewardTypes>();
                    switch (rewardType)
                    {
                    case DailyRewardTypes.Object: {
                        ushort objectId     = message.ReadUnsignedShort();
                        string objectName   = message.ReadString();
                        int    objectAmount = message.ReadUnsignedByte();

                        reward.AddItem(new DailyReward.Types.Object(objectId, objectName, 0, objectAmount));
                        break;
                    }

                    case DailyRewardTypes.PreyBonusRerolls: {
                        int amount = message.ReadUnsignedByte();
                        reward.AddItem(new DailyReward.Types.PreyBonusRerolls(amount));
                        break;
                    }

                    case DailyRewardTypes.FiftyPercentXpBoost: {
                        ushort minutes = message.ReadUnsignedShort();
                        reward.AddItem(new DailyReward.Types.XpBoost(minutes));
                        break;
                    }

                    default:
                        throw new System.Exception("ProtocolGame.ReadDailyReward: Invalid reward type " + (int)rewardType + ".");
                    }
                }

                break;
            }
            }

            return(reward);
        }
コード例 #9
0
        private void ParseDeleteInventory(Internal.ByteArray message)
        {
            var slot = message.ReadEnum <ClothSlots>();

            OpenTibiaUnity.ContainerStorage.BodyContainerView.SetObject(slot, null);
        }