Esempio n. 1
0
        private void BattleReinforceAttacker(IBattleManager battle, ICombatGroup combatGroup)
        {
            var packet = CreatePacket(battle, Command.BattleReinforceAttacker);

            PacketHelper.AddToPacket(combatGroup, packet);
            channel.Post(channelName, packet);
        }
Esempio n. 2
0
        private void ForestInfo(Session session, Packet packet)
        {
            var reply = new Packet(packet);

            uint forestId;

            try
            {
                forestId = packet.GetUInt32();
            }
            catch (Exception)
            {
                ReplyError(session, packet, Error.Unexpected);
                return;
            }

            IForest forest;

            if (!forestManager.TryGetValue(forestId, out forest))
            {
                ReplyError(session, packet, Error.ObjectNotFound);
                return;
            }

            locker.Lock(forest).Do(() =>
            {
                reply.AddUInt32(UnixDateTime.DateTimeToUnix(forest.DepleteTime.ToUniversalTime()));
                PacketHelper.AddToPacket(forest.Wood, reply);
            });

            session.Write(reply);
        }
Esempio n. 3
0
        public byte[] GetObjectBytes()
        {
            while (isDirty)
            {
                // Players must always be locked first
                primaryLock.EnterReadLock();
                var playersInRegion    = primaryObjects.ToArray <ILockable>();
                var currentLastUpdated = regionLastUpdated;
                primaryLock.ExitReadLock();

                var isDone = lockerFactory().Lock(playersInRegion).Do(() =>
                {
                    // Enter write lock but give up all locks if we cant in 1 second just to be safe
                    if (!primaryLock.TryEnterWriteLock(1000))
                    {
                        return(false);
                    }

                    // ReSharper disable ConditionIsAlwaysTrueOrFalse
                    // ReSharper disable HeuristicUnreachableCode
                    if (!isDirty)
                    {
                        primaryLock.ExitWriteLock();
                        return(true);
                    }
                    // ReSharper restore HeuristicUnreachableCode
                    // ReSharper restore ConditionIsAlwaysTrueOrFalse

                    if (currentLastUpdated != regionLastUpdated)
                    {
                        primaryLock.ExitWriteLock();
                        return(false);
                    }

                    var dummyPacket = new Packet();
                    // Write tiles
                    dummyPacket.AddBytes(map);
                    // Write objects
                    dummyPacket.AddUInt16(primaryObjects.Count);
                    foreach (ISimpleGameObject obj in primaryObjects)
                    {
                        PacketHelper.AddToPacket(obj, dummyPacket, true);
                    }

                    objects = dummyPacket.GetPayload();
                    isDirty = false;

                    primaryLock.ExitWriteLock();

                    return(true);
                });

                if (isDone)
                {
                    break;
                }
            }

            return(objects);
        }
Esempio n. 4
0
        private void BattleManagerOnGroupUnitAdded(IBattleManager battle,
                                                   BattleManager.BattleSide combatObjectSide,
                                                   ICombatGroup combatGroup,
                                                   ICombatObject combatObject)
        {
            var packet = CreatePacket(battle, Command.BattleGroupUnitAdded);

            packet.AddUInt32(combatGroup.Id);
            PacketHelper.AddToPacket(combatObject, packet);
            channel.Post(channelName, packet);
        }
Esempio n. 5
0
        protected override void UpdateNotification(Notification notification)
        {
            base.UpdateNotification(notification);

            if (Global.Current.FireEvents)
            {
                var packet = new Packet(Command.NotificationUpdate);
                packet.AddUInt32(cityId);
                PacketHelper.AddToPacket(notification, packet);
                Global.Current.Channel.Post(channelName, packet);
            }
        }
Esempio n. 6
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);
        }
Esempio n. 7
0
        private void NewCityUpdate(ICity city)
        {
            if (city.Owner.Session == null)
            {
                return;
            }

            channel.Post(GetChannelName(city), () =>
            {
                var packet = new Packet(Command.CityNewUpdate);
                PacketHelper.AddToPacket(city, packet);
                return(packet);
            });
        }
Esempio n. 8
0
        private void TroopManagerTroopUpdated(ICity city, TroopStubEventArgs args)
        {
            if (!ShouldUpdate(city))
            {
                return;
            }

            channel.Post(GetChannelName(city), () =>
            {
                var packet = new Packet(Command.TroopUpdated);
                packet.AddUInt32(city.Id);
                PacketHelper.AddToPacket(args.Stub, packet);
                return(packet);
            });
        }
Esempio n. 9
0
        private void UnitTemplateUnitUpdated(ICity city, EventArgs args)
        {
            if (!ShouldUpdate(city))
            {
                return;
            }

            channel.Post(GetChannelName(city), () =>
            {
                var packet = new Packet(Command.UnitTemplateUpgraded);
                packet.AddUInt32(city.Id);
                PacketHelper.AddToPacket(city.Template, packet);
                return(packet);
            });
        }
