예제 #1
0
        private void HandleClientConnected(NetIncomingMessage msg)
        {
            baselineSnapshotMap.Add(msg.SenderConnection, 0);

            // Send the world header to the newly connected client
            NetOutgoingMessage sendMsg      = peer.CreateMessage();
            WorldManager       worldManager = application.GetCurrentWorldManager();

            if (worldManager != null)
            {
                WorldHeader header = worldManager.GetWorldHeader();
                sendMsg.Write((byte)0);    //message type
                sendMsg.Write(header.name);
                sendMsg.Write(header.width);
                sendMsg.Write(header.height);
                sendMsg.Write(header.spawnArea.X);
                sendMsg.Write(header.spawnArea.Y);

                peer.SendMessage(sendMsg, msg.SenderConnection, NetDeliveryMethod.ReliableOrdered);
            }
            else
            {
                msg.SenderConnection.Disconnect("The host world is not yet loaded!");
            }
        }
예제 #2
0
        private void ProcessDataMessage(NetIncomingMessage msg)
        {
            byte msgType = msg.ReadByte();

            switch (msgType)
            {
            case 0:
                // World Details
                // string = world name
                // string = version number
                // int = width
                // int = height
                // int spawn X
                // int spawn Y

                WorldHeader header = new WorldHeader();
                header.name        = msg.ReadString();
                header.width       = msg.ReadInt32();
                header.height      = msg.ReadInt32();
                header.spawnArea.X = msg.ReadInt32();
                header.spawnArea.Y = msg.ReadInt32();

                WorldDetailsReceived(header);

                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
예제 #3
0
 public BackwardsScanner(FileStream str, WorldHeader head)
 {
     stream     = str;
     MaxX       = head.MaxTiles.X;
     MaxY       = head.MaxTiles.Y;
     header     = head;
     backReader = new BackwardsBinaryReader(stream);
 }
예제 #4
0
 public BackwardsScanner(FileStream str, WorldHeader head)
 {
     stream = str;
     MaxX = head.MaxTiles.X;
     MaxY = head.MaxTiles.Y;
     header = head;
     backReader = new BackwardsBinaryReader(stream);
 }
예제 #5
0
        public void Convert(byte[] wldData, IDictionary <string, byte[]> objectFiles)
        {
            s3d = objectFiles;

            using (var input = new BinaryReader(new MemoryStream(wldData)))
            {
                Header = new WorldHeader(input);

                if (0x54503D02 != Header.magic)
                {
                    throw new FormatException("Expected magic (0x54503D02) not found.");
                }

                // Get the string table.
                _stringTableHash = GenerateStringTableHash(input.ReadBytes(Header.stringHashSize).DecodeString());

                // Get all fragments from this file.
                GetFragments(input);

                // Clear the values, but not the keys.
                foreach (var v in byType)
                {
                    v.Value.Clear();
                }

                var nfrags = new Dictionary <int, object>();
                var nnames = new Dictionary <string, object>();

                foreach (var frag in frags.Values.OfType <Tuple <int, string, uint, object> >())
                {
                    nfrags[frag.Item1] = nnames[frag.Item2] = frag.Item4;
                    byType[frag.Item3].Add(frag.Item4);
                }

                frags = nfrags;
                names = nnames;
                baked = true;

                //Console.UnityEngine.Debug.Log(
                //    $"fragtypes ({byType.Keys.Count}): {byType.Aggregate("", (current, v) => current + $",'{v.Key:X2}'").TrimStart(',')}");
            }
        }
예제 #6
0
파일: World.cs 프로젝트: jordsti/TPulse
        private void ReadHeader()
        {
            Int32 version = reader.ReadInt32();
            Int32 x, y, w, h;

            if (bw != null)
                bw.ReportProgress((Int32)(((Single)progressPosition / stream.Length) * readWorldPerc)
                    , "Reading Header");

            header = new WorldHeader();

            header.ReleaseNumber = version;
            header.Name = reader.ReadString();
            header.Id = reader.ReadInt32();
            x = reader.ReadInt32();
            w = reader.ReadInt32();
            y = reader.ReadInt32();
            h = reader.ReadInt32();

            header.WorldCoords = new Rect(x, w, y, h);

            y = reader.ReadInt32();
            x = reader.ReadInt32();

            MaxX = x;
            MaxY = y;
            header.MaxTiles = new Point(x, y);

            header.SpawnPoint = new Point(reader.ReadInt32(), reader.ReadInt32());
            header.SurfaceLevel = reader.ReadDouble();
            header.RockLayer = reader.ReadDouble();
            header.TemporaryTime = reader.ReadDouble();
            header.IsDayTime = reader.ReadBoolean();
            header.MoonPhase = reader.ReadInt32();
            header.IsBloodMoon = reader.ReadBoolean();
            header.DungeonPoint = new Point(reader.ReadInt32(), reader.ReadInt32());
            header.IsBoss1Dead = reader.ReadBoolean();
            header.IsBoss2Dead = reader.ReadBoolean();
            header.IsBoss3Dead = reader.ReadBoolean();
            if (version >= 0x24)
            {
                header.IsGoblinSaved = reader.ReadBoolean();
                header.IsWizardSaved = reader.ReadBoolean();
                header.IsMechanicSaved = reader.ReadBoolean();
                header.IsGoblinArmyDefeated = reader.ReadBoolean();
                header.IsClownDefeated = reader.ReadBoolean();
            }
            if (version >= 0x25)
            {
                header.IsFrostDefeated = reader.ReadBoolean();
            }
            header.IsShadowOrbSmashed = reader.ReadBoolean();
            header.IsMeteorSpawned = reader.ReadBoolean();
            header.ShadowOrbsSmashed = reader.ReadByte();

            if (version >= 0x24)
            {
                header.AltarsDestroyed = reader.ReadInt32();
                header.HardMode = reader.ReadBoolean();
            }

            header.InvasionDelay = reader.ReadInt32();
            header.InvasionSize = reader.ReadInt32();
            header.InvasionType = reader.ReadInt32();
            header.InvasionPointX = reader.ReadDouble();

            posTiles = stream.Position;
            progressPosition = stream.Position;
        }
예제 #7
0
파일: World.cs 프로젝트: jordsti/TPulse
        public void Clear()
        {
            header = new WorldHeader();
            tiles = null;
            chests = null;
            signs = null;
            footer = null;

            posChests = 0;
            posEnd = 0;
            posFooter = 0;
            posNpcs = 0;
            posSigns = 0;
            posTiles = 0;

            MaxX = 0;
            MaxY = 0;
            progress = 0;

            if (reader != null)
            {
                reader.Close();
                reader = null;
            }

            if (stream != null)
                stream = null;

            if (buffReader != null)
                buffReader = null;

            if (bw != null)
                bw = null;
        }
예제 #8
0
        private void ReadHeader(World world)
        {
            version         = reader.ReadInt32();
            sectionCount    = reader.ReadInt16();
            sectionPointers = new int[sectionCount];
            for (int i = 0; i < sectionCount; i++)
            {
                sectionPointers[i] = reader.ReadInt32();
            }
            tiletypeCount  = reader.ReadInt16();
            tileImportance = new bool[tiletypeCount];
            byte mask  = 0x80;
            byte flags = 0;

            for (int i = 0; i < tiletypeCount; i++)
            {
                if (mask == 0x80)
                {
                    flags = reader.ReadByte();
                    mask  = 0x01;
                }
                else
                {
                    mask <<= 1;
                }

                if ((flags & mask) == mask)
                {
                    tileImportance[i] = true;
                }
            }
            int x, y, w, h;

            var header = new WorldHeader();

            // header.ReleaseNumber = version;
            header.Name = reader.ReadString();
            header.Id   = reader.ReadInt32();
            x           = reader.ReadInt32();
            w           = reader.ReadInt32();
            y           = reader.ReadInt32();
            h           = reader.ReadInt32();

            header.WorldCoords = new Rect(x, w, y, h);

            y = reader.ReadInt32();
            x = reader.ReadInt32();
            header.MaxTiles = new Point(x, y);

            header.TreeX         = new int[3];
            header.TreeStyle     = new int[4];
            header.CaveBackX     = new int[3];
            header.CaveBackStyle = new int[4];

            if (version >= 0x3F)
            {
                header.MoonType = reader.ReadByte();
                for (int i = 0; i < 3; i++)
                {
                    header.TreeX[i] = reader.ReadInt32();
                }
                for (int i = 0; i < 4; i++)
                {
                    header.TreeStyle[i] = reader.ReadInt32();
                }
                for (int i = 0; i < 3; i++)
                {
                    header.CaveBackX[i] = reader.ReadInt32();
                }
                for (int i = 0; i < 4; i++)
                {
                    header.CaveBackStyle[i] = reader.ReadInt32();
                }
                header.IceBackStyle    = reader.ReadInt32();
                header.JungleBackStyle = reader.ReadInt32();
                header.HellBackStyle   = reader.ReadInt32();
            }


            header.SpawnPoint    = new Point(reader.ReadInt32(), reader.ReadInt32());
            header.SurfaceLevel  = reader.ReadDouble();
            header.RockLayer     = reader.ReadDouble();
            header.TemporaryTime = reader.ReadDouble();
            header.IsDayTime     = reader.ReadBoolean();
            header.MoonPhase     = reader.ReadInt32();
            header.IsBloodMoon   = reader.ReadBoolean();
            if (version >= 70)
            {
                header.IsEclipse = reader.ReadBoolean();
            }
            header.DungeonPoint = new Point(reader.ReadInt32(), reader.ReadInt32());
            if (version >= 66)
            {
                header.Crimson = reader.ReadBoolean();
            }
            header.IsBoss1Dead = reader.ReadBoolean();
            header.IsBoss2Dead = reader.ReadBoolean();
            header.IsBoss3Dead = reader.ReadBoolean();
            if (version >= 66)
            {
                header.IsQueenBeeDead    = reader.ReadBoolean();
                header.IsMechBoss1Dead   = reader.ReadBoolean();
                header.IsMechBoss2Dead   = reader.ReadBoolean();
                header.IsMechBoss3Dead   = reader.ReadBoolean();
                header.IsMechBossAnyDead = reader.ReadBoolean();
                header.IsPlantBossDead   = reader.ReadBoolean();
                header.IsGolemBossDead   = reader.ReadBoolean();
            }
            if (version >= 0x24)
            {
                header.IsGoblinSaved        = reader.ReadBoolean();
                header.IsWizardSaved        = reader.ReadBoolean();
                header.IsMechanicSaved      = reader.ReadBoolean();
                header.IsGoblinArmyDefeated = reader.ReadBoolean();
                header.IsClownDefeated      = reader.ReadBoolean();
            }
            if (version >= 0x25)
            {
                header.IsFrostDefeated = reader.ReadBoolean();
            }
            if (version >= 66)
            {
                header.IsPiratesDefeated = reader.ReadBoolean();
            }

            header.IsShadowOrbSmashed = reader.ReadBoolean();
            header.IsMeteorSpawned    = reader.ReadBoolean();
            header.ShadowOrbsSmashed  = reader.ReadByte();

            if (version >= 0x24)
            {
                header.AltarsDestroyed = reader.ReadInt32();
                header.HardMode        = reader.ReadBoolean();
            }

            header.InvasionDelay  = reader.ReadInt32();
            header.InvasionSize   = reader.ReadInt32();
            header.InvasionType   = reader.ReadInt32();
            header.InvasionPointX = reader.ReadDouble();

            header.OreTiers = new int[3];
            header.Styles   = new byte[8];
            if (version >= 66)
            {
                header.IsRaining = reader.ReadBoolean();
                header.RainTime  = reader.ReadInt32();
                header.MaxRain   = reader.ReadSingle();

                for (int i = 0; i < 3; i++)
                {
                    header.OreTiers[i] = reader.ReadInt32();
                }

                for (int i = 0; i < 8; i++)
                {
                    header.Styles[i] = reader.ReadByte();
                }

                header.CloudsActive = reader.ReadInt32();
                header.NumClouds    = reader.ReadInt16();
                header.WindSpeed    = reader.ReadSingle();
            }
            else if (version >= 24)
            {
                if (header.AltarsDestroyed == 0)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        header.OreTiers[i] = -1;
                    }
                }
                else
                {
                    header.OreTiers[1] = 107;
                    header.OreTiers[1] = 108;
                    header.OreTiers[1] = 111;
                }
            }

            world.Header = header;
        }
예제 #9
0
 private void OnWorldHeaderReceived(WorldHeader header)
 {
     map.GenerateEmptyWorld(header);
     OnLoadMapCompleteHandler(null, null);
 }