Пример #1
0
        public void DownloadMap(string mapName)
        {
            mapName += MapExtension;

            if (_cache.ContainsKey(mapName))
            {
#if DEBUG
                Console.WriteLine("[Map] Loaded from cache: " + mapName);
#endif
                MapLoaded?.Invoke(RemoveExtension(mapName), _cache[mapName]);
                return;
            }

#if DEBUG
            Console.WriteLine("[Map] Requested: " + mapName);
#endif

            using (MemoryStream stream = new MemoryStream())
            {
                using (BinaryWriter writer = new BinaryWriter(stream))
                {
                    writer.Write((byte)0x72);
                    writer.Write(Encoding.ASCII.GetBytes(mapName));
                }
                _connection.Send(stream.ToArray());
            }
        }
Пример #2
0
        private void OnPacketReceived(BinaryReader reader)
        {
            char type = (char)reader.ReadByte();

            if (type == 'm')
            {
                int    mapNameSize = reader.ReadByte();
                string name        = Encoding.ASCII.GetString(reader.ReadBytes(mapNameSize));

                int    mapLength = (int)(reader.BaseStream.Length - reader.BaseStream.Position);
                byte[] content   = reader.ReadBytes(mapLength);

                content = DecompressContent(content);

                Map map = new Map(content);
                if (!_cache.ContainsKey(name))
                {
                    _cache.Add(name, map);
                }

#if DEBUG
                Console.WriteLine("[Map] Received: " + name);
#endif

                MapLoaded?.Invoke(RemoveExtension(name), map);
            }
        }
Пример #3
0
 private void OnMapLoaded(Map map)
 {
     if (map != null)
     {
         MapLoaded?.Invoke(this, new MapEventArgs(map));
     }
 }
Пример #4
0
 /// <summary>
 /// Loads a new file into this map object.
 /// </summary>
 /// <param name="filename">The file to load.</param>
 public void Load(string filename)
 {
     Filename = filename;
     MapProvider.Load(filename);
     _lastClient = DateTime.UtcNow;
     Loaded      = true;
     Logger.Log(LogType.Info, $"Map {MapProvider.MapName} (by {MapProvider.CreatingUser}) loaded.");
     MapLoaded?.Invoke(this);
 }
Пример #5
0
        //Loading map "map"  [003.1]
        /// <summary>
        /// Raises the <see cref="MapLoaded"/> event.
        /// </summary>
        /// <param name="timestamp">Time at which <see cref="MapLoaded"/> event was fired.</param>
        /// <param name="info">Information about <see cref="MapLoaded"/> event.</param>
        protected virtual void OnMapLoading(DateTime timestamp, string[] info)
        {
            var eventArgs = new MapLoadEventArgs
            {
                Timestamp = timestamp,
                MapName   = info[1]
            };

            MapLoaded.Fire(ServerEndPoint, eventArgs);
        }
Пример #6
0
        private void Reload()
        {
            if (Loaded)
            {
                return;
            }

            MapProvider.Reload();
            Loaded      = true;
            _lastClient = DateTime.UtcNow;
            Logger.Log(LogType.Info, $"Map '{MapProvider.MapName}' reloaded.");
            MapLoaded?.Invoke(this);
        }
Пример #7
0
        public void DownloadMap(string mapName)
        {
            if (_cache.ContainsKey(mapName.ToLowerInvariant()))
            {
#if DEBUG
                Console.WriteLine("[Map] Loaded from cache: " + mapName);
#endif
                MapLoaded?.Invoke(RemoveExtension(mapName), _cache[mapName.ToLowerInvariant()]);
                return;
            }
#if DEBUG
            Console.WriteLine("[Map] Requested: " + mapName);
#endif

            SendProto(new MAPAPI.Request.RequestMap
            {
                MapName = mapName
            });
        }
