// TODO: Change to stream-based loading /// <summary> /// Creates a new ADT object from a file on disk /// </summary> /// <param name="data">Byte array containing ADT data.</param> /// <returns>A parsed ADT file with objects for all chunks</returns> public TerrainTile(byte[] data) { using (MemoryStream ms = new MemoryStream(data)) { using (BinaryReader br = new BinaryReader(ms)) { // In all ADT files, the version chunk and header chunk are at the beginning of the file, // with the header following the version. From them, the rest of the chunks can be // seeked to and read. // Read Version Chunk this.Version = br.ReadIFFChunk <TerrainVersion>(); // Read the header chunk this.Header = br.ReadIFFChunk <TerrainHeader>(); if (this.Header.MapChunkOffsetsOffset > 0) { br.BaseStream.Position = this.Header.MapChunkOffsetsOffset; this.MapChunkOffsets = br.ReadIFFChunk <TerrainMapChunkOffsets>(); } if (this.Header.TexturesOffset > 0) { br.BaseStream.Position = this.Header.TexturesOffset; this.Textures = br.ReadIFFChunk <TerrainTextures>(); } if (this.Header.ModelsOffset > 0) { br.BaseStream.Position = this.Header.ModelsOffset; this.Models = br.ReadIFFChunk <TerrainModels>(); } if (this.Header.ModelIndicesOffset > 0) { br.BaseStream.Position = this.Header.ModelIndicesOffset; this.ModelIndices = br.ReadIFFChunk <TerrainModelIndices>(); } if (this.Header.WorldModelObjectsOffset > 0) { br.BaseStream.Position = this.Header.WorldModelObjectsOffset; this.WorldModelObjects = br.ReadIFFChunk <TerrainWorldModelObjects>(); } if (this.Header.WorldModelObjectIndicesOffset > 0) { br.BaseStream.Position = this.Header.WorldModelObjectIndicesOffset; this.WorldModelObjectIndices = br.ReadIFFChunk <TerrainWorldObjectModelIndices>(); } if (this.Header.LiquidOffset > 0) { br.BaseStream.Position = this.Header.LiquidOffset; this.Liquids = br.ReadIFFChunk <TerrainLiquid>(); // TODO: [#9] Pass in DBC liquid type to load the vertex data } // Read and fill the map chunks foreach (MapChunkOffsetEntry entry in this.MapChunkOffsets.Entries) { br.BaseStream.Position = entry.MapChunkOffset; this.MapChunks.Add(br.ReadIFFChunk <TerrainMapChunk>()); } } } }
private void MakeGame() { var getfile = this.getfile; var gamedata = new GameDataCsv(); var clientgame = w; ICurrentSeason currentseason = clientgame; gamedata.CurrentSeason = currentseason; var network = w; var mapstorage = clientgame; var config3d = new Config3d(); var mapManipulator = new MapManipulator(); var the3d = new The3d(); the3d.d_GetFile = getfile; the3d.d_Config3d = config3d; the3d.d_ViewportSize = w; w.d_The3d = the3d; var localplayerposition = w; var physics = new CharacterPhysics(); var internetgamefactory = this; ICompression compression = new CompressionGzip(); //IsSinglePlayer ? (ICompression)new CompressionGzip() : new CompressionGzip(); network.d_Compression = compression; network.d_ResetMap = this; if (IsSinglePlayer) { var socket = new SocketDummy() { network = this.dummyNetwork }; network.main = socket; } else { network.main = new SocketNet(new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)); } var terrainTextures = new TerrainTextures(); terrainTextures.d_GetFile = getfile; terrainTextures.d_The3d = the3d; bool IsMono = Type.GetType("Mono.Runtime") != null; terrainTextures.d_TextureAtlasConverter = new TextureAtlasConverter(); if (IsMono) { terrainTextures.d_TextureAtlasConverter.d_FastBitmapFactory = () => { return new FastBitmapDummy(); }; } else { terrainTextures.d_TextureAtlasConverter.d_FastBitmapFactory = () => { return new FastBitmap(); }; } terrainTextures.Start(); w.d_TerrainTextures = terrainTextures; var blockrenderertorch = new BlockRendererTorch(); blockrenderertorch.d_TerainRenderer = terrainTextures; blockrenderertorch.d_Data = gamedata; //InfiniteMapChunked map = new InfiniteMapChunked();// { generator = new WorldGeneratorDummy() }; var map = w; var terrainchunktesselator = new TerrainChunkTesselator(); terrainchunktesselator.d_Config3d = config3d; terrainchunktesselator.d_Data = gamedata; terrainchunktesselator.d_MapStorage = clientgame; terrainchunktesselator.d_MapStoragePortion = map; terrainchunktesselator.d_MapStorageLight = clientgame; w.d_TerrainChunkTesselator = terrainchunktesselator; var frustumculling = new FrustumCulling() { d_GetCameraMatrix = the3d }; w.d_Batcher = new MeshBatcher() { d_FrustumCulling = frustumculling }; w.d_FrustumCulling = frustumculling; w.BeforeRenderFrame += (a, b) => { frustumculling.CalcFrustumEquations(); }; terrainchunktesselator.d_BlockRendererTorch = blockrenderertorch; terrainchunktesselator.d_TerrainTextures = terrainTextures; //w.d_Map = clientgame.mapforphysics; w.d_Physics = physics; w.d_Clients = clientgame; w.d_Data = gamedata; w.d_DataMonsters = new GameDataMonsters(getfile); w.d_GetFile = getfile; w.d_Config3d = config3d; w.d_MapManipulator = mapManipulator; w.PickDistance = 4.5f; var skysphere = new SkySphere(); skysphere.d_MeshBatcher = new MeshBatcher() { d_FrustumCulling = new FrustumCullingDummy() }; skysphere.d_LocalPlayerPosition = localplayerposition; skysphere.d_The3d = the3d; w.skysphere = skysphere; var textrenderer = new ManicDigger.Renderers.TextRenderer(); w.d_TextRenderer = textrenderer; Inventory inventory = Inventory.Create(); weapon = new WeaponBlockInfo() { d_Data = gamedata, d_Terrain = terrainTextures, d_Viewport = w, d_Map = clientgame, d_Shadows = w, d_Inventory = inventory, d_LocalPlayerPosition = w }; w.d_Weapon = new WeaponRenderer() { d_Info = weapon, d_BlockRendererTorch = blockrenderertorch, d_LocalPlayerPosition = w }; var playerrenderer = new CharacterRendererMonsterCode(); playerrenderer.Load(new List<string>(MyStream.ReadAllLines(getfile.GetFile("player.mdc")))); w.d_CharacterRenderer = playerrenderer; particle = new ParticleEffectBlockBreak() { d_Data = gamedata, d_Map = clientgame, d_Terrain = terrainTextures }; w.particleEffectBlockBreak = particle; w.ENABLE_FINITEINVENTORY = false; w.d_Shadows = w; clientgame.d_Data = gamedata; clientgame.d_CraftingTableTool = new CraftingTableTool() { d_Map = mapstorage }; clientgame.d_Audio = audio; clientgame.d_RailMapUtil = new RailMapUtil() { d_Data = gamedata, d_MapStorage = clientgame }; clientgame.d_MinecartRenderer = new MinecartRenderer() { d_GetFile = getfile, d_The3d = the3d }; clientgame.d_TerrainTextures = terrainTextures; clientgame.d_GetFile = getfile; var craftingrecipes = new CraftingRecipes(); craftingrecipes.data = gamedata; w.d_CraftingRecipes = craftingrecipes; network.d_CraftingRecipes = craftingrecipes; w.Reset(10 * 1000, 10 * 1000, 128); clientgame.d_Map = map; PlayerSkinDownloader playerskindownloader = new PlayerSkinDownloader(); playerskindownloader.d_Exit = exit; playerskindownloader.d_The3d = the3d; playerskindownloader.skinserver = "http://fragmer.net/md/skins/"; w.playerskindownloader = playerskindownloader; w.d_FpsHistoryGraphRenderer = new HudFpsHistoryGraphRenderer() { d_Draw = the3d, d_ViewportSize = w }; w.d_Screenshot = new Screenshot() { d_GameWindow = maingamewindow }; w.d_FrustumCulling = frustumculling; physics.d_Map = clientgame.mapforphysics; physics.d_Data = gamedata; audio.d_GetFile = getfile; audio.d_GameExit = exit; this.map = map; the3d.d_Terrain = terrainTextures; the3d.d_TextRenderer = textrenderer; w.d_CurrentShadows = this; var sunmoonrenderer = new SunMoonRenderer() { d_Draw2d = the3d, d_LocalPlayerPosition = w, d_GetFile = getfile, d_The3d = the3d }; w.d_SunMoonRenderer = sunmoonrenderer; clientgame.d_SunMoonRenderer = sunmoonrenderer; this.heightmap = new InfiniteMapChunked2d() { d_Map = map }; heightmap.Restart(); network.d_Heightmap = heightmap; this.light = new InfiniteMapChunkedSimple() { d_Map = map }; light.Restart(); this.terrainchunktesselator = terrainchunktesselator; w.d_TerrainChunkTesselator = terrainchunktesselator; terrainchunktesselator.d_Shadows = w; if (fullshadows) { UseShadowsFull(); } else { UseShadowsSimple(); } w.d_HudChat = new ManicDigger.Gui.HudChat() { d_Draw2d = the3d, d_ViewportSize = w }; var dataItems = new GameDataItemsBlocks() { d_Data = gamedata }; var inventoryController = clientgame; var inventoryUtil = new InventoryUtil(); var hudInventory = new HudInventory(); hudInventory.dataItems = dataItems; hudInventory.inventory = inventory; hudInventory.inventoryUtil = inventoryUtil; hudInventory.controller = inventoryController; hudInventory.viewport_size = w; hudInventory.mouse_current = w; hudInventory.the3d = the3d; hudInventory.getfile = getfile; hudInventory.ActiveMaterial = w; hudInventory.viewport3d = w; w.d_Inventory = inventory; w.d_InventoryController = inventoryController; w.d_InventoryUtil = inventoryUtil; inventoryUtil.d_Inventory = inventory; inventoryUtil.d_Items = dataItems; clientgame.d_Inventory = inventory; w.d_HudInventory = hudInventory; if (Debugger.IsAttached) { new DependencyChecker(typeof(InjectAttribute)).CheckDependencies( w, audio, gamedata, clientgame, network, mapstorage, getfile, config3d, mapManipulator, w, the3d, exit, localplayerposition, physics, internetgamefactory, blockrenderertorch, playerrenderer, map, terrainchunktesselator); } }
/// <summary> /// /// </summary> /// <param name="terrainTexture">The texture to apply to the terrain.</param> /// <param name="height">A value in the range [0,1]. terrainTexture will be applied to the Terrain from the height of the preceeding terrainTexture until height.</param> public void AddTerrainTexture(JTerrainTexture terrainTexture, float height) { TerrainTextures.Add(terrainTexture); TerrainHeights[Count] = height * JConfig.MAX_TERRAIN_HEIGHT; Count++; }
private void MakeGame() { var getfile = this.getfile; var gamedata = new GameDataCsv(); var clientgame = w; ICurrentSeason currentseason = clientgame; gamedata.CurrentSeason = currentseason; var network = w; var mapstorage = clientgame; var config3d = new Config3d(); var mapManipulator = new MapManipulator(); var the3d = new The3d(); the3d.d_GetFile = getfile; the3d.d_Config3d = config3d; the3d.d_ViewportSize = w; w.d_The3d = the3d; var localplayerposition = w; var physics = new CharacterPhysics(); var internetgamefactory = this; ICompression compression = new CompressionGzip(); //IsSinglePlayer ? (ICompression)new CompressionGzip() : new CompressionGzip(); network.d_Compression = compression; network.d_ResetMap = this; if (IsSinglePlayer) { var socket = new SocketDummy() { network = this.dummyNetwork }; network.main = socket; } else { network.main = new SocketNet(new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)); } var terrainTextures = new TerrainTextures(); terrainTextures.d_GetFile = getfile; terrainTextures.d_The3d = the3d; bool IsMono = Type.GetType("Mono.Runtime") != null; terrainTextures.d_TextureAtlasConverter = new TextureAtlasConverter(); if (IsMono) { terrainTextures.d_TextureAtlasConverter.d_FastBitmapFactory = () => { return(new FastBitmapDummy()); }; } else { terrainTextures.d_TextureAtlasConverter.d_FastBitmapFactory = () => { return(new FastBitmap()); }; } terrainTextures.Start(); w.d_TerrainTextures = terrainTextures; var blockrenderertorch = new BlockRendererTorch(); blockrenderertorch.d_TerainRenderer = terrainTextures; blockrenderertorch.d_Data = gamedata; //InfiniteMapChunked map = new InfiniteMapChunked();// { generator = new WorldGeneratorDummy() }; var map = w; var terrainchunktesselator = new TerrainChunkTesselator(); terrainchunktesselator.d_Config3d = config3d; terrainchunktesselator.d_Data = gamedata; terrainchunktesselator.d_MapStorage = clientgame; terrainchunktesselator.d_MapStoragePortion = map; terrainchunktesselator.d_MapStorageLight = clientgame; w.d_TerrainChunkTesselator = terrainchunktesselator; var frustumculling = new FrustumCulling() { d_GetCameraMatrix = the3d }; w.d_Batcher = new MeshBatcher() { d_FrustumCulling = frustumculling }; w.d_FrustumCulling = frustumculling; w.BeforeRenderFrame += (a, b) => { frustumculling.CalcFrustumEquations(); }; terrainchunktesselator.d_BlockRendererTorch = blockrenderertorch; terrainchunktesselator.d_TerrainTextures = terrainTextures; //w.d_Map = clientgame.mapforphysics; w.d_Physics = physics; w.d_Clients = clientgame; w.d_Data = gamedata; w.d_DataMonsters = new GameDataMonsters(getfile); w.d_GetFile = getfile; w.d_Config3d = config3d; w.d_MapManipulator = mapManipulator; w.PickDistance = 4.5f; var skysphere = new SkySphere(); skysphere.d_MeshBatcher = new MeshBatcher() { d_FrustumCulling = new FrustumCullingDummy() }; skysphere.d_LocalPlayerPosition = localplayerposition; skysphere.d_The3d = the3d; w.skysphere = skysphere; var textrenderer = new ManicDigger.Renderers.TextRenderer(); w.d_TextRenderer = textrenderer; Inventory inventory = Inventory.Create(); weapon = new WeaponBlockInfo() { d_Data = gamedata, d_Terrain = terrainTextures, d_Viewport = w, d_Map = clientgame, d_Shadows = w, d_Inventory = inventory, d_LocalPlayerPosition = w }; w.d_Weapon = new WeaponRenderer() { d_Info = weapon, d_BlockRendererTorch = blockrenderertorch, d_LocalPlayerPosition = w }; var playerrenderer = new CharacterRendererMonsterCode(); playerrenderer.Load(new List <string>(MyStream.ReadAllLines(getfile.GetFile("player.mdc")))); w.d_CharacterRenderer = playerrenderer; particle = new ParticleEffectBlockBreak() { d_Data = gamedata, d_Map = clientgame, d_Terrain = terrainTextures }; w.particleEffectBlockBreak = particle; w.ENABLE_FINITEINVENTORY = false; w.d_Shadows = w; clientgame.d_Data = gamedata; clientgame.d_CraftingTableTool = new CraftingTableTool() { d_Map = mapstorage }; clientgame.d_Audio = audio; clientgame.d_RailMapUtil = new RailMapUtil() { d_Data = gamedata, d_MapStorage = clientgame }; clientgame.d_MinecartRenderer = new MinecartRenderer() { d_GetFile = getfile, d_The3d = the3d }; clientgame.d_TerrainTextures = terrainTextures; clientgame.d_GetFile = getfile; var craftingrecipes = new CraftingRecipes(); craftingrecipes.data = gamedata; w.d_CraftingRecipes = craftingrecipes; network.d_CraftingRecipes = craftingrecipes; w.Reset(10 * 1000, 10 * 1000, 128); clientgame.d_Map = map; PlayerSkinDownloader playerskindownloader = new PlayerSkinDownloader(); playerskindownloader.d_Exit = exit; playerskindownloader.d_The3d = the3d; playerskindownloader.skinserver = "http://fragmer.net/md/skins/"; w.playerskindownloader = playerskindownloader; w.d_FpsHistoryGraphRenderer = new HudFpsHistoryGraphRenderer() { d_Draw = the3d, d_ViewportSize = w }; w.d_Screenshot = new Screenshot() { d_GameWindow = maingamewindow }; w.d_FrustumCulling = frustumculling; physics.d_Map = clientgame.mapforphysics; physics.d_Data = gamedata; audio.d_GetFile = getfile; audio.d_GameExit = exit; this.map = map; the3d.d_Terrain = terrainTextures; the3d.d_TextRenderer = textrenderer; w.d_CurrentShadows = this; var sunmoonrenderer = new SunMoonRenderer() { d_Draw2d = the3d, d_LocalPlayerPosition = w, d_GetFile = getfile, d_The3d = the3d }; w.d_SunMoonRenderer = sunmoonrenderer; clientgame.d_SunMoonRenderer = sunmoonrenderer; this.heightmap = new InfiniteMapChunked2d() { d_Map = map }; heightmap.Restart(); network.d_Heightmap = heightmap; this.light = new InfiniteMapChunkedSimple() { d_Map = map }; light.Restart(); this.terrainchunktesselator = terrainchunktesselator; w.d_TerrainChunkTesselator = terrainchunktesselator; terrainchunktesselator.d_Shadows = w; if (fullshadows) { UseShadowsFull(); } else { UseShadowsSimple(); } w.d_HudChat = new ManicDigger.Gui.HudChat() { d_Draw2d = the3d, d_ViewportSize = w }; var dataItems = new GameDataItemsBlocks() { d_Data = gamedata }; var inventoryController = clientgame; var inventoryUtil = new InventoryUtil(); var hudInventory = new HudInventory(); hudInventory.dataItems = dataItems; hudInventory.inventory = inventory; hudInventory.inventoryUtil = inventoryUtil; hudInventory.controller = inventoryController; hudInventory.viewport_size = w; hudInventory.mouse_current = w; hudInventory.the3d = the3d; hudInventory.getfile = getfile; hudInventory.ActiveMaterial = w; hudInventory.viewport3d = w; w.d_Inventory = inventory; w.d_InventoryController = inventoryController; w.d_InventoryUtil = inventoryUtil; inventoryUtil.d_Inventory = inventory; inventoryUtil.d_Items = dataItems; clientgame.d_Inventory = inventory; w.d_HudInventory = hudInventory; if (Debugger.IsAttached) { new DependencyChecker(typeof(InjectAttribute)).CheckDependencies( w, audio, gamedata, clientgame, network, mapstorage, getfile, config3d, mapManipulator, w, the3d, exit, localplayerposition, physics, internetgamefactory, blockrenderertorch, playerrenderer, map, terrainchunktesselator); } }
// Use this for initialization void Start() { a = GetComponent <AudioSource>(); terrain = GetComponent <TerrainTextures>(); }