Exemple #1
0
        public void UpdateObject(ISimpleGameObject sender, uint origX, uint origY)
        {
            if (!sender.InWorld)
            {
                throw new Exception(string.Format("Received update for obj that is not in world: eventOrigX[{1}] eventOrigY[{2}] {0}",
                                                  sender.ToString(),
                                                  origX,
                                                  origY));
            }

            var miniMapRegionObject = sender as IMiniMapRegionObject;

            if (miniMapRegionObject != null)
            {
                MiniMapRegions.UpdateObjectRegion(miniMapRegionObject, origX, origY);
            }

            // Lock regions from both old and new positions
            var lockedRegions = LockRegions(GetMultitileRegionIds(sender.PrimaryPosition.X, sender.PrimaryPosition.Y, sender.Size)
                                            .Concat(GetMultitileRegionIds(origX, origY, sender.Size)));

            ushort previousPrimaryRegionId = regionLocator.GetRegionIndex(origX, origY);
            ushort newPrimaryRegionId      = regionLocator.GetRegionIndex(sender);

            RemoveFromPrimaryRegionAndAllTiles(sender, origX, origY);
            AddToPrimaryRegionAndTiles(sender);

            if (previousPrimaryRegionId == newPrimaryRegionId)
            {
                var packet = new Packet(Command.ObjectUpdate);
                packet.AddUInt16(newPrimaryRegionId);
                PacketHelper.AddToPacket(sender, packet);
                channel.Post("/WORLD/" + newPrimaryRegionId, packet);
            }
            else
            {
                var packet = new Packet(Command.ObjectMove);
                packet.AddUInt16(previousPrimaryRegionId);
                packet.AddUInt16(newPrimaryRegionId);
                PacketHelper.AddToPacket(sender, packet);
                channel.Post("/WORLD/" + previousPrimaryRegionId, packet);

                packet = new Packet(Command.ObjectAdd);
                packet.AddUInt16(newPrimaryRegionId);
                PacketHelper.AddToPacket(sender, packet);
                channel.Post("/WORLD/" + newPrimaryRegionId, packet);
            }

            UnlockRegions(lockedRegions);
        }