Пример #8
0
        private void FinishMapDownloading(MAPAPI.Response.MapServerMap mapProto)
        {
            string name = mapProto.MapName;

            byte[] data = MAPAPI.CompressionHelper.DecompressBytes(mapProto.MapData);
            Map    map  = new Map(data, mapProto.IsSession, _client);

            map.NpcReceieved += Map_NpcReceieved;

            if (!_cache.ContainsKey(name.ToLowerInvariant()))
            {
                _cache.Add(name.ToLowerInvariant(), map);
            }

#if DEBUG
            Console.WriteLine("[Map] Received: " + RemoveExtension(name));
#endif
            MapLoaded?.Invoke(RemoveExtension(name), map);
        }
Пример #9
0
    private MapView CreateMap(IMapData map, bool generateNavMesh)
    {
        if (MapPrefab == null)
        {
            throw new Exception("Map prefab is not set.");
        }

        var mapInstance = Instantiate(MapPrefab);
        var view        = mapInstance.GetComponentInChildren <MapView>();

        if (view == null)
        {
            throw new Exception("Map prefab not contains MapView.");
        }

        view.LoadMap(map, generateNavMesh);
        mapInstance.transform.parent = transform;
        MapLoaded?.Invoke(map);
        return(view);
    }
Пример #10
0
        private async Task ListenGameState(Channel channel)
        {
            var mapState    = new ClientMapData();
            var playerState = new ClientPlayerState();
            await mSyncContext.Execute(() => PlayerConnected?.Invoke(playerState), channel.ShutdownToken);

            try
            {
                while (true)
                {
                    try
                    {
                        mGameService = new GameService.GameServiceClient(channel);
                        using (var call = mGameService.ConnectAndListenState(new Empty()))
                            using (var stateStream = call.ResponseStream)
                            {
                                while (await stateStream.MoveNext(channel.ShutdownToken))
                                {
                                    channel.ShutdownToken.ThrowIfCancellationRequested();
                                    var state = stateStream.Current;

                                    if (state.Map != null)
                                    {
                                        mapState.State = new MapState(state.Map);
                                    }

                                    if (state.Player != null)
                                    {
                                        playerState.PlayerState = new PlayerState(state.Player);
                                    }

                                    channel.ShutdownToken.ThrowIfCancellationRequested();

                                    if (!mMapLoaded)
                                    {
                                        mMapLoaded = true;
                                        await mSyncContext.Execute(() =>
                                        {
                                            MapLoaded?.Invoke(mapState);
                                            BaseCreated?.Invoke(state.BasePos.ToUnity());
                                        }, channel.ShutdownToken);

                                        var tChat = ListenChat(mGameService, channel);

                                        var t0 = mWorkerCreationStateListener.ListenCreations(mChannel);
                                        var t1 = mBuildingTemplateCreationStateListener.ListenCreations(mChannel);
                                        var t2 = mCentralBuildingCreationStateListener.ListenCreations(mChannel);
                                        var t3 = mMiningCampCreationListener.ListenCreations(mChannel);
                                        var t4 = mBarrakCreationListener.ListenCreations(mChannel);
                                        var t5 = mRangedWarriorCreationStateListener.ListenCreations(mChannel);
                                        var t6 = mMeeleeWarriorCreationStateListener.ListenCreations(mChannel);
                                    }
                                }
                            }

                        break;
                    }
                    catch (RpcException e)
                    {
                        if (e.Status.StatusCode != StatusCode.Unavailable)
                        {
                            throw;
                        }

                        await Task.Delay(TimeSpan.FromSeconds(0.5));
                    }
                }
            }
            catch (Exception e)
            {
                Debug.LogError(e);
                DisconnectedFromServer?.Invoke();
                throw;
            }
        }
 private static void OnMapLoaded(MapLoadedEventArgs e) => MapLoaded?.Invoke(e);
Пример #12
0
 public static void OnMapLoaded(string mapName = "") => MapLoaded?.Invoke(mapName);
Пример #13
0
 private static void Layer_Initialized(object sender, EventArgs e)
 {
     MapLoaded?.Invoke(sender, e);
 }
Пример #14
0
 protected virtual void OnMapLoaded()
 {
     MapLoaded?.Invoke(this, EventArgs.Empty);
 }
