private void ParseBasicData(Internal.ByteArray message) { bool premium = message.ReadBoolean(); if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePremiumExpiration)) { uint premiumExpiration = message.ReadUnsignedInt(); } byte vocation = message.ReadUnsignedByte(); if (OpenTibiaUnity.GameManager.ClientVersion >= 1100) { bool hasReachedMain = message.ReadBoolean(); } List <byte> spells = new List <byte>(); ushort spellsCount = message.ReadUnsignedShort(); for (int i = 0; i < spellsCount; i++) { spells.Add(message.ReadUnsignedByte()); } if (Player) { //_player.PremiumStatus = premium; //_player.PremiumExpiration = premiumExpiration; //_player.Vocation = vocation; //_player.ReachedMain = hasReachedMain; } }
private void ParseStoreButtonIndicators(Internal.ByteArray message) { message.ReadBoolean(); // sale on items? message.ReadBoolean(); // new items on store? // TODO }
private void ParseOpenContainer(Internal.ByteArray message) { byte containerId = message.ReadUnsignedByte(); var objectIcon = ReadObjectInstance(message); string name = message.ReadString(); byte nOfSlotsPerPage = message.ReadUnsignedByte(); // capacity of shown view bool isSubContainer = message.ReadBoolean(); bool isDragAndDropEnabled = true; bool isPaginationEnabled = false; int nOfTotalObjects = 0; int indexOfFirstObject = 0; int nOfContentObjects = 0; // objects in the current shown view // if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameContainerPagination)) { isDragAndDropEnabled = message.ReadBoolean(); isPaginationEnabled = message.ReadBoolean(); nOfTotalObjects = message.ReadUnsignedShort(); indexOfFirstObject = message.ReadUnsignedShort(); nOfContentObjects = message.ReadUnsignedByte(); if (nOfContentObjects > nOfSlotsPerPage) { throw new System.Exception("ProtocolGame.ParseOpenContainer: Number of content objects " + nOfContentObjects + " exceeds number of slots per page " + nOfSlotsPerPage); } if (nOfContentObjects > nOfTotalObjects) { throw new System.Exception("Connection.readSCONTAINER: Number of content objects " + nOfContentObjects + " exceeds number of total objects " + nOfTotalObjects); } } else { nOfContentObjects = message.ReadUnsignedByte(); nOfTotalObjects = nOfContentObjects; if (nOfContentObjects > nOfSlotsPerPage) { throw new System.Exception("ProtocolGame.ParseOpenContainer: Number of content objects " + nOfContentObjects + " exceeds the capaciy " + nOfSlotsPerPage); } } var containerView = ContainerStorage.CreateContainerView(containerId, objectIcon, name, isSubContainer, isDragAndDropEnabled, isPaginationEnabled, nOfSlotsPerPage, nOfTotalObjects - nOfContentObjects, indexOfFirstObject); for (int i = 0; i < nOfContentObjects; i++) { containerView.AddObject(indexOfFirstObject + i, ReadObjectInstance(message)); } }
private void ParseDeath(Internal.ByteArray message) { var deathType = DeathType.DeathTypeRegular; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameDeathType)) { deathType = (DeathType)message.ReadUnsignedByte(); } int penalty = 100; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePenalityOnDeath) && deathType == DeathType.DeathTypeRegular) { penalty = message.ReadUnsignedByte(); } bool useDeathRedemption = false; if (OpenTibiaUnity.GameManager.ClientVersion >= 1120) { useDeathRedemption = message.ReadBoolean(); } // TODO death actions... //LocalPlayer.OnDeath(deathType, penalty); }
private void ParseBuddyAdd(Internal.ByteArray message) { uint creatureID = message.ReadUnsignedInt(); string name = message.ReadString(); string desc = string.Empty; uint icon = 0; bool notifyLogin = false; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameAdditionalVipInfo)) { desc = message.ReadString(); icon = message.ReadUnsignedInt(); notifyLogin = message.ReadBoolean(); } byte status = message.ReadUnsignedByte(); List <byte> groups; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameBuddyGroups)) { int count = message.ReadUnsignedByte(); groups = new List <byte>(count); for (int i = 0; i < count; i++) { groups.Add(message.ReadUnsignedByte()); } } }
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(); } } }
private void ParseLoginSuccess(Internal.ByteArray message) { Player.ID = message.ReadUnsignedInt(); #if !UNITY_EDITOR string title = string.Format("{0} - {1}", Application.productName, Player.Name); OpenTibiaUnity.GameManager.SetApplicationTitle(title); #endif BeatDuration = message.ReadUnsignedShort(); if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameNewSpeedLaw)) { Creatures.Creature.SpeedA = message.ReadDouble(); Creatures.Creature.SpeedB = message.ReadDouble(); Creatures.Creature.SpeedC = message.ReadDouble(); } BugReportsAllowed = message.ReadBoolean(); if (OpenTibiaUnity.GameManager.ClientVersion >= 1054) { bool canChangePvPFrameRate = message.ReadBoolean(); } if (OpenTibiaUnity.GameManager.ClientVersion >= 1058) { bool exportPvPEnabled = message.ReadBoolean(); } if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameIngameStore)) { string storeLink = message.ReadString(); ushort storePackageSize = message.ReadUnsignedShort(); } if (OpenTibiaUnity.GameManager.ClientVersion >= 1149 && OpenTibiaUnity.GameManager.BuildVersion >= 6018) { bool exivaRestrictions = message.ReadBoolean(); } if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameTournament)) { bool tournamentActivated = message.ReadBoolean(); } }
private void ParseAutomapFlag(Internal.ByteArray message) { var absolutePosition = message.ReadPosition(); int icon = message.ReadUnsignedByte(); var description = message.ReadString(); bool remove = false; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameMinimapRemove)) { remove = message.ReadBoolean(); } }
private void ParseOpenRewardWall(Internal.ByteArray message) { message.ReadBoolean(); // openedFromShrine message.ReadUnsignedInt(); // timestamp for the player to be able to take the reward (0 = able) message.ReadUnsignedByte(); // currentRewardIndex bool showWarningWhenCollecting = message.ReadUnsignedByte() != 0; // showWarningWhenCollecting if (showWarningWhenCollecting) { message.ReadString(); // warningMessage } message.ReadUnsignedInt(); // timestamp for the streak to expire (0 = won't expire until server save) message.ReadUnsignedShort(); // current streak message.ReadUnsignedShort(); // unknown }
private void ParseCreatureUnpass(Internal.ByteArray message) { uint creatureId = message.ReadUnsignedInt(); bool unpass = message.ReadBoolean(); var creature = CreatureStorage.GetCreature(creatureId); if (!!creature) { creature.Unpassable = unpass; } else { throw new System.Exception("ProtocolGame.ParseCreatureUnpass: Unknown creature id: " + creatureId); } }
private void ParseRestingAreaState(Internal.ByteArray message) { message.ReadBoolean(); // unknown message.ReadBoolean(); // unknown message.ReadString(); }
private void ParseDepotTileState(Internal.ByteArray message) { Player.IsInDepot = message.ReadBoolean(); }
private void ParseOutfitDialog(Internal.ByteArray message) { var outfit = ReadCreatureOutfit(message); Appearances.AppearanceInstance mountOutfit = null; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerMounts)) { mountOutfit = ReadMountOutfit(message); } var outfitList = new List <ProtocolOutfit>(); if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameNewOutfitProtocol)) { int count; if (OpenTibiaUnity.GameManager.ClientVersion >= 1185) { count = message.ReadUnsignedShort(); } else { count = message.ReadUnsignedByte(); } for (int i = 0; i < count; i++) { ushort outfitId = message.ReadUnsignedShort(); var outfitName = message.ReadString(); int addOns = message.ReadUnsignedByte(); bool locked = true; uint offerId = 0; if (OpenTibiaUnity.GameManager.ClientVersion >= 1185) { locked = message.ReadBoolean(); if (locked) { offerId = message.ReadUnsignedInt(); } } outfitList.Add(new ProtocolOutfit() { _id = outfitId, Name = outfitName, AddOns = addOns, Locked = locked, StoreOfferId = offerId, }); } } else { ushort outfitStart, outfitEnd; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameOutfitIdU16)) { outfitStart = message.ReadUnsignedShort(); outfitEnd = message.ReadUnsignedShort(); } else { outfitStart = message.ReadUnsignedByte(); outfitEnd = message.ReadUnsignedByte(); } for (ushort i = outfitStart; i <= outfitEnd; i++) { outfitList.Add(new ProtocolOutfit() { _id = i }); } } List <ProtocolMount> mountList = null; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerMounts)) { mountList = new List <ProtocolMount>(); int count; if (OpenTibiaUnity.GameManager.ClientVersion >= 1185) { count = message.ReadUnsignedShort(); } else { count = message.ReadUnsignedByte(); } for (int i = 0; i < count; i++) { ushort mountId = message.ReadUnsignedShort(); var mountName = message.ReadString(); bool locked = true; uint offerId = 0; if (OpenTibiaUnity.GameManager.ClientVersion >= 1185) { locked = message.ReadBoolean(); if (locked) { offerId = message.ReadUnsignedInt(); } } mountList.Add(new ProtocolMount() { _id = mountId, Name = mountName, Locked = locked, StoreOfferId = offerId, }); } } if (OpenTibiaUnity.GameManager.ClientVersion >= 1185) { bool tryOutfit = message.ReadBoolean(); bool mounted = message.ReadBoolean(); } OpenTibiaUnity.GameManager.onRequestOutfitDialog.Invoke(outfit, mountOutfit, outfitList, mountList); }
private void ParsePlayerStats(Internal.ByteArray message) { int ticks = OpenTibiaUnity.TicksMillis; int health, maxHealth; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameDoubleHealth)) { health = message.ReadInt(); maxHealth = message.ReadInt(); } else { health = message.ReadUnsignedShort(); maxHealth = message.ReadUnsignedShort(); } Player.SetSkill(SkillType.Health, health, maxHealth, 0); int freeCapacity; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameDoubleFreeCapacity)) { freeCapacity = message.ReadInt(); } else { freeCapacity = message.ReadShort(); } Player.FreeCapacity = freeCapacity; int totalCapacity = 0; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameTotalCapacity)) { totalCapacity = message.ReadInt(); } Player.SetSkill(SkillType.Capacity, freeCapacity, totalCapacity, 0); long experience; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameDoubleExperience)) { experience = message.ReadLong(); } else { experience = message.ReadInt(); } Player.SetSkill(SkillType.Experience, experience, 1, 0); ushort level = message.ReadUnsignedShort(); byte levelPercent = message.ReadUnsignedByte(); Player.SetSkill(SkillType.Level, level, 1, levelPercent); if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameExperienceGain)) { float baseXpGain = message.ReadUnsignedShort() / 100f; float voucherAddend = 0; if (OpenTibiaUnity.GameManager.ClientVersion < 1150) { voucherAddend = message.ReadUnsignedShort() / 100f; } float grindingAddend = message.ReadUnsignedShort() / 100f; float storeBoostAddend = message.ReadUnsignedShort() / 100f; float huntingBoostFactor = message.ReadUnsignedShort() / 100f; Player.ExperienceGainInfo.UpdateGainInfo(baseXpGain, voucherAddend, grindingAddend, storeBoostAddend, huntingBoostFactor); } else if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameExperienceBonus)) { double experienceBonus = message.ReadDouble(); Player.ExperienceBonus = experienceBonus; } int mana, maxMana; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameDoubleHealth)) { mana = message.ReadInt(); maxMana = message.ReadInt(); } else { mana = message.ReadUnsignedShort(); maxMana = message.ReadUnsignedShort(); } Player.SetSkill(SkillType.Mana, mana, maxMana, 0); if (OpenTibiaUnity.GameManager.ClientVersion < 1200) { byte magicLevel = message.ReadUnsignedByte(); byte baseMagicLevel = OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameSkillsBase) ? message.ReadUnsignedByte() : magicLevel; byte magicLevelPercent = message.ReadUnsignedByte(); Player.SetSkill(SkillType.MagLevel, magicLevel, baseMagicLevel, magicLevelPercent); } int soul = message.ReadUnsignedByte(); Player.SetSkill(SkillType.SoulPoints, soul, 1, 0); if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerStamina)) { int stamina = ticks + 60000 * message.ReadUnsignedShort(); Player.SetSkill(SkillType.Stamina, stamina, ticks, 0); } if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameSkillsBase)) { ushort baseSpeed = message.ReadUnsignedShort(); Player.SetSkill(SkillType.Speed, Player.GetSkillValue(SkillType.Speed), baseSpeed, 0); } if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerRegenerationTime)) { int regeneration = ticks + 1000 * message.ReadUnsignedShort(); Player.SetSkill(SkillType.Food, regeneration, ticks, 0); } if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameOfflineTrainingTime)) { int training = ticks + 60000 * message.ReadUnsignedShort(); Player.SetSkill(SkillType.OfflineTraining, training, ticks, 0); if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameExperienceGain)) { uint remainingSeconds = message.ReadUnsignedShort(); bool canBuyMoreXpBoosts = message.ReadBoolean(); Player.ExperienceGainInfo.UpdateStoreXpBoost(remainingSeconds, canBuyMoreXpBoosts); } } }
public void Parse(Internal.ByteArray message) { if (OpenTibiaUnity.GameManager.ClientVersion >= 1010) { byte worlds = message.ReadUnsignedByte(); for (int i = 0; i < worlds; i++) { var world = new World { _id = message.ReadUnsignedByte(), Name = message.ReadString(), HostName = message.ReadString(), Port = message.ReadUnsignedShort(), Preview = message.ReadBoolean() }; Worlds.Add(world); } byte characters = message.ReadUnsignedByte(); for (int i = 0; i < characters; i++) { Character character = new Character { WorldId = message.ReadUnsignedByte(), Name = message.ReadString() }; Characters.Add(character); } } else { byte characters = message.ReadUnsignedByte(); for (int i = 0; i < characters; i++) { var characterName = message.ReadString(); var worldName = message.ReadString(); var worldIpLong = message.ReadUnsignedInt(); var worldPort = message.ReadUnsignedShort(); var world = GetOrCreateWorld(worldName, worldIpLong, worldPort); var character = new Character { Name = characterName, WorldId = world._id }; Characters.Add(character); } } uint now = (uint)System.DateTime.Now.Second; if (OpenTibiaUnity.GameManager.ClientVersion >= 1077) { AccountState = message.ReadUnsignedByte(); IsPremium = message.ReadBoolean(); PremiumTimeStamp = message.ReadUnsignedInt(); if (PremiumTimeStamp > now) { PremiumDays = (ushort)((PremiumTimeStamp - now) / 86400U); } else { PremiumDays = 0; } InfinitePremium = (IsPremium && PremiumTimeStamp == 0); } else { AccountState = 0; PremiumDays = message.ReadUnsignedShort(); if (PremiumDays > 0) { PremiumTimeStamp = now + PremiumDays * 86400U; } else { PremiumTimeStamp = 0; } IsPremium = PremiumDays > 0; InfinitePremium = PremiumDays == 65535; } }