private void ParseStoreButtonIndicators(Internal.ByteArray message) { message.ReadBoolean(); // sale on items? message.ReadBoolean(); // new items on store? // TODO }
private void ParseLoginWait(Internal.ByteArray message) { string waitMessage = message.ReadString(); int waitTime = message.ReadUnsignedByte(); onLoginWait.Invoke(waitMessage, waitTime); }
private void ParseMarketEnter(Internal.ByteArray message) { ulong balance; if (OpenTibiaUnity.GameManager.ClientVersion >= 981) { balance = message.ReadUnsignedLong(); } else { balance = message.ReadUnsignedInt(); } int vocation = -1; if (OpenTibiaUnity.GameManager.ClientVersion < 950) { vocation = message.ReadUnsignedByte(); } int offers = message.ReadUnsignedByte(); int depotCount = message.ReadUnsignedByte(); for (int i = 0; i < depotCount; i++) { message.ReadUnsignedShort(); // objectId message.ReadUnsignedShort(); // objectCount } }
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 ParseDeleteInContainer(Internal.ByteArray message) { byte containerId = message.ReadUnsignedByte(); ushort slot; Appearances.ObjectInstance appendObject = null; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameContainerPagination)) { slot = message.ReadUnsignedShort(); ushort itemId = message.ReadUnsignedShort(); if (itemId != 0) { appendObject = ReadObjectInstance(message, itemId); } } else { slot = message.ReadUnsignedByte(); } var containerView = ContainerStorage.GetContainerView(containerId); if (!!containerView) { containerView.RemoveObject(slot, appendObject); } }
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 ParseCreatureMarks(Internal.ByteArray message) { int length; if (OpenTibiaUnity.GameManager.ClientVersion >= 1035) { length = 1; } else { length = message.ReadUnsignedByte(); } for (int i = 0; i < length; i++) { uint creatureId = message.ReadUnsignedInt(); bool permenant = message.ReadUnsignedByte() != 1; byte mark = message.ReadUnsignedByte(); var creature = CreatureStorage.GetCreature(creatureId); if (!!creature) { creature.Marks.SetMark(permenant ? MarkType.Permenant : MarkType.OneSecondTemp, mark); CreatureStorage.InvalidateOpponents(); } else { throw new System.Exception("ProtocolGame.ParseCreatureMarks: Unknown creature id: " + creatureId); } } }
private void ParseCancelWalk(Internal.ByteArray message) { int direction = message.ReadUnsignedByte(); var absolutePosition = Player.Position; if (absolutePosition == _lastSnapback) { _snapbackCount++; } else { _snapbackCount = 0; } _lastSnapback.Set(absolutePosition.x, absolutePosition.y, absolutePosition.z); if (_snapbackCount >= 16) { Player.StopAutowalk(true); CreatureStorage.SetAttackTarget(null, false); SendCancel(); _snapbackCount = 0; } Player.AbortAutowalk((Direction)direction); }
private void ParseOpenOwnChannel(Internal.ByteArray message) { int channelId = message.ReadUnsignedShort(); string channelName = message.ReadString(); var channel = ChatStorage.AddChannel(channelId, channelName, MessageModeType.Channel); channel.CanModerate = true; if (channel.IsPrivate) { ChatStorage.OwnPrivateChannelId = channelId; } if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameChannelPlayerList)) { int joinedUsers = message.ReadUnsignedShort(); for (int i = 0; i < joinedUsers; i++) { channel.PlayerJoined(message.ReadString()); } int invitedUsers = message.ReadUnsignedShort(); for (int i = 0; i < invitedUsers; i++) { channel.PlayerInvited(message.ReadString()); } } }
public static uint CalculateAdler32Checksum(Internal.ByteArray byteArray, int offset = 0, int length = 0) { if (byteArray == null) { throw new ArgumentNullException("Adler32Checksum.CalculateAdler32Checksum: Invalid input."); } if (offset >= byteArray.Length) { throw new ArgumentOutOfRangeException("Adler32Checksum.CalculateAdler32Checksum: Invalid offset."); } uint a = 1; uint b = 0; int i = 0; byteArray.Position = offset; while (byteArray.BytesAvailable > 0 && (length == 0 || i < length)) { a = (a + byteArray.ReadUnsignedByte()) % ModAdler; b = (b + a) % ModAdler; i++; } a &= 65535; b &= 65535; return((b << 16) | a); }
private void SendProxyWorldNameIdentification() { var message = new Internal.ByteArray(); message.WriteString(WorldName + "\n", 0, true); _connection.Send(message); }
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 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 ParseGmActions(Internal.ByteArray message) { int numViolationReasons = 20; var clientVersion = OpenTibiaUnity.GameManager.ClientVersion; if (clientVersion >= 850) { numViolationReasons = 20; } else if (clientVersion >= 840) { numViolationReasons = 23; } else { numViolationReasons = 32; } List <byte> actions = new List <byte>(); for (int i = 0; i < numViolationReasons; i++) { actions.Add(message.ReadUnsignedByte()); } }
private void ParseClientCheck(Internal.ByteArray message) { // TODO uint something = message.ReadUnsignedInt(); message.Skip((int)something); }
public void WriteKey(Internal.ByteArray message) { message.WriteUnsignedInt(_key[0]); message.WriteUnsignedInt(_key[1]); message.WriteUnsignedInt(_key[2]); message.WriteUnsignedInt(_key[3]); }
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; } }
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 ParseSetInventory(Internal.ByteArray message) { var slot = message.ReadEnum <ClothSlots>(); var @object = ReadObjectInstance(message); OpenTibiaUnity.ContainerStorage.BodyContainerView.SetObject(slot, @object); }
private void ParseResourceBalance(Internal.ByteArray message) { byte type = message.ReadUnsignedByte(); ulong balance = message.ReadUnsignedLong(); switch (type) { case (int)ResourceTypes.BankGold: //_player.BankGold = balance; break; case (int)ResourceTypes.InventoryGold: //_player.InventoryGold = balance; break; case (int)ResourceTypes.PreyBonusRerolls: if (!OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePrey)) { throw new System.Exception("ProtocolGame.ParseResourceBalance: Invalid resource type: " + type + "."); } //PreyManager.Insance.BonusRerollAmount = balance; break; case (int)ResourceTypes.CollectionTokens: if (!OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameRewardWall)) { throw new System.Exception("ProtocolGame.ParseResourceBalance: Invalid resource type: " + type + "."); } break; default: throw new System.Exception("ProtocolGame.ParseResourceBalance: Invalid resource type: " + type + "."); } }
private int ReadFloor(Internal.ByteArray message, int z, int skip) { for (int x = 0; x <= Constants.MapSizeX - 1; x++) { for (int y = 0; y <= Constants.MapSizeY - 1; y++) { if (skip > 0) { skip--; } else { skip = ReadField(message, x, y, z); } UnityEngine.Vector3Int mapPosition = new UnityEngine.Vector3Int(x, y, z); UnityEngine.Vector3Int absolutePosition = WorldMapStorage.ToAbsolute(mapPosition); if (absolutePosition.z == MiniMapStorage.PositionZ) { WorldMapStorage.UpdateMiniMap(mapPosition); uint color = WorldMapStorage.GetMiniMapColour(mapPosition); int cost = WorldMapStorage.GetMiniMapCost(mapPosition); MiniMapStorage.UpdateField(absolutePosition, color, cost, false); } } } return(skip); }
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 } }
private void ParseTextEffect(Internal.ByteArray message) { var position = message.ReadPosition(); int color = message.ReadUnsignedByte(); string text = message.ReadString(); WorldMapStorage.AddTextualEffect(position, color, text); }
private void ParseChallange(Internal.ByteArray message) { uint timestamp = message.ReadUnsignedInt(); byte challange = message.ReadUnsignedByte(); SendLogin(timestamp, challange); SetConnectionState(ConnectionState.ConnectingStage2, false); }
private void ParsePreyPrices(Internal.ByteArray message) { message.ReadUnsignedInt(); // rerollPrice in gold if (OpenTibiaUnity.GameManager.ClientVersion >= 1190) { message.ReadUnsignedByte(); // unknown message.ReadUnsignedByte(); // selectCreatureDirectly in preyWildCards } }
private void ParseCreateOnMap(Internal.ByteArray message) { var absolutePosition = message.ReadPosition(); if (!WorldMapStorage.IsVisible(absolutePosition, true)) { throw new System.Exception("ProtocolGame.ParseCreateOnMap: Co-ordinate " + absolutePosition + " is out of range."); } var mapPosition = WorldMapStorage.ToMap(absolutePosition); int stackPos = 255; if (OpenTibiaUnity.GameManager.ClientVersion >= 841) { stackPos = message.ReadUnsignedByte(); } int typeOrId = message.ReadUnsignedShort(); Appearances.ObjectInstance @object; if (typeOrId == Appearances.AppearanceInstance.Creature || typeOrId == Appearances.AppearanceInstance.OutdatedCreature || typeOrId == Appearances.AppearanceInstance.UnknownCreature) { var creature = ReadCreatureInstance(message, typeOrId, absolutePosition); if (creature.Id == Player.Id) { Player.StopAutowalk(true); } @object = AppearanceStorage.CreateObjectInstance(Appearances.AppearanceInstance.Creature, creature.Id); } else { @object = ReadObjectInstance(message, typeOrId); } if (stackPos == 255) { WorldMapStorage.PutObject(mapPosition, @object); } else { if (stackPos > Constants.MapSizeW) { throw new System.Exception("ProtocolGame.ParseCreateOnMap: Invalid stack position (" + stackPos + ")."); } WorldMapStorage.InsertObject(mapPosition, stackPos, @object); } if (absolutePosition.z == MiniMapStorage.PositionZ) { WorldMapStorage.UpdateMiniMap(mapPosition); uint color = WorldMapStorage.GetMiniMapColour(mapPosition); int cost = WorldMapStorage.GetMiniMapCost(mapPosition); MiniMapStorage.UpdateField(absolutePosition, color, cost, false); } }
private void ParseAmbientLight(Internal.ByteArray message) { int intensity = message.ReadUnsignedByte(); int rawColor = message.ReadUnsignedByte(); var color = Colors.ColorFrom8Bit(rawColor); WorldMapStorage.SetAmbientLight(color, intensity); }
private void ParseMarketStatistics(Internal.ByteArray message) { int count = message.ReadUnsignedShort(); for (int i = 0; i < count; i++) { ushort objectId = message.ReadUnsignedShort(); uint objectPrice = message.ReadUnsignedInt(); } }
private void ParseUnjustifiedPoints(Internal.ByteArray message) { message.ReadUnsignedByte(); // dailyProgress message.ReadUnsignedByte(); // dailyRemaining message.ReadUnsignedByte(); // weeklyProgress message.ReadUnsignedByte(); // weeklyRemaining message.ReadUnsignedByte(); // monthlyProgress message.ReadUnsignedByte(); // monthlyRemaining message.ReadUnsignedByte(); // skullDuration }
private void ParsePremiumTrigger(Internal.ByteArray message) { int triggers = message.ReadUnsignedByte(); for (int i = 0; i < triggers; i++) { message.ReadUnsignedByte(); // trigger // TODO } }