Пример #15
0
        public void LoadContent(ContentManager content)
        {
            //i = row y, j column x
            for (int i = 0; i < raw.Count; i++)
            {
                for (int j = 0; j < raw[i].Length; j++)
                {
                    Actor actor = null;
                    using (ContentManager c = new ContentManager(content.ServiceProvider, content.RootDirectory))
                    {
                        switch (raw[i][j])
                        {
                        case 'W':
                        {
                            actor = c.Load <Actor>("Actors/Border");
                            break;
                        }

                        case 'X':
                        {
                            actor  = c.Load <Actor>("Actors/Player");
                            Player = actor;
                            break;
                        }

                        case '.':
                        {
                            actor = c.Load <Actor>("Actors/Dirt");
                            break;
                        }

                        case 'w':
                        {
                            actor = c.Load <Actor>("Actors/Wall");
                            break;
                        }

                        case 'r':
                        {
                            actor = c.Load <Actor>("Actors/Boulder");
                            break;
                        }

                        case 'd':
                        {
                            actor = c.Load <Actor>("Actors/Diamond");
                            break;
                        }

                        case 'P':
                        {
                            actor = c.Load <Actor>("Actors/Exit");
                            break;
                        }
                        }
                    }
                    if (actor != null)
                    {
                        actor.Owner = this;
                        actor.LoadContent(content);
                        actor.GetComponent <RenderableComponent>().DrawColor = ForegroundColor;
                        actor.Position = new Vector2(j * TileDimensions.X, i * TileDimensions.Y);
                        Actors.Add(actor);
                    }
                }
            }
            Actors.Where(x => x.HasComponent <ExitComponent>()).ToList().ForEach(x => x.GetComponent <ExitComponent>().ExitEntered             += ActorMap_ExitEntered);
            Actors.Where(x => x.HasComponent <DestroyableComponent>()).ToList().ForEach(x => x.GetComponent <DestroyableComponent>().Destroyed += ActorMap_ActorDestroyed);
            Actors.Where(x => x.HasComponent <PlayerComponent>()).ToList().ForEach(x => x.GetComponent <PlayerComponent>().PlayerKilled        += ActorMap_PlayerKilled);
            Actors.Where(x => x.HasComponent <CollectableComponent>()).ToList().ForEach(x => x.GetComponent <CollectableComponent>().Collected += ActorMap_Collected);

            //force 1lvl
            Time             = Int32.Parse(TimeValue.Split(" ").FirstOrDefault());
            DiamondsRequired = Int32.Parse(DiamondsRequiredValue.Split(" ").FirstOrDefault());

            Size = new Vector2(Actors.Last().Position.X - Actors[0].Position.X + TileDimensions.X, Actors.Last().Position.Y - Actors[0].Position.Y + TileDimensions.Y);
            InputManager.Instance.OnFlickDown  += Instance_OnFlickDown;
            InputManager.Instance.OnFlickUp    += Instance_OnFlickUp;
            InputManager.Instance.OnFlickLeft  += Instance_OnFlickLeft;
            InputManager.Instance.OnFlickRight += Instance_OnFlickRight;
            MapStartSound = content.Load <Song>("Sounds/MapStart");
            MapEndSound   = content.Load <Song>("Sounds/MapComplete");
            MapLoaded?.Invoke(this, null);
            MediaPlayer.Play(MapStartSound);
        }
