コード例 #1
0
ファイル: ServerInstance.cs プロジェクト: Maksims/gh12-server
        public ServerInstance()
        {
            this.server = new SocketServer();
            this.server.Instance = this;
            this.server.Start();

            this.game = new GameLoop();
            this.game.World = new GameWorld();
            this.game.Map = new Map(40, 26);

            for(int y = 0; y < this.game.Map.Height; ++y) {
                for(int x = 0; x < this.game.Map.Width; ++x) {
                    int type = 0;

                    /*if ((x < 24 && y < 24) ||
                        (x > 48 && y < 24) ||
                        (x < 24 && y > 48) ||
                        (x > 48 && y > 48)) {*/

                    /*if ((x < 3 && y < 3) ||
                        (x > 5 && y < 3) ||
                        (x < 3 && y > 5) ||
                        (x > 5 && y > 5)) {

                        type = 1;
                    }*/

                    this.game.Map.Cell(x, y).Type = Rand.Next(0, 2);
                }
            }

            for(int i = 0; i < 2; ++i) {
                Hero hero = new Hero();
                hero.Cell = this.game.Map.Cell(Rand.Next(this.game.Map.Width), Rand.Next(this.game.Map.Height));
                this.game.World.AddObject(hero);
            }

            this.game.CycleEnd += (packets) => this.server.PublishAsync(packets);

            this.game.Start();
        }
コード例 #2
0
        public void Loop()
        {
            int iteration = 0;

            long lastTick = Time.Now;

            while(this.running) {
                Thread.Sleep(1);
                if(Time.Now - lastTick > this.ups) {
            /* TICK BEGIN */
                    lastTick = Time.Now;
                    GameObject.Time = lastTick;

                    this.timer.Start();

                    ICollection<User> users = this.world.Users;
                    ICollection<GameObject> objects = this.world.Objects;

            /* UPDATE ALL USERS */
                    foreach(User user in users) {
            /* PROCESS USER STATES */
            /* REMOVING */
                        if(user.States["removing"] != null && user.States["removing"].Equals(true)) {
                            this.world.AddPacket(PacketFactory.Make("userRemove", "id", user.ID));

                            user.Remove();
                        } else {
            /* NEW */
                            if(user.States["new"] != null && user.States["new"].Equals(true)) {
                                user.States["new"] = null;

                                user.States["sync"] = true;

                                foreach(User iUser in users) {
                                    if(iUser.ID != user.ID && user.Client != null) {
                                        user.Client.SendAsync(PacketFactory.Make("userAdd", "id", iUser.ID, "n", iUser.Name, "l", iUser.Latency, "s", iUser.Score));
                                    }
                                }

                                foreach(GameObject obj in objects) {
                                    try {
                                        user.Client.SendAsync(obj.PacketFull);
                                    } catch(Exception ex) {

                                    }
                                }

                                for(int y = 0; y < map.Height; ++y) {
                                    for(int x = 0; x < map.Width; ++x) {
                                        user.Client.SendAsync(map.Cell(x, y).PacketFull);
                                    }
                                }

                                this.world.AddPacket(PacketFactory.Make("userAdd", "id", user.ID, "n", user.Name, "l", user.Latency, "s", user.Score));
                            }
            /* SET NAME */
                            if(user.States["nick"] != null && user.States["nick"].Equals(true)) {
                                user.States["nick"] = null;

                                user.Client.SendAsync(PacketFactory.Make("userStart"));

                                user.Client.SendAsync(PacketFactory.Make("mapData", "w", this.map.Width, "h", this.map.Height, "d", this.map.MapArray));

                                user.Char.Enabled = true;
                                user.Char.Cell = map.Cell(Rand.Next(0, map.Width), Rand.Next(0, map.Height));
                            }

            /* PROCESS INPUT */
                            UserInput input = null;

                            while((input = user.GrabInput()) != null) {
                                switch(input.Name) {
                                    case "charMove":
                                        user.Char.Direction = (byte)input["d"];
                                        break;
                                    case "mobSpawn":
                                        if (Time.Now - user.lastSpawn > 1000) {
                                            user.lastSpawn = Time.Now;

                                            if (user.Score > 0) {
                                                --user.Score;

                                                Hero hero = new Hero();
                                                hero.Evil = (user.ID % 2) == 0;
                                                hero.Cell = this.map.Cell((int)input["x"], (int)input["y"]);
                                                this.world.AddObject(hero);
                                                this.world.AddPacket(hero.PacketFull);
                                            }
                                        }
                                        break;
                                }
                            }

            /* PUBLISH USER UPDATE PACKET */
                            this.world.AddPacket(user.PacketUpdate);
                            //this.world.AddPacket(user.Char.PacketUpdate);
                        }

                        if (user.Client == null) {
                            user.States["removing"] = true;
                        }
                    }

            /* UPDATE ALL OBJECTS */
                    foreach(GameObject obj in objects) {
                        obj.Update();

                        if (obj.Deleted) {
                            obj.Delete();
                            this.world.AddPacket(obj.PacketRemove);
                            this.world.RemoveObject(obj);
                        } else {
                            this.world.AddPacket(obj.PacketUpdate);
                        }
                    }

                    for(int y = 0; y < map.Height; ++y) {
                        for(int x = 0; x < map.Width; ++x) {
                            this.world.AddPacket(map.Cell(x, y).PacketUpdate);
                        }
                    }

                    timer.Stop();

                    if (averigeTimeLast != this.timer.ElapsedMilliseconds) {
                        averigeTimeLast = this.timer.ElapsedMilliseconds;
                        Log.Add("cycle: " + averigeTimeLast);
                    }

            /* TICK END */
                    ++iteration;

                    this.timerSend.Start();
                    this.OnCycleEnd();
                    this.timerSend.Stop();

                    if (averigeTimeSendLast != this.timerSend.ElapsedMilliseconds) {
                        averigeTimeSendLast = this.timerSend.ElapsedMilliseconds;
                        Log.Add("cycle end: " + averigeTimeSendLast);
                    }
                }
            }
        }