private void ParsePlayerSkills(Internal.ByteArray message) { // magic level is being parsed if (OpenTibiaUnity.GameManager.ClientVersion >= 1200) { var skillStruct = ReadSkill(message); Player.SetSkill(SkillType.MagLevel, skillStruct.Level, skillStruct.BaseLevel, skillStruct.Percentage); } var skills = new SkillType[] { SkillType.Fist, SkillType.Club, SkillType.Sword, SkillType.Axe, SkillType.Distance, SkillType.Shield, SkillType.Fishing }; foreach (var skill in skills) { var skillStruct = ReadSkill(message); Player.SetSkill(skill, skillStruct.Level, skillStruct.BaseLevel, skillStruct.Percentage); } if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameAdditionalSkills)) { SkillType[] specialSkills = new SkillType[] { SkillType.CriticalHitChance, SkillType.CriticalHitDamage, SkillType.LifeLeechChance, SkillType.LifeLeechAmount, SkillType.ManaLeechChance, SkillType.ManaLeechAmount }; foreach (var skill in specialSkills) { var skillStruct = ReadSkill(message, true); Player.SetSkill(skill, skillStruct.Level, skillStruct.BaseLevel); } } // todo: find if this is capacity if (OpenTibiaUnity.GameManager.ClientVersion >= 1150) { int totalCapacity = message.ReadInt(); int baseCapacity = message.ReadInt(); Player.SetSkill(SkillType.Capacity, totalCapacity, baseCapacity); } }
private void ParsePlayerGoods(Internal.ByteArray message) { long money; if (OpenTibiaUnity.GameManager.ClientVersion >= 973) { money = message.ReadLong(); } else { money = message.ReadInt(); } var goods = new List <Container.InventoryTypeInfo>(); int size = message.ReadUnsignedByte(); for (int i = 0; i < size; i++) { ushort objectId = message.ReadUnsignedShort(); int amount = message.ReadUnsignedByte(); goods.Add(new Container.InventoryTypeInfo(objectId, 0, amount)); } OpenTibiaUnity.ContainerStorage.PlayerGoods = goods; OpenTibiaUnity.ContainerStorage.PlayerMoney = money; }
private void ParseTextMessage(Internal.ByteArray message) { var mode = TranslateMessageModeFromServer(message.ReadUnsignedByte()); try { switch (mode) { case MessageModeType.ChannelManagement: int channelId = message.ReadUnsignedShort(); string text = message.ReadString(); // TODO name filter //var regex = new System.Text.RegularExpressions.Regex(@"^(.+?) invites you to |^You have been excluded from the channel ([^']+)'s Channel\.$"); //var match = regex.Match(text); //string speaker = match != null && match.Success ? match.Value : null; WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text); ChatStorage.AddChannelMessage(channelId, -1, null, 0, mode, text); break; case MessageModeType.Guild: case MessageModeType.PartyManagement: case MessageModeType.Party: channelId = message.ReadUnsignedShort(); text = message.ReadString(); WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text); ChatStorage.AddChannelMessage(channelId, -1, null, 0, mode, text); break; case MessageModeType.Login: case MessageModeType.Admin: case MessageModeType.Game: case MessageModeType.GameHighlight: case MessageModeType.Failure: case MessageModeType.Look: case MessageModeType.Status: case MessageModeType.Loot: case MessageModeType.TradeNpc: case MessageModeType.HotkeyUse: channelId = -1; text = message.ReadString(); WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text); ChatStorage.AddChannelMessage(channelId, -1, null, 0, mode, text); break; case MessageModeType.Market: text = message.ReadString(); // TODO: market break; case MessageModeType.Report: // TODO //ReportWidget.s_ReportTimestampReset(); text = message.ReadString(); WorldMapStorage.AddOnscreenMessage(null, -1, null, 0, mode, text); ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text); break; case MessageModeType.DamageDealed: case MessageModeType.DamageReceived: case MessageModeType.DamageOthers: Vector3Int absolutePosition = message.ReadPosition(); int value = message.ReadInt(); int color = message.ReadUnsignedByte(); if (value > 0) { WorldMapStorage.AddOnscreenMessage(absolutePosition, -1, null, 0, mode, value, color); } value = message.ReadInt(); color = message.ReadUnsignedByte(); if (value > 0) { WorldMapStorage.AddOnscreenMessage(absolutePosition, -1, null, 0, mode, value, color); } text = message.ReadString(); ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text); break; case MessageModeType.Heal: case MessageModeType.Mana: case MessageModeType.Exp: case MessageModeType.HealOthers: case MessageModeType.ExpOthers: absolutePosition = message.ReadPosition(); value = message.ReadInt(); color = message.ReadUnsignedByte(); WorldMapStorage.AddOnscreenMessage(absolutePosition, -1, null, 0, mode, value, color); text = message.ReadString(); ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text); break; default: text = message.ReadString(); ChatStorage.AddChannelMessage(-1, -1, null, 0, mode, text); break; } } catch (System.Exception e) { throw new System.Exception("ProtocolGame.ParseTextMessage: Failed to add message of type " + mode + ": " + e.Message + "\n" + e.StackTrace); } }
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); } } }