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); } }); } }
public bool SendTo(MessageSession session, IMessage message) { if (Send == null || message == null) return false; return Send(session, message); }
internal void ResetPeer(MessageSession session, ResetPeerMessage msg) { if (session != _session) return; Logger.Write("Pylon Disconnected."); _event.Set(); }
internal void ProcessPing(MessageSession session, AlivePingMsg msg) { if (session != _session) return; // ping을 받았으니 pong을 보낸다. session.Send(new AlivePongMsg()); }
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); }
internal bool Add(int sessionId, MessageSession session) { _lock.DoWrite(() => { _sessionMap.Add(sessionId, session); _idMap.Add(session, sessionId); }); return(true); }
public bool SendTo(MessageSession session, IMessage message) { if (Send == null || message == null) { return(false); } return(Send(session, message)); }
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); }
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); }
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 }
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()); } }
public int this[MessageSession session] { get { return(_lock.DoRead(() => _idMap.ContainsKey(session) ? _idMap[session] : -1)); } }
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); }
internal bool Add(int sessionId, MessageSession session) { _lock.DoWrite(() => { _sessionMap.Add(sessionId, session); _idMap.Add(session, sessionId); }); return true; }
public int this[MessageSession session] { get { return _lock.DoRead(() => _idMap.ContainsKey(session) ? _idMap[session] : -1); } }