コード例 #1
0
ファイル: Interaction.cs プロジェクト: ktj007/mmo
        internal void OnInteract(Entity entity, MessageSession session, InteractMsg msg)
        {
            if (entity.Has<Fightable>())
            {
                var template = DataCenter.Instance.GetDatum<InteractTemplate>(msg.InteractId);
                if (template == null)
                {
                    Logger.Write("Request a invalid interact[{0}]", msg.InteractId);
                    return;
                }

                EffectSystem.Affect(entity, template);
            }
            else
            {
                PositionSystem.Global.Interact(entity, targets =>
                    {
                        // default interaction - remove removables
                        foreach (var target in targets.Where(target => target.Has<Removable>() && target.Get<Removable>().Action))
                        {
                            // despawn target
                            PositionSystem.Global.Disappear(target);
                            EntityBinder.Instance.Remove(target);
                            EntityManager.Instance.Remove(target.Id);
                        }
                    });
            }
        }
コード例 #2
0
ファイル: MessageQueue.cs プロジェクト: ktj007/mmo
        public bool SendTo(MessageSession session, IMessage message)
        {
            if (Send == null || message == null)
                return false;

            return Send(session, message);
        }
コード例 #3
0
ファイル: PylonConnector.cs プロジェクト: ktj007/mmo
        internal void ResetPeer(MessageSession session, ResetPeerMessage msg)
        {
            if (session != _session)
                return;

            Logger.Write("Pylon Disconnected.");
            _event.Set();
        }
コード例 #4
0
ファイル: PylonConnector.cs プロジェクト: ktj007/mmo
        internal void ProcessPing(MessageSession session, AlivePingMsg msg)
        {
            if (session != _session)
                return;

            // ping을 받았으니 pong을 보낸다.
            session.Send(new AlivePongMsg());
        }
コード例 #5
0
ファイル: Movement.cs プロジェクト: ktj007/mmo
        internal void OnMove(Entity entity, MessageSession session, MoveMsg msg)
        {
            entity.Assign(msg);
            entity.Get<Motion>().StartTime = DateTime.Now;
            PositionSystem.Global.Move(entity);

            entity.Broadcast<UpdatePositionMsg>(entity.Id);
        }
コード例 #6
0
ファイル: MessageSessionManager.cs プロジェクト: ktj007/mmo
 internal bool Add(int sessionId, MessageSession session)
 {
     _lock.DoWrite(() =>
     {
         _sessionMap.Add(sessionId, session);
         _idMap.Add(session, sessionId);
     });
     return(true);
 }
コード例 #7
0
ファイル: MessageQueue.cs プロジェクト: ktj007/mmo
        public bool SendTo(MessageSession session, IMessage message)
        {
            if (Send == null || message == null)
            {
                return(false);
            }

            return(Send(session, message));
        }
コード例 #8
0
ファイル: FormInterChat.cs プロジェクト: ktj007/mmo
        public FormInterChat(MessageSession session, string userName)
        {
            InitializeComponent();

            _session = session;
            _userName = userName;

            // ReSharper disable ConvertToLambdaExpression
            DispatchHandler.Instance
                           .AddHandler<InterChatMsg>(msg => AddMessage(msg.Name, msg.Message, msg.Ticks))
                           .AddHandler<ResetPeerMessage>(OnDisconnected)
                           .AddHandler<InterChatCommandMsg>(DispatchCommand)
                           .AddHandler<AlivePingMsg>(OnPing);
        }
