Exemplo n.º 1
0
    private void Update()
    {
        var servers = GetEntities <LocalServer>().Select(e => e.Item1);
        var clients = GetAllEntities <LocalClient>().Select(e => e.Item1);

        foreach (var server in servers)
        {
            var newClients = clients.Except(server.clients);
            foreach (var newClient in newClients)
            {
                server.clients.Add(newClient);
                newClient.server = server;
                ECSEvent.Create <OnLocalClientAccepted>(server);
                ECSEvent.Create <OnLocalClientAccepted>(newClient);
            }

            var disconnectedClients = server.clients.Except(clients);
            for (int i = server.clients.Count - 1; i >= 0; i--)
            {
                var disconnectedClient = server.clients[i];
                if (disconnectedClients.Contains(disconnectedClient))
                {
                    server.clients.RemoveAt(i);
                    ECSEvent.Create <OnLocalClientDisconnected>(server);
                    ECSEvent.Create <OnLocalClientDisconnected>(disconnectedClient);
                }
            }
        }
    }
    private void Update()
    {
        foreach (var entity in GetEntities <ClientInputRate, SplitScreenInput, ClientJumpQueue>())
        {
            var lastSent  = entity.Item1.lastSent;
            var jumpQueue = entity.Item3.jumpPresses;
            var nextSend  = lastSent + entity.Item1.sendRateInSeconds;
            if (Time.time < nextSend)
            {
                continue;
            }

            var input         = entity.Item2;
            var sessionEntity = GetEntity <Session>();
            if (sessionEntity == null)
            {
                continue;
            }

            lastSent = Time.time;
            var jump    = jumpQueue.Count > 0 ? jumpQueue.Dequeue() : false;
            var message = $"{sessionEntity.Item1.id} Input {input.horizontal} {input.vertical} {jump}";
            ECSEvent.Create <OnSendEvent>(sessionEntity.Item1, message);
        }
    }
    private void Update()
    {
        foreach (var entity in GetEntities <OnReceiveEvent, Session>())
        {
            var args = entity.Item1.Args;
            if (args.Length < 3)
            {
                continue;
            }

            var command = args[1].ToLower();
            var session = entity.Item2;
            if (command == "chat")
            {
                var chatMessage = entity.Item1.message;
                chatMessage = chatMessage.Substring(chatMessage.ToLower().IndexOf("chat") + 4).Trim();

                if (session && !string.IsNullOrEmpty(session.nickname))
                {
                    chatMessage = $"{session.nickname}: {chatMessage}";
                }

                var client = entity.Item2;
                foreach (var otherSession in GetEntities <Session>().Where(s => s.Item1 != session).Select(s => s.Item1))
                {
                    ECSEvent.Create <OnSendEvent>(otherSession, chatMessage);
                }
            }
        }
    }
    private void Update()
    {
        foreach (var entity in GetEntities <OnReceiveEvent, Session>())
        {
            var args = entity.Item1.Args;
            if (args.Length != 2)
            {
                continue;
            }

            var command = args[1].ToLower();
            var server  = entity.Item2;
            if (command == "help" || command == "?")
            {
                ECSEvent.Create <OnSendEvent>(server,
                                              @"----------
Commands:
----------
Connect {{IP{{:PORT}}}}
Disconnect
Exit/Quit
Restart
Test
Chat {{ChatMessage}}
Whisper {{ClientIndex}} {{ChatMessage}}
Help/?");
            }
        }
    }
    private void Update()
    {
        var sessions        = GetEntities <Session>();
        var onReceiveEvents = GetEntities <OnReceiveEvent, SocketClientConnection>().Select(e => e.Item1);

        if (onReceiveEvents.Count() == 0)
        {
            onReceiveEvents = GetEntities <OnReceiveEvent, Client>().Select(e => e.Item1);
        }

        foreach (var onReceiveEvent in onReceiveEvents)
        {
            var gameObject = onReceiveEvent.gameObject;
            var message    = onReceiveEvent.message;
            var args       = message.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
            if (int.TryParse(args[0], out int sessionId))
            {
                message = message.Substring(message.IndexOf(args[0]) + args[0].Length + 1);
                var session = sessions.Where(s => s.Item1.id == sessionId).FirstOrDefault();
                if (session != null)
                {
                    ECSEvent.Create <OnReceiveEvent>(session.Item1, message);
                }
            }
        }
    }
Exemplo n.º 6
0
    private void Update()
    {
        foreach (var entity in GetEntities <OnReceiveEvent, Session>())
        {
            var args = entity.Item1.Args;
            if (args.Length < 2)
            {
                continue;
            }
            var command = args[0].ToLower();
            var client  = entity.Item2;
            if (command == "destroy")
            {
                var entityId = Convert.ToInt32(args[1]);

                foreach (var toBeDestroyed in GetEntities <EntityId>())
                {
                    if (toBeDestroyed.Item1.entityId == entityId)
                    {
                        toBeDestroyed.Item1.gameObject.AddComponent <EntityDestroyed>();
                    }
                }

                var message = $"Entity Id {entityId} has been destroyed.";
                ECSEvent.Create <OnSendEvent>(client.gameObject, message);
            }
        }
    }
    private void Update()
    {
        foreach (var entity in GetEntities <RoundTripTime, Session>())
        {
            var rtt     = entity.Item1;
            var session = entity.Item2;
            if (Time.time < rtt.nextUpdateTime)
            {
                continue;
            }

            rtt.nextUpdateTime = Time.time + rtt.updateRate;
            foreach (var clientTick in GetEntities <ClientTick>())
            {
                var tick = clientTick.Item1.lastReceivedTick;
                rtt.AddNewTime(tick, Time.time);
                ECSEvent.Create <OnSendEvent>(session, $"Ping {tick}");
            }

            foreach (var serverTick in GetEntities <ServerTick>())
            {
                var tick = serverTick.Item1.tick;
                rtt.AddNewTime(tick, Time.time);
                ECSEvent.Create <OnSendEvent>(session, $"Ping {tick}");
            }
        }

        foreach (var entity in GetEntities <OnReceiveEvent, Session>())
        {
            var args    = entity.Item1.Args;
            var session = entity.Item2;
            if (args.Length < 1)
            {
                continue;
            }

            var command = args[0].ToLower();
            if (command == "ping")
            {
                var tick = Convert.ToInt32(args[1]);
                ECSEvent.Create <OnSendEvent>(session, $"Pong {tick}");
            }
            if (command == "pong")
            {
                var tick = Convert.ToInt32(args[1]);
                foreach (var rttEntity in GetEntities <RoundTripTime>())
                {
                    var rtt = rttEntity.Item1;

                    var rttSendTime = rtt.sendTimes.Where(st => st.tick == tick).FirstOrDefault();
                    if (rttSendTime != null)
                    {
                        rtt.RTT = Time.time - rttSendTime.time;
                    }

                    rtt.RemoveTimesOnOrBeforeTick(tick);
                }
            }
        }
    }
Exemplo n.º 8
0
    public void Init(bool isClient)
    {
        eventSystem = new ECSEvent(this);

        componentType     = GetComponentType();
        heapComponentPool = new ComponentPool(componentType.Count(), this);
        //singletonComponents = new SingletonComponent[componentType.Count()];
        //Debug.Log(" componentType: " + componentType.GetType().FullName);
        IsClient = isClient;
        try
        {
            InitSystem();

            if (IsClient)
            {
                InitRecordSystem();
            }

            InitGroup();
            GameStart();
        }
        catch (Exception e)
        {
            Debug.LogError("WorldBase Init Exception:" + e.ToString());
        }
    }
    private void Update()
    {
        foreach (var entity in GetEntities <ClientOnOpenEvent, Client>())
        {
            var client = entity.Item2;
            if (!client)
            {
                continue;
            }

            var message = "RegisterNewSession";
#if UNITY_EDITOR
            message += " Editor";
#elif UNITY_WEBGL
            message += " WebGL";
#elif UNITY_STANDALONE_WIN
            message += " Windows";
#elif UNITY_STANDALONE_OSX
            message += " OSX";
#elif UNITY_STANDALONE_LINUX
            message += " Linux";
#endif
            ECSEvent.Create <OnSendEvent>(client.gameObject, message);
        }
    }
    private void Update()
    {
        foreach (var entity in GetEntities <OnReceiveEvent, SocketClientConnection>())
        {
            var args = entity.Item1.message.Split(' ');
            if (args.Length != 2)
            {
                continue;
            }

            var command = args[0].ToLower();
            if (command == "registernewsession")
            {
                var client = entity.Item2;

                var newSessionEntity = gameObject.scene.NewGameObject();
                var session          = newSessionEntity.AddComponent <Session>();
                session.id           = Session.GetNextId();
                session.build        = args[1];
                session.nickname     = "Guest" + session.id;
                session.connection   = client;
                session.lastReceived = Time.time;
                session.name         = "Session" + session.id;

                var message = $"AddSession {session.id} {session.build} {session.nickname}";
                ECSEvent.Create <OnSendEvent>(client.gameObject, message);
            }
        }
    }
    void FlyDamageLogic(EntityBase fly, EntityBase entity)
    {
        FlyObjectComponent fc = fly.GetComp <FlyObjectComponent>();
        LifeComponent      lc = entity.GetComp <LifeComponent>();

        lc.life -= fc.damage;
        //派发事件
        ECSEvent.DispatchEvent(GameUtils.GetEventKey(entity.ID, CharacterEventType.Damage), entity);
    }
 private void Update()
 {
     foreach (var entity in GetEntities <OnSendEvent, LocalClient>())
     {
         var message = entity.Item1.message;
         var client  = entity.Item2;
         var server  = client.server;
         ECSEvent.Create <OnReceiveEvent>(server, message);
     }
 }
Exemplo n.º 13
0
    private void OnMessage(Object server, Message <Socket> clientMessage)
    {
        var connection = clients.Where(c => c.socket == clientMessage.client).FirstOrDefault();

        if (connection == null)
        {
            return;
        }

        ECSEvent.Create <OnReceiveEvent>(connection, clientMessage.data);
    }
Exemplo n.º 14
0
        private void Update()
        {
            ECSEvent.ClearEvents();

            foreach (var entity in GetAllEntities <EntityDestroyed>())
            {
                if (entity.Item1 && entity.Item1.gameObject)
                {
                    Destroy(entity.Item1.gameObject);
                }
            }
        }
 private void Update()
 {
     foreach (var inputEntity in GetEntities <InputFieldSubmitEvent>())
     {
         var message = inputEntity.Item1.text;
         foreach (var sessionEntity in GetEntities <Session>())
         {
             var session = sessionEntity.Item1;
             ECSEvent.Create <OnSendEvent>(session.gameObject, message);
         }
     }
 }
Exemplo n.º 16
0
 private void Update()
 {
     foreach (var entity in GetEntities <OnSendEvent, LocalServer>())
     {
         var message = entity.Item1.message;
         var server  = entity.Item2;
         foreach (var client in server.clients)
         {
             ECSEvent.Create <OnReceiveEvent>(client, message);
         }
     }
 }
    public void CreateSubmitEvent()
    {
        var text = inputField.text;

        if (text.Trim() != "")
        {
            ECSEvent.Create <InputFieldSubmitEvent>(gameObject, text);
        }

        inputField.text = "";
        inputField.ActivateInputField();
    }
Exemplo n.º 18
0
 private void Update()
 {
     foreach (var entity in GetEntities <InputFieldSubmitEvent>())
     {
         var message = entity.Item1.text;
         foreach (var server in GetEntities <Server>())
         {
             var sender = server.Item1.gameObject;
             ECSEvent.Create <OnSendEvent>(sender, message);
         }
     }
 }
Exemplo n.º 19
0
    private void OnClose(Object server, Socket client)
    {
        var connection = clients.Where(c => c.socket == client).FirstOrDefault();

        if (connection == null)
        {
            return;
        }

        clients.Remove(connection);
        ECSEvent.Create <ServerOnCloseEvent>(gameObject, connection);
        Entity.Destroy(connection.gameObject);
    }
Exemplo n.º 20
0
 private void Update()
 {
     foreach (var entity in GetEntities <InputFieldSubmitEvent>())
     {
         var message          = entity.Item1.text;
         var peerToPeerClient = GetEntity <LocalPeerClient>();
         if (peerToPeerClient != null)
         {
             var sender = peerToPeerClient.Item1.gameObject;
             ECSEvent.Create <OnSendEvent>(sender, message);
         }
     }
 }
Exemplo n.º 21
0
    private void OnOpen(Object server, Socket client)
    {
        var connectionGameObject = gameObject.scene.NewGameObject();

        connectionGameObject.name = "Client Connection " + client.GetHashCode();
        var connection = connectionGameObject.AddComponent <SocketClientConnection>();

        connection.socket   = client;
        connection.host     = ((IPEndPoint)client.RemoteEndPoint).Address.ToString();
        connection.port     = ((IPEndPoint)client.RemoteEndPoint).Port;
        connection.protocol = client.ProtocolType.ToString().ToUpper();
        clients.Add(connection);
        ECSEvent.Create <ServerOnOpenEvent>(gameObject, connection);
    }
Exemplo n.º 22
0
    private void Update()
    {
        foreach (var entity in GetEntities <OnReceiveEvent, Session>())
        {
            var args = entity.Item1.Args;
            if (args.Length != 2)
            {
                continue;
            }

            var command = args[0].ToLower();
            if (command == "create")
            {
                var prefabList = GetEntity <PrefabList>();
                if (prefabList == null)
                {
                    continue;
                }

                if (args.Length < 2)
                {
                    continue;
                }

                var prefabName = args[1];
                var prefab     = prefabList.Item1.prefabList.prefabs
                                 .Where(p => p.name.ToLower() == prefabName.ToLower())
                                 .FirstOrDefault();
                if (!prefab)
                {
                    continue;
                }

                var session  = entity.Item2;
                var instance = session.gameObject.scene.Instantiate(prefab);
                instance.transform.position = new Vector3(0, 5, 0);
                instance.layer = LayerMask.NameToLayer("Server");

                if (prefabName.ToLower().Contains("player"))
                {
                    var tcpInput = instance.AddComponent <SessionInput>();
                    tcpInput.sessionId = session.id;
                }

                var message = $"{prefab.name} created with EntityId {EntityId.nextEntityId}";
                ECSEvent.Create <OnSendEvent>(session, message);
            }
        }
    }
Exemplo n.º 23
0
    public void Init(bool isView)
    {
        eventSystem = new ECSEvent(this);

        m_isView = isView;
        try
        {
            Type[] types = GetSystemTypes();

            for (int i = 0; i < types.Length; i++)
            {
                SystemBase tmp = (SystemBase)types[i].Assembly.CreateInstance(types[i].FullName);
                m_systemList.Add(tmp);
                tmp.m_world = this;
                tmp.Init();
            }

            //初始化RecordComponent
            types = GetRecordTypes();
            for (int i = 0; i < types.Length; i++)
            {
                Type type = typeof(RecordSystem <>);
                type = type.MakeGenericType(types[i]);

                RecordSystemBase tmp = (RecordSystemBase)Activator.CreateInstance(type);;
                m_recordList.Add(tmp);
                m_recordDict.Add(types[i].Name, tmp);
                tmp.m_world = this;
                tmp.Init();
            }

            //初始化RecordSystem
            types = GetRecordSystemTypes();
            for (int i = 0; i < types.Length; i++)
            {
                RecordSystemBase tmp = (RecordSystemBase)types[i].Assembly.CreateInstance(types[i].FullName);
                m_recordList.Add(tmp);
                tmp.m_world = this;
                tmp.Init();
            }
        }
        catch (Exception e)
        {
            Debug.LogError("WorldBase Init Exception:" + e.ToString());
        }
    }
Exemplo n.º 24
0
 private void Update()
 {
     foreach (var entity in GetEntities <OnReceiveEvent, Session>())
     {
         var args = entity.Item1.message.Split(new[] { " " }, StringSplitOptions.None);
         if (args.Length < 2)
         {
             continue;
         }
         var session = entity.Item2;
         var command = args[1].ToLower();
         if (command == "test")
         {
             ECSEvent.Create <OnSendEvent>(session, "Server reply to Test Command");
         }
     }
 }
 private void Update()
 {
     foreach (var entity in GetAllEntities <OnSendEvent, LocalPeerClient>())
     {
         var message = entity.Item1.message;
         var peer    = entity.Item2;
         foreach (var otherEntity in GetEntities <LocalPeerClient>())
         {
             var otherPeer = otherEntity.Item1;
             if (peer == otherPeer)
             {
                 continue;
             }
             ECSEvent.Create <OnReceiveEvent>(otherPeer, message);
         }
     }
 }
Exemplo n.º 26
0
    public void Init(bool isClient)
    {
        eventSystem = new ECSEvent(this);

        IsClient = isClient;
        try
        {
            InitSystem();

            if (IsClient)
            {
                InitRecordSystem();
            }

            InitGroup();
            GameStart();
        }
        catch (Exception e)
        {
            Debug.LogError("WorldBase Init Exception:" + e.ToString());
        }
    }
    private void Update()
    {
        foreach (var entity in GetEntities <OnReceiveEvent, Session>())
        {
            var args = entity.Item1.Args;
            if (args.Length < 3)
            {
                continue;
            }

            var session   = entity.Item2;
            var sessionId = session.id;
            var command   = args[1].ToLower();

            if (command == "whisper")
            {
                var reciepient = args[2];

                var chatMessage = entity.Item1.message;
                chatMessage = chatMessage.Substring(chatMessage.ToLower().IndexOf("whisper") + 7);
                chatMessage = chatMessage.Substring(chatMessage.IndexOf(reciepient) + reciepient.Length);
                chatMessage = chatMessage.Trim();

                if (session && !string.IsNullOrEmpty(session.nickname))
                {
                    chatMessage = $"{session.nickname} (whisper): {chatMessage}";
                }

                var reciepientSession = GetEntities <Session>()
                                        .Where(s => s.Item1.id.ToString() == reciepient || s.Item1.nickname == reciepient)
                                        .Select(s => s.Item1).FirstOrDefault();

                if (reciepientSession != null)
                {
                    ECSEvent.Create <OnSendEvent>(reciepientSession, chatMessage);
                }
            }
        }
    }
    private void Update()
    {
        foreach (var entity in GetEntities <OnSendEvent, Session>())
        {
            var sendEvent = entity.Item1;
            var session   = entity.Item2;
            var message   = $"{session.id} {sendEvent.message}";

            if (session.connection != null)
            {
                ECSEvent.Create <OnSendEvent>(session.connection.gameObject, message);
            }
            else
            {
                var client = GetEntity <Client>();
                if (client != null)
                {
                    ECSEvent.Create <OnSendEvent>(client.Item1.gameObject, message);
                }
            }
        }
    }
    public void Damage(EntityBase skiller, EntityBase hurter, SkillDataGenerate skillData)
    {
        bool isCrit       = false;
        bool isDisrupting = false;
        int  damageNumber = DamageValueFormula(skillData, skiller, hurter, out isCrit, out isDisrupting);

        if (damageNumber == 0)
        {
            return;
        }

        Debug.Log("Damage!");

        //TODO 吸血
        Absorb(damageNumber, skiller, skillData);

        //伤害处理
        LifeComponent lc = hurter.GetComp <LifeComponent>();

        lc.life -= damageNumber;

        ECSEvent.DispatchEvent(GameUtils.GetEventKey(hurter.ID, CharacterEventType.Damage), hurter);
    }
    private void Update()
    {
        foreach (var entity in GetEntities <ClientInputRate, SplitScreenInput, ClientTick>())
        {
            foreach (var sessionEntity in GetEntities <Session>())
            {
                var lastSent   = entity.Item1.lastSent;
                var nextSend   = lastSent + entity.Item1.sendRateInSeconds;
                var input      = entity.Item2;
                var clientTick = entity.Item3;
                var session    = sessionEntity.Item1;

                if (Time.time < nextSend)
                {
                    continue;
                }

                entity.Item1.lastSent = lastSent = Time.time;
                var message = $"Input {clientTick.tick} {input.horizontal} {input.vertical} {input.jumpPressed}";
                ECSEvent.Create <OnSendEvent>(session, message);
            }
        }
    }