Пример #1
0
        private void BattleManagerOnExitTurn(IBattleManager battle, ICombatList attackers, ICombatList defenders, uint turn)
        {
            var properties = battle.ListProperties();

            if (properties.Count == 0)
            {
                return;
            }

            var packet = CreatePacket(battle, Command.BattlePropertyUpdate);

            PacketHelper.AddBattleProperties(battle.ListProperties(), packet);
            channel.Post(channelName, packet);
        }
Пример #2
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);
            });
        }