コード例 #9
0
ファイル: EnterLeave.cs プロジェクト: ktj007/mmo
        internal void OnEnterWorld(MessageSession session, EnterWorldMsg msg)
        {
            // get or create entity
            Entity entity;
            lock (_accountLock)
            {
                if (NameCache.Instance.Contains(msg.Name))
                    entity = EntityManager.Instance[NameCache.Instance[msg.Name]];
                else
                {
                    entity = EntityManager.Instance.Create(EntityTemplate.Ids.User);
                    entity.Get<Nameplate>().Name = msg.Name;

                    if (!EntityBinder.Instance.Add(entity))
                    {
                        Logger.Write("Cannot insert entity[{0}]", msg.Name);
                        return;
                    }

                    NameCache.Instance.Add(msg.Name, entity.Id);
                }

                // ignore duplicately send enter-world msg
                if (entity.Id == session.SessionId)
                    return;

                // prevent repeatly login
                if (entity.Get<Player>().Logged)
                {
                    Logger.Write("{0} is already logged.", msg.Name);
                    session.Shutdown(SocketShutdown.Both);
                    return;
                }

                entity.Get<Player>().Logged = true;
            }

            entity.Ensure<Tickable>();
            entity.Get<Tickable>().Interval = DataCenter.Instance.GetAttributeValue<int>(typeof(Tickable), "interval");

            session.SessionId = entity.Id;
            session.Send(new WorldInfoMsg { Id = entity.Id, WorldId = 1 });
            session.Send(entity.ToMessage<SpawnMsg>());

            PositionSystem.Global.Appear(entity);

            Logger.Write("{0} is logged.", msg.Name);
        }
コード例 #10
0
ファイル: PylonConnector.cs プロジェクト: ktj007/mmo
        private void ConnectionLoop()
        {
            while (true)
            {
                try
                {
                    _event.Reset();

                    Logger.Write("Try to connect Pylon({0}:{1})", Configuration.PylonHost, Configuration.PylonPort);
                    _session = MessageSessionManager.Instance.CreateSession();
                    _session.Connect(Configuration.PylonHost, Configuration.PylonPort);

                    Task.Factory.StartNew(_session.StartReceive);
                    _session.Send(new ServerMsg
                        {
                            Host = Configuration.HostAddress,
                            Port = Configuration.Port,
                            Name = Configuration.ServerName
                        });

                    Logger.Write("Pylon Connected.");

                    _event.WaitOne();
                }
            #if DEBUG
                catch (Exception e)
                {
                    Logger.Write("Cannot connect to Pylon");
                    Logger.Write(e);

                    Thread.Sleep(RetryInterval);
                }
            #else
                catch
                {
                    Logger.Write("Cannot connect to Pylon");
                    Thread.Sleep(RetryInterval);
                }
            #endif
            }
            // ReSharper disable FunctionNeverReturns
        }
コード例 #11
0
ファイル: FormInterChat.cs プロジェクト: ktj007/mmo
        private void Reconnect()
        {
            try
            {
                _session = MessageSessionManager.Instance.CreateSession();
            #if DEBUG
                _session.Connect("127.0.0.1", Configuration.PylonPort);
            #else
                _session.Connect(Configuration.PylonHost, Configuration.PylonPort);
            #endif
                _session.StartReceive();

                _session.Send(new InterChatLoginMsg { Name = _userName });
                return;
            }
            catch
            {
                Task.Delay(5000).ContinueWith(_ => Reconnect());
            }
        }
コード例 #12
0
ファイル: MessageSessionManager.cs プロジェクト: ktj007/mmo
 public int this[MessageSession session]
 {
     get { return(_lock.DoRead(() => _idMap.ContainsKey(session) ? _idMap[session] : -1)); }
 }
コード例 #13
0
ファイル: EnterLeave.cs プロジェクト: ktj007/mmo
        internal void OnResetPeer(Entity entity, MessageSession session, ResetPeerMessage msg)
        {
            PositionSystem.Global.Disappear(entity);

            if (entity.Has<Player>())
                entity.Get<Player>().Logged = false;

            if (entity.Has<Tickable>())
                entity.Detach<Tickable>();

            EntityBinder.Instance.Update(entity);

            if (entity.Has<Nameplate>())
                Logger.Write("{0} is logout.", entity.Get<Nameplate>().Name);
        }
コード例 #14
0
ファイル: MessageSessionManager.cs プロジェクト: ktj007/mmo
 internal bool Add(int sessionId, MessageSession session)
 {
     _lock.DoWrite(() =>
         {
             _sessionMap.Add(sessionId, session);
             _idMap.Add(session, sessionId);
         });
     return true;
 }
コード例 #15
0
ファイル: MessageSessionManager.cs プロジェクト: ktj007/mmo
 public int this[MessageSession session]
 {
     get { return _lock.DoRead(() => _idMap.ContainsKey(session) ? _idMap[session] : -1); }
 }