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 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()); } } }
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 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 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 ParsePlayerInventory(Internal.ByteArray message) { //List<KeyValuePair<ushort, ushort>> items = new List<KeyValuePair<ushort, ushort>>(); ushort size = message.ReadUnsignedShort(); for (int i = 0; i < size; i++) { ushort id = message.ReadUnsignedShort(); byte subType = message.ReadUnsignedByte(); ushort count = message.ReadUnsignedShort(); } }
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 Creatures.Skill ReadSkill(Internal.ByteArray message, bool special = false) { int level; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameDoubleSkills)) { level = message.ReadUnsignedShort(); } else { level = message.ReadUnsignedByte(); } int baseLevel; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameSkillsBase)) { if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameBaseSkillU16)) { baseLevel = message.ReadUnsignedShort(); } else { baseLevel = message.ReadUnsignedByte(); } } else { baseLevel = level; } if (!special && OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePercentSkillU16)) { ushort loyaltyBonus = message.ReadUnsignedShort(); } float percentage = 0.0f; if (!special) { if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePercentSkillU16)) { percentage = message.ReadUnsignedShort() / 100f; } else { percentage = message.ReadUnsignedByte(); } } return(new Creatures.Skill(level, baseLevel, percentage)); }
private void ParseMarketDetail(Internal.ByteArray message) { ushort objectId = message.ReadUnsignedShort(); var last = MarketDetails.Weight; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameImbuing)) { last = MarketDetails.ImbuementSlots; } Dictionary <MarketDetails, string> details = new Dictionary <MarketDetails, string>(); for (var i = MarketDetails.First; i <= last; i++) { int strLen = message.ReadUnsignedShort(); if (strLen == 0) { continue; } details.Add(i, message.ReadString(strLen)); } int time = DateTime.Now.Second / 1000 * Constants.SecondsPerDay; int ctime = time; int count = message.ReadUnsignedByte(); for (int i = 0; i < count; i++) { uint transactions = message.ReadUnsignedInt(); uint totalPrice = message.ReadUnsignedInt(); uint maximumPrice = message.ReadUnsignedInt(); uint minimumPrice = message.ReadUnsignedInt(); ctime -= Constants.SecondsPerDay; } ctime = time; count = message.ReadUnsignedByte(); for (int i = 0; i < count; i++) { uint transactions = message.ReadUnsignedInt(); uint totalPrice = message.ReadUnsignedInt(); uint maximumPrice = message.ReadUnsignedInt(); uint minimumPrice = message.ReadUnsignedInt(); ctime -= Constants.SecondsPerDay; } }
private AppearanceInstance ReadCreatureOutfit(Internal.ByteArray message, AppearanceInstance instance = null) { int outfitID; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameOutfitIDU16)) { outfitID = message.ReadUnsignedShort(); } else { outfitID = message.ReadUnsignedByte(); } if (outfitID != 0) { int headColor = message.ReadUnsignedByte(); int torsoColor = message.ReadUnsignedByte(); int legsColor = message.ReadUnsignedByte(); int detailColor = message.ReadUnsignedByte(); int addonsFlags = 0; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerAddons)) { addonsFlags = message.ReadUnsignedByte(); } OutfitInstance outfitInstance = instance as OutfitInstance; if (!!outfitInstance) { outfitInstance.UpdateProperties(headColor, torsoColor, legsColor, detailColor, addonsFlags); return(instance); } return(AppearanceStorage.CreateOutfitInstance((uint)outfitID, headColor, torsoColor, legsColor, detailColor, addonsFlags)); } uint objectID = message.ReadUnsignedShort(); ObjectInstance objectInstance = instance as ObjectInstance; if (!!objectInstance && objectInstance.ID == objectID) { return(objectInstance); } if (objectID == 0) { return(AppearanceStorage.CreateOutfitInstance(OutfitInstance.InvisibleOutfitID, 0, 0, 0, 0, 0)); } return(AppearanceStorage.CreateObjectInstance(objectID, 0)); }
private void ParseNPCOffer(Internal.ByteArray message) { // todo, i believe tibia added extra data to detect currency string npcName = null; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameNameOnNpcTrade)) { npcName = message.ReadString(); } var buyObjects = new List <Trade.TradeObjectRef>(); var sellObjects = new List <Trade.TradeObjectRef>(); int listCount; if (OpenTibiaUnity.GameManager.ClientVersion >= 900) { listCount = message.ReadUnsignedShort(); } else { listCount = message.ReadUnsignedByte(); } for (int i = 0; i < listCount; i++) { ushort objectID = message.ReadUnsignedShort(); ushort objectData = message.ReadUnsignedByte(); string name = message.ReadString(); uint weight = message.ReadUnsignedInt(); uint buyPrice = message.ReadUnsignedInt(); uint sellPrice = message.ReadUnsignedInt(); if (buyPrice > 0) { buyObjects.Add(new Trade.TradeObjectRef(objectID, objectData, name, buyPrice, weight)); } if (sellPrice > 0) { sellObjects.Add(new Trade.TradeObjectRef(objectID, objectData, name, sellPrice, weight)); } } OpenTibiaUnity.GameManager.onRequestNPCTrade.Invoke(npcName, buyObjects, sellObjects); }
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 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 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 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 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 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 int ReadField(Internal.ByteArray message, int x, int y, int z) { var mapPosition = new UnityEngine.Vector3Int(x, y, z); var absolutePosition = WorldMapStorage.ToAbsolute(mapPosition); int typeOrId; int stackPos = 0; bool gotEffect = false; while (true) { typeOrId = message.ReadUnsignedShort(); if (typeOrId >= 65280) { break; } if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameEnvironmentEffect) && !gotEffect) { var effectObject = AppearanceStorage.CreateEnvironmentalEffect((uint)typeOrId); WorldMapStorage.SetEnvironmentalEffect(mapPosition, effectObject); gotEffect = true; continue; } if (typeOrId == AppearanceInstance.UnknownCreature || typeOrId == AppearanceInstance.OutdatedCreature || typeOrId == AppearanceInstance.Creature) { var creature = ReadCreatureInstance(message, typeOrId, absolutePosition); var @object = AppearanceStorage.CreateObjectInstance(AppearanceInstance.Creature, creature.ID); if (stackPos < Constants.MapSizeW) { WorldMapStorage.AppendObject(mapPosition, @object); } } else { var @object = ReadObjectInstance(message, typeOrId); if (stackPos < Constants.MapSizeW) { WorldMapStorage.AppendObject(mapPosition, @object); } else { throw new System.Exception("ProtocolGameUtility.ReadField: Expected creatures but received regular object."); } } stackPos++; } return(typeOrId - 65280); }
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(); } }
private Market.Offer ReadMarketOffer(Internal.ByteArray message, MarketOfferTypes offerType, ushort var) { uint timestamp = message.ReadUnsignedInt(); ushort counter = message.ReadUnsignedShort(); ushort objectId; switch (var) { case Constants.MarketRequestOwnOffers: case Constants.MarketRequestOwnHistory: objectId = message.ReadUnsignedShort(); break; default: objectId = var; break; } ushort amount = message.ReadUnsignedShort(); uint piecePrice = message.ReadUnsignedInt(); MarketOfferStates state = MarketOfferStates.Active; string character = null; switch (var) { case Constants.MarketRequestOwnOffers: break; case Constants.MarketRequestOwnHistory: state = (MarketOfferStates)message.ReadUnsignedByte(); break; default: character = message.ReadString(); break; } return(new Market.Offer(new Market.OfferId(counter, timestamp), offerType, objectId, amount, piecePrice, character, state)); }
private void ParseDailyRewardHistory(Internal.ByteArray message) { int count = message.ReadUnsignedByte(); for (int i = 0; i < count; i++) { var timestamp = message.ReadUnsignedInt(); // timestamp message.ReadUnsignedByte(); // some state (0: none, 1: active[green]) message.ReadString(); // description message.ReadUnsignedShort(); // streak } }
private void ParseChannels(Internal.ByteArray message) { int count = message.ReadUnsignedByte(); List <Chat.Channel> channels = new List <Chat.Channel>(); for (int i = 0; i < count; i++) { int id = message.ReadUnsignedShort(); string name = message.ReadString(); channels.Add(new Chat.Channel(id, name, MessageModeType.None)); } }
private void ParseTrackedQuestFlags(Internal.ByteArray message) { bool full = message.ReadUnsignedByte() == 1; if (full) { int unknown2 = message.ReadUnsignedByte(); int size = message.ReadUnsignedByte(); for (int i = 0; i < size; i++) { int missionId = message.ReadUnsignedShort(); string questName = message.ReadString(); string missionName = message.ReadString(); string missionDescription = message.ReadString(); } } else { int missionId = message.ReadUnsignedShort(); string questName = message.ReadString(); string missionName = message.ReadString(); } }
private void ParseCreatureSpeed(Internal.ByteArray message) { uint creatureId = message.ReadUnsignedInt(); int baseSpeed = -1; if (OpenTibiaUnity.GameManager.ClientVersion >= 1059) { baseSpeed = message.ReadUnsignedShort(); } int speed = message.ReadUnsignedShort(); var creature = CreatureStorage.GetCreature(creatureId); if (!!creature) { creature.SetSkill(SkillType.Speed, speed, baseSpeed); } else { throw new System.Exception("ProtocolGame.ParseCreatureSpeed: Unknown creature id: " + creatureId); } }
private void ParsePlayerStates(Internal.ByteArray message) { if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerStateU32)) { Player.StateFlags = message.ReadUnsignedInt(); } else if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GamePlayerStateU16)) { Player.StateFlags = message.ReadUnsignedShort(); } else { Player.StateFlags = message.ReadUnsignedByte(); } }
private ObjectInstance ReadObjectInstance(Internal.ByteArray message, int id = -1) { if (id == -1) { id = message.ReadUnsignedShort(); } if (id == 0) { return(null); } else if (id <= AppearanceInstance.Creature) { throw new System.Exception("ProtocolGameUtility.ReadObjectInstance: Invalid type (id = " + id + ")"); } var @object = AppearanceStorage.CreateObjectInstance((uint)id, 0); if (!@object) { throw new System.Exception("ProtocolGameUtility.ReadObjectInstance: Invalid instance with id " + id); } if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameObjectMarks)) { @object.Marks.SetMark(MarkType.Permenant, message.ReadUnsignedByte()); } if (@object.Type.IsStackable || @object.Type.IsFluidContainer || @object.Type.IsSplash) { @object.Data = message.ReadUnsignedByte(); } if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameItemAnimationPhase)) { if (@object.Type.FrameGroups[(int)Protobuf.Shared.FrameGroupType.Idle].SpriteInfo.IsAnimation) { int phase = message.ReadUnsignedByte(); @object.Phase = phase == 0 ? Constants.PhaseAutomatic : phase; } } if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameQuickLoot) && @object.Type.IsContainer) { message.ReadUnsignedByte(); // autolootIndex } return(@object); }
private void ParsePlayerHelpers(Internal.ByteArray message) { uint creatureId = message.ReadUnsignedInt(); ushort helpers = message.ReadUnsignedShort(); var creature = CreatureStorage.GetCreature(creatureId); if (!!creature) { creature.NumberOfPvPHelpers = helpers; } else { throw new System.Exception("ProtocolGame.ParsePlayerHelpers: Unknown creature id: " + creatureId); } }
private void ParseMarketBrowse(Internal.ByteArray message) { ushort var = message.ReadUnsignedShort(); // this must match the current object id int count = message.ReadUnsignedByte(); for (int i = 0; i < count; i++) { ReadMarketOffer(message, MarketOfferTypes.Buy, var); } count = message.ReadUnsignedByte(); for (int i = 0; i < count; i++) { ReadMarketOffer(message, MarketOfferTypes.Sell, var); } }
private void ParseCreateInContainer(Internal.ByteArray message) { byte containerId = message.ReadUnsignedByte(); ushort slot = 0; if (OpenTibiaUnity.GameManager.GetFeature(GameFeature.GameContainerPagination)) { slot = message.ReadUnsignedShort(); } var @object = ReadObjectInstance(message); var containerView = ContainerStorage.GetContainerView(containerId); if (!!containerView) { containerView.AddObject(slot, @object); } }
private AppearanceInstance ReadMountOutfit(Internal.ByteArray message, AppearanceInstance instance = null) { uint outfitID = message.ReadUnsignedShort(); OutfitInstance outfitInstance = instance as OutfitInstance; if (!!outfitInstance && outfitInstance.ID == outfitID) { return(outfitInstance); } if (outfitID != 0) { return(AppearanceStorage.CreateOutfitInstance(outfitID, 0, 0, 0, 0, 0)); } return(null); }