Пример #1
0
        public void Parse(InputMessage message)
        {
            byte worlds = message.GetU8();

            for (int i = 0; i < worlds; i++)
            {
                var world = new World();
                world.ID       = message.GetU8();
                world.Name     = message.GetString();
                world.HostName = message.GetString();
                world.Port     = message.GetU16();
                world.Preview  = message.GetBool();
                Worlds.Add(world);
            }

            byte characters = message.GetU8();

            for (int i = 0; i < characters; i++)
            {
                Character character = new Character();
                character.World = message.GetU8();
                character.Name  = message.GetString();
                Characters.Add(character);
            }

            AccountState     = message.GetU8();
            IsPremium        = message.GetBool();
            PremiumTimeStamp = message.GetU32();

            InfinitePremium = (IsPremium && PremiumTimeStamp == 0);
        }
Пример #2
0
        private void ParseBasicData(InputMessage message)
        {
            bool premium = message.GetBool();

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GamePremiumExpiration))
            {
                uint premiumExpiration = message.GetU32();
            }

            byte vocation = message.GetU8();

            if (OpenTibiaUnity.GameManager.ClientVersion >= 1100)
            {
                bool hasReachedMain = message.GetBool();
            }

            List <byte> spells      = new List <byte>();
            ushort      spellsCount = message.GetU16();

            for (int i = 0; i < spellsCount; i++)
            {
                spells.Add(message.GetU8());
            }

            if (m_Player)
            {
                //m_Player.PremiumStatus = premium;
                //m_Player.PremiumExpiration = premiumExpiration;
                //m_Player.Vocation = vocation;
                //m_Player.ReachedMain = hasReachedMain;
            }
        }
Пример #3
0
        private void ParseOpenContainer(InputMessage message)
        {
            byte containerId = message.GetU8();

            Appearances.ObjectInstance item = ReadObjectInstance(message);
            string name          = message.GetString();
            byte   capacity      = message.GetU8();
            bool   hasParent     = message.GetBool();
            bool   unlocked      = message.GetBool();
            bool   hasPages      = message.GetBool();
            ushort containerSize = message.GetU16();
            ushort firstIndex    = message.GetU16();

            int itemCount = message.GetU8();

            List <Appearances.ObjectInstance> items = new List <Appearances.ObjectInstance>(itemCount);

            for (int i = 0; i < itemCount; i++)
            {
                items.Add(ReadObjectInstance(message));
            }
        }
Пример #4
0
        private void ParseLoginSuccess(InputMessage message)
        {
            m_Player.ID   = message.GetU32();
            m_Player.Name = CharacterName;

#if !UNITY_EDITOR
            string title = string.Format("OpenTibiaUnity - {0}", m_Player.Name);
            OpenTibiaUnity.GameManager.SetApplicationTitle(title);
#endif

            BeatDuration = message.GetU16();
            if (OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GameNewSpeedLaw))
            {
                Creatures.Creature.SpeedA = message.GetDouble();
                Creatures.Creature.SpeedB = message.GetDouble();
                Creatures.Creature.SpeedC = message.GetDouble();
            }

            m_BugreportsAllowed = message.GetBool();

            if (OpenTibiaUnity.GameManager.ClientVersion >= 1054)
            {
                bool canChangePvPFrameRate = message.GetBool();
            }

            if (OpenTibiaUnity.GameManager.ClientVersion >= 1058)
            {
                bool exportPvPEnabled = message.GetBool();
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GameIngameStore))
            {
                string storeLink        = message.GetString();
                ushort storePackageSize = message.GetU16();
            }
        }
Пример #5
0
        private void ParseCreatureUnpass(InputMessage message)
        {
            uint creatureId = message.GetU32();
            bool unpass     = message.GetBool();

            var creature = m_CreatureStorage.GetCreature(creatureId);

            if (!creature)
            {
                throw new System.Exception("ProtocolGame.ParseCreatureUnpass: Unknown creature id: " + creatureId);
            }
            else
            {
                creature.Unpassable = unpass;
            }
        }