Пример #16
0
        private int TryReadPacket()
        {
            BinaryReader br = new BinaryReader(new MemoryStream(received.ToArray()));

            if (received.Count == 0)
            {
                return(0);
            }
            var packetId  = (MinecraftServerPacketId)br.ReadByte();
            int totalread = 1;

            if (packetId != MinecraftServerPacketId.PositionandOrientationUpdate &&
                packetId != MinecraftServerPacketId.PositionUpdate &&
                packetId != MinecraftServerPacketId.OrientationUpdate &&
                packetId != MinecraftServerPacketId.PlayerTeleport &&
                packetId != MinecraftServerPacketId.ExtendedPacketTick)
            {
                Console.WriteLine(Enum.GetName(typeof(MinecraftServerPacketId), packetId));
            }
            switch (packetId)
            {
            case MinecraftServerPacketId.ServerIdentification:
            {
                totalread += 1 + NetworkHelper.StringLength + NetworkHelper.StringLength + 1; if (received.Count < totalread)
                {
                    return(0);
                }
                if (ENABLE_FORTRESS)
                {
                    totalread += NetworkHelper.StringLength; if (received.Count < totalread)
                    {
                        return(0);
                    }
                }
                ServerPlayerIdentification p = new ServerPlayerIdentification();
                p.ProtocolVersion = br.ReadByte();
                string invalidversionstr = "Invalid game version. Local: {0}, Server: {1}";
                if (!ENABLE_FORTRESS)
                {
                    if (!(p.ProtocolVersion == 7 || p.ProtocolVersion == 6))
                    {
                        throw new Exception(string.Format(invalidversionstr,
                                                          "Minecraft 7", "Minecraft " + p.ProtocolVersion));
                    }
                }
                else
                {
                    string servergameversion = NetworkHelper.ReadString64(br);
                    if (p.ProtocolVersion != 200)
                    {
                        servergameversion = "Minecraft " + p.ProtocolVersion;
                    }
                    if (servergameversion != GameVersion.Version)
                    {
                        throw new Exception(string.Format(invalidversionstr, GameVersion.Version, servergameversion));
                    }
                }
                p.ServerName = NetworkHelper.ReadString64(br);
                p.ServerMotd = NetworkHelper.ReadString64(br);
                p.UserType   = br.ReadByte();
                //connected = true;
                this.serverName = p.ServerName;
                this.ServerMotd = p.ServerMotd;
                ChatLog("---Connected---");
            }
            break;

            case MinecraftServerPacketId.Ping:
            {
            }
            break;

            case MinecraftServerPacketId.LevelInitialize:
            {
                receivedMapStream = new MemoryStream();
                InvokeMapLoadingProgress(0, 0);
            }
            break;

            case MinecraftServerPacketId.LevelDataChunk:
            {
                totalread += 2 + 1024 + 1; if (received.Count < totalread)
                {
                    return(0);
                }
                int          chunkLength             = NetworkHelper.ReadInt16(br);
                byte[]       chunkData               = br.ReadBytes(1024);
                BinaryWriter bw1                     = new BinaryWriter(receivedMapStream);
                byte[]       chunkDataWithoutPadding = new byte[chunkLength];
                for (int i = 0; i < chunkLength; i++)
                {
                    chunkDataWithoutPadding[i] = chunkData[i];
                }
                bw1.Write(chunkDataWithoutPadding);
                MapLoadingPercentComplete = br.ReadByte();
                InvokeMapLoadingProgress(MapLoadingPercentComplete, (int)receivedMapStream.Length);
            }
            break;

            case MinecraftServerPacketId.LevelFinalize:
            {
                totalread += 2 + 2 + 2; if (received.Count < totalread)
                {
                    return(0);
                }
                if (ENABLE_FORTRESS)
                {
                    totalread += 4; if (received.Count < totalread)
                    {
                        return(0);
                    }                                                                     //simulationstartframe
                }
                mapreceivedsizex = NetworkHelper.ReadInt16(br);
                mapreceivedsizez = NetworkHelper.ReadInt16(br);
                mapreceivedsizey = NetworkHelper.ReadInt16(br);
                receivedMapStream.Seek(0, SeekOrigin.Begin);
                if (!ENABLE_FORTRESS)
                {
                    MemoryStream decompressed = new MemoryStream(compression.Decompress(receivedMapStream.ToArray()));
                    if (decompressed.Length != mapreceivedsizex * mapreceivedsizey * mapreceivedsizez +
                        (decompressed.Length % 1024))
                    {
                        //throw new Exception();
                        Console.WriteLine("warning: invalid map data size");
                    }
                    byte[, ,] receivedmap = new byte[mapreceivedsizex, mapreceivedsizey, mapreceivedsizez];
                    {
                        BinaryReader br2  = new BinaryReader(decompressed);
                        int          size = NetworkHelper.ReadInt32(br2);
                        for (int z = 0; z < mapreceivedsizez; z++)
                        {
                            for (int y = 0; y < mapreceivedsizey; y++)
                            {
                                for (int x = 0; x < mapreceivedsizex; x++)
                                {
                                    receivedmap[x, y, z] = br2.ReadByte();
                                }
                            }
                        }
                    }
                    MapStoragePortion.UseMap(receivedmap);
                    Map.Map.MapSizeX = receivedmap.GetUpperBound(0) + 1;
                    Map.Map.MapSizeY = receivedmap.GetUpperBound(1) + 1;
                    Map.Map.MapSizeZ = receivedmap.GetUpperBound(2) + 1;
                    Console.WriteLine("Game loaded successfully.");
                }
                else
                {
                    int simulationstartframe = NetworkHelper.ReadInt32(br);
                    gameworld.LoadState(receivedMapStream.ToArray(), simulationstartframe);
                }
                if (MapLoaded != null)
                {
                    MapLoaded.Invoke(this, new MapLoadedEventArgs()
                        {
                        });
                }
                loadedtime = DateTime.Now;
            }
            break;

            case MinecraftServerPacketId.SetBlock:
            {
                int x;
                int y;
                int z;
                if (ENABLE_FORTRESS)
                {
                    throw new Exception("SetBlock packet");        //no such packet.
                }
                else
                {
                    totalread += 2 + 2 + 2 + 1; if (received.Count < totalread)
                    {
                        return(0);
                    }
                    x = NetworkHelper.ReadInt16(br);
                    z = NetworkHelper.ReadInt16(br);
                    y = NetworkHelper.ReadInt16(br);
                }
                byte type = br.ReadByte();
                try { Map.SetTileAndUpdate(new Vector3(x, y, z), type); }
                catch { Console.WriteLine("Cannot update tile!"); }
            }
            break;

            case MinecraftServerPacketId.SpawnPlayer:
            {
                if (ENABLE_FORTRESS)
                {
                    totalread += 1 + NetworkHelper.StringLength + 4 + 4 + 4 + 1 + 1; if (received.Count < totalread)
                    {
                        return(0);
                    }
                }
                else
                {
                    totalread += 1 + NetworkHelper.StringLength + 2 + 2 + 2 + 1 + 1; if (received.Count < totalread)
                    {
                        return(0);
                    }
                }
                byte   playerid   = br.ReadByte();
                string playername = NetworkHelper.ReadString64(br);
                if (ENABLE_FORTRESS && playerid == 255)
                {
                    spawned = true;
                    break;
                }
                connectedplayers.Add(new ConnectedPlayer()
                    {
                        name = playername, id = playerid
                    });
                if (Clients.Players.ContainsKey(playerid))
                {
                    //throw new Exception();
                }
                Clients.Players[playerid]      = new Player();
                Clients.Players[playerid].Name = playername;
                if (ENABLE_FORTRESS && ((DateTime.Now - loadedtime).TotalSeconds > 10))
                {
                    ReadAndUpdatePlayerPosition(br, playerid);
                }
                if (!ENABLE_FORTRESS)
                {
                    ReadAndUpdatePlayerPosition(br, playerid);
                }
                if (playerid == 255)
                {
                    spawned = true;
                }
            }
            break;

            case MinecraftServerPacketId.PlayerTeleport:
            {
                if (ENABLE_FORTRESS)
                {
                    totalread += 1 + (4 + 4 + 4) + 1 + 1; if (received.Count < totalread)
                    {
                        return(0);
                    }
                }
                else
                {
                    totalread += 1 + (2 + 2 + 2) + 1 + 1; if (received.Count < totalread)
                    {
                        return(0);
                    }
                }
                byte playerid = br.ReadByte();
                ReadAndUpdatePlayerPosition(br, playerid);
            }
            break;

            case MinecraftServerPacketId.PositionandOrientationUpdate:
            {
                totalread += 1 + (1 + 1 + 1) + 1 + 1; if (received.Count < totalread)
                {
                    return(0);
                }
                byte    playerid = br.ReadByte();
                float   x        = (float)br.ReadSByte() / 32;
                float   y        = (float)br.ReadSByte() / 32;
                float   z        = (float)br.ReadSByte() / 32;
                byte    heading  = br.ReadByte();
                byte    pitch    = br.ReadByte();
                Vector3 v        = new Vector3(x, y, z);
                UpdatePositionDiff(playerid, v);
            }
            break;

            case MinecraftServerPacketId.PositionUpdate:
            {
                totalread += 1 + 1 + 1 + 1; if (received.Count < totalread)
                {
                    return(0);
                }
                byte    playerid = br.ReadByte();
                float   x        = (float)br.ReadSByte() / 32;
                float   y        = (float)br.ReadSByte() / 32;
                float   z        = (float)br.ReadSByte() / 32;
                Vector3 v        = new Vector3(x, y, z);
                UpdatePositionDiff(playerid, v);
            }
            break;

            case MinecraftServerPacketId.OrientationUpdate:
            {
                totalread += 1 + 1 + 1; if (received.Count < totalread)
                {
                    return(0);
                }
                byte playerid = br.ReadByte();
                byte heading  = br.ReadByte();
                byte pitch    = br.ReadByte();
                Clients.Players[playerid].Heading = heading;
                Clients.Players[playerid].Pitch   = pitch;
            }
            break;

            case MinecraftServerPacketId.DespawnPlayer:
            {
                totalread += 1; if (received.Count < totalread)
                {
                    return(0);
                }
                byte playerid = br.ReadByte();
                for (int i = 0; i < connectedplayers.Count; i++)
                {
                    if (connectedplayers[i].id == playerid)
                    {
                        connectedplayers.RemoveAt(i);
                    }
                }
                Clients.Players.Remove(playerid);
            }
            break;

            case MinecraftServerPacketId.Message:
            {
                totalread += 1 + NetworkHelper.StringLength; if (received.Count < totalread)
                {
                    return(0);
                }
                byte   unused  = br.ReadByte();
                string message = NetworkHelper.ReadString64(br);
                Chatlines.AddChatline(message);
                ChatLog(message);
            }
            break;

            case MinecraftServerPacketId.DisconnectPlayer:
            {
                totalread += NetworkHelper.StringLength; if (received.Count < totalread)
                {
                    return(0);
                }
                string disconnectReason = NetworkHelper.ReadString64(br);
                throw new Exception(disconnectReason);
            }

            case MinecraftServerPacketId.ExtendedPacketCommand:
            {
                totalread += 1 + 4 + 4; if (received.Count < totalread)
                {
                    return(0);
                }
                int playerid = br.ReadByte();
                int cmdframe = NetworkHelper.ReadInt32(br);
                int length   = NetworkHelper.ReadInt32(br);
                totalread += length; if (received.Count < totalread)
                {
                    return(0);
                }
                byte[] cmd = br.ReadBytes(length);
                gameworld.EnqueueCommand(playerid, cmdframe, cmd);
            }
            break;

            case MinecraftServerPacketId.ExtendedPacketTick:
            {
                totalread += 4 + 4; if (received.Count < totalread)
                {
                    return(0);
                }
                int allowedframe = NetworkHelper.ReadInt32(br);
                int hash         = NetworkHelper.ReadInt32(br);

                totalread += 1; if (received.Count < totalread)
                {
                    return(0);
                }
                int clientscount = br.ReadByte();
                totalread += clientscount * (1 + (3 * 4) + 1 + 1); if (received.Count < totalread)
                {
                    return(0);
                }
                Dictionary <int, PlayerPosition> playerpositions = new Dictionary <int, PlayerPosition>();
                for (int i = 0; i < clientscount; i++)
                {
                    byte playerid = br.ReadByte();
                    //copied
                    float x       = (float)((double)NetworkHelper.ReadInt32(br) / 32);
                    float y       = (float)((double)NetworkHelper.ReadInt32(br) / 32);
                    float z       = (float)((double)NetworkHelper.ReadInt32(br) / 32);
                    byte  heading = br.ReadByte();
                    byte  pitch   = br.ReadByte();
                    playerpositions[playerid] = new PlayerPosition()
                    {
                        position = new Vector3(x, y, z), heading = heading, pitch = pitch
                    };
                }
                gameworld.KeyFrame(allowedframe, hash, playerpositions);
            }
            break;

            default:
            {
                throw new Exception("Invalid packet id");
            }
            }
            return(totalread);
        }