Esempio n. 10
0
        private void ResourceUpdateEvent(ICity city, EventArgs args)
        {
            if (!ShouldUpdate(city))
            {
                return;
            }

            channel.Post(GetChannelName(city), () =>
            {
                var packet = new Packet(Command.CityResourcesUpdate);
                packet.AddUInt32(city.Id);
                PacketHelper.AddToPacket(city.Resource, packet);
                return(packet);
            });
        }
Esempio n. 11
0
        private void ObjectUpdated(ICity city, GameObjectArgs args)
        {
            if (!ShouldUpdate(city))
            {
                return;
            }

            RecalculateValue(city, args.Object);

            channel.Post(GetChannelName(city), () =>
            {
                var packet = new Packet(Command.CityObjectUpdate);
                packet.AddUInt16(regionLocator.GetRegionIndex(args.Object));
                PacketHelper.AddToPacket(args.Object, packet);
                return(packet);
            });
        }
Esempio n. 12
0
        protected override bool AddNotification(Notification notification)
        {
            if (base.AddNotification(notification))
            {
                if (Global.Current.FireEvents)
                {
                    //send add
                    var packet = new Packet(Command.NotificationAdd);
                    packet.AddUInt32(cityId);
                    PacketHelper.AddToPacket(notification, packet);

                    Global.Current.Channel.Post(channelName, packet);
                }

                return(true);
            }

            return(false);
        }
Esempio n. 13
0
        private void WorkerActionAdded(ICity city, ActionWorkerEventArgs args)
        {
            if (!ShouldUpdate(city))
            {
                return;
            }

            var passiveAction = args.Stub as PassiveAction;

            if (passiveAction != null && !passiveAction.IsVisible)
            {
                return;
            }

            channel.Post(GetChannelName(city), () =>
            {
                var packet = new Packet(Command.ActionStarted);
                packet.AddUInt32(city.Id);
                PacketHelper.AddToPacket(args.Stub, packet, true);
                return(packet);
            });
        }
Esempio n. 14
0
        public bool Add(ISimpleGameObject obj)
        {
            if (!AddToPrimaryRegionAndTiles(obj))
            {
                return(false);
            }

            // Keeps track of objects that exist in the map
            obj.InWorld = true;

            RegisterObjectEventListeners(obj);

            // Add appropriate objects to the minimap
            IMiniMapRegionObject miniMapRegionObject = obj as IMiniMapRegionObject;

            if (miniMapRegionObject != null)
            {
                MiniMapRegions.Add(miniMapRegionObject);
            }

            // Post to channel
            ushort regionId = regionLocator.GetRegionIndex(obj);

            channel.Post("/WORLD/" + regionId, () =>
            {
                var packet = new Packet(Command.ObjectAdd);
                packet.AddUInt16(regionId);
                PacketHelper.AddToPacket(obj, packet);
                return(packet);
            });

            // Raise event
            ObjectAdded.Raise(this, new ObjectEvent(obj));

            return(true);
        }
Esempio n. 15
0
        private void Subscribe(Session session, Packet packet)
        {
            uint battleId;

            try
            {
                battleId = packet.GetUInt32();
            }
            catch (Exception)
            {
                ReplyError(session, packet, Error.Unexpected);
                return;
            }

            IBattleManager battleManager;

            if (!world.TryGetObjects(battleId, out battleManager))
            {
                ReplyError(session, packet, Error.BattleNotViewable);
                return;
            }

            CallbackLock.CallbackLockHandler lockHandler = delegate
            {
                var toBeLocked = new List <ILockable>();

                toBeLocked.AddRange(battleManager.LockList);

                return(toBeLocked.ToArray());
            };

            locker.Lock(lockHandler, null, session.Player).Do(() =>
            {
                IEnumerable <string> errorParams;
                var canWatchBattle = battleManager.CanWatchBattle(session.Player, out errorParams);
                if (!Config.battle_instant_watch && canWatchBattle != Error.Ok)
                {
                    packet = ReplyError(session, packet, canWatchBattle, false);
                    packet.AddByte((byte)errorParams.Count());
                    foreach (var errorParam in errorParams)
                    {
                        packet.AddString(errorParam);
                    }
                    session.Write(packet);
                    return;
                }

                var reply = new Packet(packet);
                reply.AddByte((byte)battleManager.Location.Type);
                reply.AddUInt32(battleManager.Location.Id);
                reply.AddString(battleManager.Location.GetName());
                reply.AddUInt32(battleManager.Round);

                // Battle properties
                PacketHelper.AddBattleProperties(battleManager.ListProperties(), reply);
                PacketHelper.AddToPacket(battleManager.Attackers, reply);
                PacketHelper.AddToPacket(battleManager.Defenders, reply);

                try
                {
                    Global.Current.Channel.Subscribe(session, "/BATTLE/" + battleManager.BattleId);
                }
                catch (DuplicateSubscriptionException)
                {
                }

                session.Write(reply);
            });
        }