Пример #6
0
        private bool ParsePacket(InputMessage message)
        {
            byte opcode = message.GetU8();

            switch (opcode)
            {
            // CUSTOM
            case 76:
                int size = message.GetU8();
                for (int i = 0; i < size; i++)
                {
                    message.GetString();
                    message.GetString();
                    message.GetU16();
                    message.GetU8();
                }

                size = message.GetU8();
                for (int i = 0; i < size; i++)
                {
                    int type = message.GetU8();
                    message.GetU32();
                    message.GetU32();
                    if (message.GetBool() != true)
                    {
                        if (message.GetBool() != true)
                        {
                            message.GetU32();
                        }
                    }

                    if (type == 0)
                    {
                        message.GetU32();
                        message.GetU32();

                        int size2 = message.GetU8();
                        for (int j = 0; j < size2; j++)
                        {
                            message.GetU16();
                            message.GetString();
                            message.GetU32();
                        }
                    }

                    message.GetString();
                    message.GetString();
                }

                break;
            // END CUSTOM

            case GameServerOpCodes.LoginOrPendingState:
                SendEnterGame();
                break;

            case GameServerOpCodes.GMActions:
                ParseGmActions(message);
                break;

            case GameServerOpCodes.WorldEntered:
                ParseWorldEntered(message);
                IsGameRunning = true;
                OpenTibiaUnity.GameManager.ProcessGameStart();
                break;

            case GameServerOpCodes.LoginError:
                ParseLoginError(message);
                break;

            case GameServerOpCodes.LoginAdvice:
                ParseLoginAdvice(message);
                break;

            case GameServerOpCodes.LoginWait:
                ParseLoginWait(message);
                break;

            case GameServerOpCodes.LoginSuccess:
                ParseLoginSuccess(message);
                break;

            case GameServerOpCodes.LoginToken:
                ParseLoginToken(message);
                break;

            case GameServerOpCodes.Ping:
                SendPingBack();
                break;

            case GameServerOpCodes.PingBack:
                SendPing();
                break;

            case GameServerOpCodes.Challenge:
                ParseChallange(message);
                break;

            case GameServerOpCodes.Death:
                ParseDeath(message);
                break;

            case GameServerOpCodes.OTClientOpcode:
                ParseOtclientExtendedOpcode(message);
                break;

            case GameServerOpCodes.FullMap:
                ParseFullMap(message);
                break;

            case GameServerOpCodes.MapTopRow:
                ParseMapTopRow(message);
                break;

            case GameServerOpCodes.MapRightRow:
                ParseMapRightRow(message);
                break;

            case GameServerOpCodes.MapBottomRow:
                ParseMapBottomRow(message);
                break;

            case GameServerOpCodes.MapLeftRow:
                ParseMapLeftRow(message);
                break;

            case GameServerOpCodes.FieldData:
                ParseFieldData(message);
                break;

            case GameServerOpCodes.CreateOnMap:
                ParseCreateOnMap(message);
                break;

            case GameServerOpCodes.ChangeOnMap:
                ParseChangeOnMap(message);
                break;

            case GameServerOpCodes.DeleteOnMap:
                ParseDeleteOnMap(message);
                break;

            case GameServerOpCodes.MoveCreature:
                ParseCreatureMove(message);
                break;

            case GameServerOpCodes.OpenContainer:
                ParseOpenContainer(message);
                break;

            case GameServerOpCodes.CloseContainer:
                ParseCloseContainer(message);
                break;

            case GameServerOpCodes.CreateContainer:
                ParseContainerAddItem(message);
                break;

            case GameServerOpCodes.ChangeInContainer:
                ParseContainerUpdateItem(message);
                break;

            case GameServerOpCodes.DeleteInContainer:
                ParseContainerRemoveItem(message);
                break;

            case GameServerOpCodes.SetInventory:
                ParseSetInventory(message);
                break;

            case GameServerOpCodes.DeleteInventory:
                ParseDeleteInventory(message);
                break;

            case GameServerOpCodes.AmbientLight:
                ParseAmbientLight(message);
                break;

            case GameServerOpCodes.GraphicalEffect:
                ParseGraphicalEffect(message);
                break;

            case GameServerOpCodes.MissleEffect:
                ParseMissleEffect(message);
                break;

            case GameServerOpCodes.CreatureHealth:
                ParseCreatureHealth(message);
                break;

            case GameServerOpCodes.CreatureLight:
                ParseCreatureLight(message);
                break;

            case GameServerOpCodes.CreatureOutfit:
                ParseCreatureOutfit(message);
                break;

            case GameServerOpCodes.CreatureSpeed:
                ParseCreatureSpeed(message);
                break;

            case GameServerOpCodes.CreatureSkull:
                ParseCreatureSkull(message);
                break;

            case GameServerOpCodes.CreatureShield:
                ParseCreatureShield(message);
                break;

            case GameServerOpCodes.CreatureUnpass:
                ParseCreatureUnpass(message);
                break;

            case GameServerOpCodes.CreatureMarks:
                ParseCreatureMarks(message);
                break;

            case GameServerOpCodes.PlayerHelpers:
                ParsePlayerHelpers(message);
                break;

            case GameServerOpCodes.CreatureType:
                ParseCreatureType(message);
                break;

            case GameServerOpCodes.PlayerBlessings:
                ParsePlayerBlessings(message);
                break;

            case GameServerOpCodes.PlayerBasicData:
                ParseBasicData(message);
                break;

            case GameServerOpCodes.PlayerStats:
                ParsePlayerStats(message);
                break;

            case GameServerOpCodes.PlayerSkills:
                ParsePlayerSkills(message);
                break;

            case GameServerOpCodes.PlayerStates:
                ParsePlayerStates(message);
                break;

            case GameServerOpCodes.ClearTarget:
                ParseClearTarget(message);
                break;

            case GameServerOpCodes.SetTactics:
                ParseSetTactics(message);
                break;

            case GameServerOpCodes.Talk:
                ParseTalk(message);
                break;

            case GameServerOpCodes.Channels:
                ParseChannels(message);
                break;

            case GameServerOpCodes.OpenChannel:
                ParseOpenChannel(message);
                break;

            case GameServerOpCodes.PrivateChannel:
                ParsePrivateChannel(message);
                break;

            case GameServerOpCodes.OpenOwnChannel:
                ParseOpenOwnChannel(message);
                break;

            case GameServerOpCodes.CloseChannel:
                ParseCloseChannel(message);
                break;

            case GameServerOpCodes.TextMessage:
                ParseTextMessage(message);
                break;

            case GameServerOpCodes.CancelWalk:
                ParseCancelWalk(message);
                break;

            case GameServerOpCodes.TopFloor:
                ParseMapTopFloor(message);
                break;

            case GameServerOpCodes.BottomFloor:
                ParseMapBottomFloor(message);
                break;

            case GameServerOpCodes.TrackedQuestFlags:
                ParseTrackedQuestFlags(message);
                break;

            case GameServerOpCodes.VipAdd:
                ParseVipAdd(message);
                break;

            case GameServerOpCodes.VipState:
                ParseVipState(message);
                break;

            case GameServerOpCodes.VipLogout:
                ParseVipLogout(message);
                break;

            case GameServerOpCodes.PreyFreeListRerollAvailability:
                ParsePreyFreeListRerollAvailability(message);
                break;

            case GameServerOpCodes.PreyTimeLeft:
                ParsePreyTimeLeft(message);
                break;

            case GameServerOpCodes.PreyData:
                ParsePreyData(message);
                break;

            case GameServerOpCodes.PreyRerollPrice:
                ParsePreyRerollPrice(message);
                break;

            case GameServerOpCodes.ResourceBalance:
                ParsePlayerResource(message);
                break;

            case GameServerOpCodes.ChannelEvent:
                ParseChannelEvent(message);
                break;

            case GameServerOpCodes.PlayerInventory:
                ParsePlayerInventory(message);
                break;

            default:
                string err = string.Format("<ProtocolGame> Unknown Opcode received ({0}). Last Opcode ({1}). Prev Opcode ({2})", opcode, m_LastOpcode, m_PrevOpcode);
                m_ChatStorage.AddDebugMessage(err);
                return(false);
            }

            m_PrevOpcode = m_LastOpcode;
            m_LastOpcode = opcode;
            return(true);
        }
Пример #7
0
        private void ParsePlayerStats(InputMessage message)
        {
            int ticks = OpenTibiaUnity.TicksMillis;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GameDoubleHealth))
            {
                uint health    = message.GetU32();
                uint maxHealth = message.GetU32();
                m_Player.SetSkill(SkillTypes.Health, (int)health, (int)maxHealth, 0);
            }
            else
            {
                int health    = message.GetU16();
                int maxHealth = message.GetU16();
                m_Player.SetSkill(SkillTypes.Health, health, maxHealth, 0);
            }

            int freeCapacity;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GameDoubleFreeCapacity))
            {
                freeCapacity = message.GetS32();
            }
            else
            {
                freeCapacity = message.GetS16();
            }

            int totalCapacity = 0;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GameTotalCapacity))
            {
                totalCapacity = message.GetS32();
            }

            m_Player.SetSkill(SkillTypes.Capacity, freeCapacity, totalCapacity, 0);

            long experience;

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GameDoubleExperience))
            {
                experience = message.GetS64();
            }
            else
            {
                experience = message.GetS32();
            }

            m_Player.SetSkill(SkillTypes.Experience, (int)experience, 1, 0);

            ushort level        = message.GetU16();
            byte   levelPercent = message.GetU8();

            m_Player.SetSkill(SkillTypes.Level, level, 1, levelPercent);

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GameExperienceBonus))
            {
                float baseXpGain         = message.GetU16() / 100f;
                float voucherAddend      = message.GetU16() / 100f;
                float grindingAddend     = message.GetU16() / 100f;
                float storeBoostAddend   = message.GetU16() / 100f;
                float huntingBoostFactor = message.GetU16() / 100f;
                m_Player.ExperienceGainInfo.UpdateGainInfo(baseXpGain, voucherAddend, grindingAddend, storeBoostAddend, huntingBoostFactor);
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GameDoubleHealth))
            {
                uint mana    = message.GetU32();
                uint maxMana = message.GetU32();
                m_Player.SetSkill(SkillTypes.Mana, (int)mana, (int)maxMana, 0);
            }
            else
            {
                int mana    = message.GetU16();
                int maxMana = message.GetU16();
                m_Player.SetSkill(SkillTypes.Mana, mana, maxMana, 0);
            }

            byte magicLevel        = message.GetU8();
            byte baseMagicLevel    = OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GameSkillsBase) ? message.GetU8() : magicLevel;
            byte magicLevelPercent = message.GetU8();

            m_Player.SetSkill(SkillTypes.MagLevel, magicLevel, baseMagicLevel, magicLevelPercent);

            int soul = message.GetU8();

            m_Player.SetSkill(SkillTypes.SoulPoints, soul, 1, 0);

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GamePlayerStamina))
            {
                int stamina = ticks + 60000 * message.GetU16();
                m_Player.SetSkill(SkillTypes.Stamina, stamina, ticks, 0);
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GameSkillsBase))
            {
                ushort baseSpeed = message.GetU16();
                m_Player.SetSkill(SkillTypes.Speed, m_Player.GetSkillValue(SkillTypes.Speed), baseSpeed, 0);
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GamePlayerRegenerationTime))
            {
                int regeneration = ticks + 60000 * message.GetU16();
                m_Player.SetSkill(SkillTypes.Food, regeneration, ticks, 0);
            }

            if (OpenTibiaUnity.GameManager.GetFeature(GameFeatures.GameOfflineTrainingTime))
            {
                int training = ticks + 60000 * message.GetU16();
                m_Player.SetSkill(SkillTypes.OfflineTraining, training, ticks, 0);

                if (OpenTibiaUnity.GameManager.ClientVersion >= 1097)
                {
                    uint remainingSeconds   = message.GetU16();
                    bool canBuyMoreXpBoosts = message.GetBool();
                    m_Player.ExperienceGainInfo.UpdateStoreXpBoost(remainingSeconds, canBuyMoreXpBoosts);
                }
            }
        }