31 Commits
Author SHA1 Message Date
brausjonas acff35359f Update Player.cs 2022-05-16 01:31:19 +02:00
brausjonas d7fb25697c Merge branch 'main' of https://github.com/jonasbraus/Minecraft 2022-05-16 01:27:52 +02:00
brausjonas 6c03da9c1a Controller Support 2022-05-16 01:27:38 +02:00
Noah 926665d210 Build Bug Fix 2022-05-16 01:17:41 +02:00
Noah 38650d2f16 Merge branch 'main' of https://github.com/jonasbraus/Minecraft 2022-05-16 01:00:33 +02:00
Noah 92fd42acb6 Choose Block to build 2022-05-16 01:00:30 +02:00
brausjonas ad2ad89fec World rendering Issue 2022-05-16 00:45:25 +02:00
brausjonas 2da20b9d79 Dead Sync and Timescale Bug Fix 2022-05-16 00:41:42 +02:00
Noah c48efb161a Save World on Request 2022-05-16 00:22:26 +02:00
Noah 386ffd12b5 Merge branch 'main' of https://github.com/jonasbraus/Minecraft 2022-05-16 00:16:53 +02:00
Noah 768f259d24 Manually Save 2022-05-16 00:16:46 +02:00
brausjonas 86149a472b datapath fix 2022-05-16 00:04:14 +02:00
brausjonas 798a6dca3a Bug Fixing 2022-05-16 00:01:23 +02:00
brausjonas 2baee3c197 Merge branch 'main' of https://github.com/jonasbraus/Minecraft 2022-05-15 23:41:02 +02:00
brausjonas b3dae87b64 Update World 2022-05-15 23:40:50 +02:00
Noah 46b68c71c9 Trees
Randowm Tree Colonies
2022-05-15 23:40:27 +02:00
Noah 49c1cccbb5 Merge branch 'main' of https://github.com/jonasbraus/Minecraft 2022-05-15 21:52:14 +02:00
Noah d4d6e9eb92 Implemented Sneaking 2022-05-15 21:52:04 +02:00
brausjonas a047209e95 Merge branch 'main' of https://github.com/jonasbraus/Minecraft 2022-05-15 21:49:58 +02:00
brausjonas 11c398d9e5 Transparent blocks 2022-05-15 21:49:50 +02:00
Noah 66c2341066 Implemented Sprinting 2022-05-15 21:49:38 +02:00
Noah 61b6eb2ec3 Merge branch 'main' of https://github.com/jonasbraus/Minecraft 2022-05-15 21:12:14 +02:00
Noah 6977d60387 Dead Screen 2022-05-15 21:11:58 +02:00
brausjonas 3fca2a10eb Merge branch 'main' of https://github.com/jonasbraus/Minecraft 2022-05-15 21:05:04 +02:00
brausjonas e9f9217d6c Default World Random gen 2022-05-15 21:03:28 +02:00
Noah bd4bd724d4 Merge branch 'main' of https://github.com/jonasbraus/Minecraft 2022-05-15 21:00:56 +02:00
Noah 0292debae7 Dead Screen
Dead Screen (missing the sync to the Server)
2022-05-15 20:58:58 +02:00
brausjonas eb986a603e World 2022-05-15 20:58:23 +02:00
brausjonas f47cd01cac World 2022-05-15 20:36:13 +02:00
brausjonas a1232b2b12 Random world gen 2022-05-15 20:10:23 +02:00
brausjonas 0a0340d316 Random world gen 2022-05-15 19:58:14 +02:00
19 changed files with 2000 additions and 91 deletions
+6 -5
View File
@@ -9,12 +9,13 @@ Material:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_Name: Blocks m_Name: Blocks
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords: m_ShaderKeywords: _ALPHATEST_ON
m_LightmapFlags: 4 m_LightmapFlags: 4
m_EnableInstancingVariants: 0 m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0 m_DoubleSidedGI: 0
m_CustomRenderQueue: -1 m_CustomRenderQueue: 2450
stringTagMap: {} stringTagMap:
RenderType: TransparentCutout
disabledShaderPasses: [] disabledShaderPasses: []
m_SavedProperties: m_SavedProperties:
serializedVersion: 3 serializedVersion: 3
@@ -57,14 +58,14 @@ Material:
m_Offset: {x: 0, y: 0} m_Offset: {x: 0, y: 0}
m_Floats: m_Floats:
- _BumpScale: 1 - _BumpScale: 1
- _Cutoff: 0.5 - _Cutoff: 1
- _DetailNormalMapScale: 1 - _DetailNormalMapScale: 1
- _DstBlend: 0 - _DstBlend: 0
- _GlossMapScale: 1 - _GlossMapScale: 1
- _Glossiness: 0 - _Glossiness: 0
- _GlossyReflections: 1 - _GlossyReflections: 1
- _Metallic: 0 - _Metallic: 0
- _Mode: 0 - _Mode: 1
- _OcclusionStrength: 1 - _OcclusionStrength: 1
- _Parallax: 0.02 - _Parallax: 0.02
- _SmoothnessTextureChannel: 0 - _SmoothnessTextureChannel: 0
@@ -0,0 +1,78 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Invisible
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords: _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: be5ce586e1f1d9a43aea5965b6e5ea02, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.995
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 1
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 0}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
m_BuildTextureStacks: []
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 204bd9a43c6ebf6489beeea547931033
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
+7 -7
View File
@@ -240,7 +240,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -149.2, y: -56.1} m_AnchoredPosition: {x: -149.2, y: -78.60002}
m_SizeDelta: {x: 160, y: 30} m_SizeDelta: {x: 160, y: 30}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &71764842 --- !u!114 &71764842
@@ -480,7 +480,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -149.19998, y: -101.5} m_AnchoredPosition: {x: -149.19998, y: -124.000015}
m_SizeDelta: {x: 160, y: 30} m_SizeDelta: {x: 160, y: 30}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &854417905 --- !u!114 &854417905
@@ -561,7 +561,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 105.799995, y: -56.099995} m_AnchoredPosition: {x: 105.799995, y: -78.60001}
m_SizeDelta: {x: 297.6238, y: 30} m_SizeDelta: {x: 297.6238, y: 30}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1047272871 --- !u!114 &1047272871
@@ -794,7 +794,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 105.80006, y: -10.699997} m_AnchoredPosition: {x: 105.80006, y: -33.200016}
m_SizeDelta: {x: 297.6238, y: 30} m_SizeDelta: {x: 297.6238, y: 30}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1174182476 --- !u!114 &1174182476
@@ -948,7 +948,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0} m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: -105.899994, y: 54} m_AnchoredPosition: {x: -105.899994, y: 43}
m_SizeDelta: {x: 160, y: 45.3632} m_SizeDelta: {x: 160, y: 45.3632}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1279274160 --- !u!114 &1279274160
@@ -1239,7 +1239,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 105.80001, y: -101.499985} m_AnchoredPosition: {x: 105.80001, y: -124}
m_SizeDelta: {x: 297.6238, y: 30} m_SizeDelta: {x: 297.6238, y: 30}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1603203176 --- !u!114 &1603203176
@@ -1533,7 +1533,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -149.19998, y: -10.699997} m_AnchoredPosition: {x: -149.19998, y: -33.200016}
m_SizeDelta: {x: 160, y: 30} m_SizeDelta: {x: 160, y: 30}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1783690559 --- !u!114 &1783690559
@@ -81,6 +81,19 @@ public class Chunk
triangleIndex++; triangleIndex++;
} }
AddUV(textures[f]);
}
else if(world.GetBlockID(new Vector3(x + Data.faceChecks[f].x + chunkPosition.x * Data.chunkWidth,
y + Data.faceChecks[f].y,
z + Data.faceChecks[f].z + chunkPosition.z * Data.chunkWidth)) == 6)
{
for (int v = 0; v < 6; v++)
{
vertices.Add(Data.vertices[Data.triangles[f, v]] + new Vector3(x, y, z));
triangles.Add(triangleIndex);
triangleIndex++;
}
AddUV(textures[f]); AddUV(textures[f]);
} }
} }
@@ -1,5 +1,7 @@
using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.IO; using System.IO;
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
@@ -252,12 +254,22 @@ public class Client
Send(new byte[] { 3, (byte)chunk.x, (byte)chunk.z, xInChunk, yInChunk, zInChunk, blockID }); Send(new byte[] { 3, (byte)chunk.x, (byte)chunk.z, xInChunk, yInChunk, zInChunk, blockID });
} }
public void SendDeadMessage()
{
Send(new byte[]{10});
}
//default send method //default send method
private void Send(byte[] data) private void Send(byte[] data)
{ {
client.Send(data, data.Length); client.Send(data, data.Length);
} }
public void SaveWorld()
{
Send(new byte[]{9});
}
public void Disconnect() public void Disconnect()
{ {
Send(new byte[] { 4 }); Send(new byte[] { 4 });
+92 -11
View File
@@ -7,7 +7,10 @@ public class Player : MonoBehaviour
{ {
//game //game
[SerializeField] private float mouseSpeed; [SerializeField] private float mouseSpeed;
[SerializeField] private float walkSpeed = 5; [SerializeField] private float defaultSpeed = 5;
[SerializeField] private float sprintSpeed = 8;
[SerializeField] private float sneakSpeed = 2;
private float walkSpeed;
[SerializeField] private float jumpForce; [SerializeField] private float jumpForce;
[SerializeField] private World world; [SerializeField] private World world;
private float playerWidth = 0.15f; private float playerWidth = 0.15f;
@@ -21,12 +24,15 @@ public class Player : MonoBehaviour
private float verticalMomentum = 0; private float verticalMomentum = 0;
private bool jumpRequest; private bool jumpRequest;
private bool isGrounded = true; private bool isGrounded = true;
private float lastTriggerR = 0, lastTriggerL = 0;
private float gravity = -20f; private float gravity = -20f;
private Camera camera = null; private Camera camera = null;
private Vector3 lastPosition = new Vector3(); private Vector3 lastPosition = new Vector3();
private Quaternion lastRotation = new Quaternion(); private Quaternion lastRotation = new Quaternion();
private byte currentBlock = 1;
//network //network
private Client client = null; private Client client = null;
@@ -37,8 +43,9 @@ public class Player : MonoBehaviour
//lock the cursor //lock the cursor
Cursor.lockState = CursorLockMode.Locked; Cursor.lockState = CursorLockMode.Locked;
camera = GetComponentInChildren<Camera>(); camera = GetComponentInChildren<Camera>();
transform.position = new Vector3((byte)transform.position.x, transform.position = GetDefaultPlayerPosition();
world.GetHeight((byte)transform.position.x, (byte)transform.position.z) + 2, (byte)transform.position.z);
walkSpeed = defaultSpeed;
} }
private void Jump() private void Jump()
@@ -87,6 +94,28 @@ public class Player : MonoBehaviour
mouseX = Input.GetAxis("Mouse X"); mouseX = Input.GetAxis("Mouse X");
mouseY = Input.GetAxis("Mouse Y"); mouseY = Input.GetAxis("Mouse Y");
//Sprinting
if (Input.GetKeyDown(KeyCode.LeftShift) || Input.GetButtonDown("Left Stick Button"))
{
walkSpeed = sprintSpeed;
}
if (Input.GetKeyUp(KeyCode.LeftShift) || Input.GetButtonUp("Left Stick Button"))
{
walkSpeed = defaultSpeed;
}
//Sneaking
if (Input.GetKeyDown(KeyCode.LeftControl))
{
walkSpeed = sneakSpeed;
}
if (Input.GetKeyUp(KeyCode.LeftControl))
{
walkSpeed = defaultSpeed;
}
if (isGrounded && Input.GetButton("Jump")) if (isGrounded && Input.GetButton("Jump"))
{ {
jumpRequest = true; jumpRequest = true;
@@ -96,29 +125,75 @@ public class Player : MonoBehaviour
rotX -= mouseY * 1.4f; rotX -= mouseY * 1.4f;
rotX = Mathf.Clamp(rotX, -90, 90); rotX = Mathf.Clamp(rotX, -90, 90);
camera.transform.localRotation = Quaternion.Euler(rotX, 0, 0); camera.transform.localRotation = Quaternion.Euler(rotX * Time.timeScale, 0, 0);
transform.Rotate(0, mouseX, 0); transform.Rotate(0, mouseX * Time.timeScale, 0);
//send destroy block request to server //send destroy block request to server
if (Input.GetMouseButtonDown(0)) if (Input.GetMouseButtonDown(0) || (Input.GetAxis("Right Trigger") > 0 && lastTriggerR == 0))
{ {
if (Physics.Raycast(camera.transform.position, camera.transform.forward, out RaycastHit hit)) if (Physics.Raycast(camera.transform.position, camera.transform.forward, out RaycastHit hit, 8))
{ {
hit.point += camera.transform.forward / 10; hit.point += camera.transform.forward / 10;
client.EditBlock(hit.point, 0); client.EditBlock(hit.point, 0);
} }
} }
//send build block request to server lastTriggerR = Input.GetAxis("Right Trigger");
if (Input.GetMouseButtonDown(1))
if (currentBlock == 1)
{ {
if (Physics.Raycast(camera.transform.position, camera.transform.forward, out RaycastHit hit)) if (Input.GetAxisRaw("Mouse ScrollWheel") < 0)
{
currentBlock = (byte)(world.blockData.Length - 1);
}
else
{
currentBlock += (byte)(Input.GetAxisRaw("Mouse ScrollWheel") * 10);
}
}
else if (currentBlock == world.blockData.Length - 1)
{
if (Input.GetAxisRaw("Mouse ScrollWheel") > 0)
{
currentBlock = (byte)(1);
}
else
{
currentBlock += (byte)(Input.GetAxisRaw("Mouse ScrollWheel") * 10);
}
}
else
{
currentBlock += (byte)(Input.GetAxisRaw("Mouse ScrollWheel") * 10);
}
//send build block request to server
if (Input.GetMouseButtonDown(1) || (Input.GetAxis("Left Trigger") > 0 && lastTriggerL == 0))
{
if (Physics.Raycast(camera.transform.position, camera.transform.forward, out RaycastHit hit, 8))
{ {
hit.point -= camera.transform.forward / 10; hit.point -= camera.transform.forward / 10;
client.EditBlock(hit.point, 4); client.EditBlock(hit.point, currentBlock);
} }
} }
lastTriggerL = Input.GetAxis("Left Trigger");
if (transform.position.y < 0)
{
if(Time.timeScale > 0)
{
world.ShowDeadScreen();
}
}
if (Input.GetKeyDown(KeyCode.Escape))
{
world.ShowPauseScreen();
}
} }
private void CalculateVelocity() private void CalculateVelocity()
@@ -289,5 +364,11 @@ public class Player : MonoBehaviour
this.rotation = rotation; this.rotation = rotation;
} }
} }
public Vector3 GetDefaultPlayerPosition()
{
return new Vector3((byte)transform.position.x,
world.GetHeight((byte)transform.position.x, (byte)transform.position.z) + 2, (byte)transform.position.z);
}
} }
+102 -48
View File
@@ -1,7 +1,9 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading;
using UnityEngine; using UnityEngine;
using UnityEngine.SceneManagement;
public class World : MonoBehaviour public class World : MonoBehaviour
{ {
@@ -17,12 +19,18 @@ public class World : MonoBehaviour
private Queue<Player.PlayerRotationsUpdateData> playersRotationsToUpdate = private Queue<Player.PlayerRotationsUpdateData> playersRotationsToUpdate =
new Queue<Player.PlayerRotationsUpdateData>(); new Queue<Player.PlayerRotationsUpdateData>();
private bool backToMenuRequest = false;
[SerializeField] private Player player;
[SerializeField] private GameObject deadScreen;
[SerializeField] private GameObject pauseScreen;
//chunks //chunks
private Chunk[,] chunks; private Chunk[,] chunks;
private Queue<ChunkCoord> chunksToUpdate = new Queue<ChunkCoord>(); private Queue<ChunkCoord> chunksToUpdate = new Queue<ChunkCoord>();
//blocks //blocks
[SerializeField] private BlockData[] blockData; [SerializeField] public BlockData[] blockData;
//network //network
private Client client; private Client client;
@@ -91,6 +99,12 @@ public class World : MonoBehaviour
g.transform.rotation = data.rotation; g.transform.rotation = data.rotation;
} }
} }
//go bock to menu
if (backToMenuRequest)
{
SceneManager.LoadScene("Scenes/Login", LoadSceneMode.Single);
}
} }
//enqueue player position update to list //enqueue player position update to list
@@ -138,49 +152,12 @@ public class World : MonoBehaviour
} }
} }
//return the ID of a block
public byte GetBlockID(Vector3 positionInWorld)
{
byte height = GetHeight((int)positionInWorld.x, (int)positionInWorld.z);
//world pass
if (positionInWorld.x < 0 || positionInWorld.y < 0 || positionInWorld.z < 0 ||
positionInWorld.x >= worldSize * Data.chunkWidth || positionInWorld.y > height ||
positionInWorld.z >= worldSize * Data.chunkWidth)
{
return 0;
}
//chunk pass
if ((int)positionInWorld.y == height)
{
return 3;
}
if ((int)positionInWorld.y == 0)
{
return 1;
}
if ((int)positionInWorld.y > height - 3)
{
return 2;
}
if ((int)positionInWorld.y < height)
{
return 4;
}
return 0;
}
//returns if a block is on the position //returns if a block is on the position
public bool CheckBlock(Vector3 positionInWorld) public bool CheckBlock(Vector3 positionInWorld)
{ {
if (positionInWorld.x < -1 || positionInWorld.z < -1 || if (positionInWorld.x < 0 || positionInWorld.z < 0 ||
positionInWorld.x > worldSize * Data.chunkWidth || positionInWorld.x >= worldSize * Data.chunkWidth ||
positionInWorld.z > worldSize * Data.chunkWidth) positionInWorld.z >= worldSize * Data.chunkWidth)
{ {
return false; return false;
} }
@@ -217,15 +194,25 @@ public class World : MonoBehaviour
return blockData[blockID].textures; return blockData[blockID].textures;
} }
//get the perlin noise height //get the height
public byte GetHeight(int x, int z) public byte GetHeight(int x, int z)
{ {
float scale = 0.025f; int xChunk = x / Data.chunkWidth;
byte perlinHeight = 10; int zChunk = z / Data.chunkWidth;
byte groundHeight = 10;
byte height = (byte)(Mathf.PerlinNoise((x) * scale + 0.1f, (z) * scale + 0.1f) * perlinHeight + groundHeight); int xInChunk = x - (xChunk * Data.chunkWidth);
return height; int zInChunk = z - (zChunk * Data.chunkWidth);
Chunk c = chunks[xChunk, zChunk];
for (int y = 0; y < Data.chunkHeight; y++)
{
if (c.blocks[xInChunk, y, zInChunk] == 0)
{
return (byte)(y - 1);
}
}
return 250;
} }
//edit a block in local chunk storage //edit a block in local chunk storage
@@ -269,7 +256,6 @@ public class World : MonoBehaviour
client.Disconnect(); client.Disconnect();
} }
public Client GetClient() public Client GetClient()
{ {
return client; return client;
@@ -282,4 +268,72 @@ public class World : MonoBehaviour
public string name; public string name;
public byte[] textures = new byte[6]; public byte[] textures = new byte[6];
} }
public void ShowDeadScreen()
{
client.SendDeadMessage();
Cursor.visible = true;
Cursor.lockState = CursorLockMode.None;
deadScreen.SetActive(true);
Time.timeScale = 0;
}
public void ShowPauseScreen()
{
Cursor.visible = true;
Cursor.lockState = CursorLockMode.None;
pauseScreen.SetActive(true);
Time.timeScale = 0;
}
public void RespawnButton()
{
Cursor.visible = false;
Cursor.lockState = CursorLockMode.Confined;
Time.timeScale = 1;
player.transform.position = player.GetDefaultPlayerPosition();
deadScreen.SetActive(false);
}
public void ResumeButton()
{
Cursor.visible = false;
Cursor.lockState = CursorLockMode.Confined;
Time.timeScale = 1;
pauseScreen.SetActive(false);
}
public void QuitButton()
{
Time.timeScale = 1;
client.Disconnect();
SceneManager.LoadScene("Login");
deadScreen.SetActive(false);
}
public void SaveButton()
{
client.SaveWorld();
}
//return the ID of a block
public byte GetBlockID(Vector3 positionInWorld)
{
if (!(positionInWorld.x < 0 || positionInWorld.y < 0 || positionInWorld.z < 0 ||
positionInWorld.x >= worldSize * Data.chunkWidth || positionInWorld.y >= Data.chunkHeight ||
positionInWorld.z >= worldSize * Data.chunkWidth))
{
ChunkCoord chunk = new ChunkCoord((int)(positionInWorld.x / Data.chunkWidth),
(int)(positionInWorld.z / Data.chunkWidth));
int xInChunk = (int)(positionInWorld.x - chunk.x * Data.chunkWidth);
int yInChunk = (int)positionInWorld.y;
int zInChunk = (int)(positionInWorld.z - chunk.z * Data.chunkWidth);
return chunks[chunk.x, chunk.z].blocks[xInChunk, yInChunk, zInChunk];
}
return 0;
}
} }
+1
View File
@@ -7,6 +7,7 @@
"com.unity.test-framework": "1.1.31", "com.unity.test-framework": "1.1.31",
"com.unity.textmeshpro": "3.0.6", "com.unity.textmeshpro": "3.0.6",
"com.unity.timeline": "1.4.8", "com.unity.timeline": "1.4.8",
"com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.1",
"com.unity.ugui": "1.0.0", "com.unity.ugui": "1.0.0",
"com.unity.modules.ai": "1.0.0", "com.unity.modules.ai": "1.0.0",
"com.unity.modules.androidjni": "1.0.0", "com.unity.modules.androidjni": "1.0.0",
@@ -50,6 +50,22 @@
}, },
"url": "https://packages.unity.com" "url": "https://packages.unity.com"
}, },
"com.unity.sysroot": {
"version": "2.0.2",
"depth": 1,
"source": "registry",
"dependencies": {},
"url": "https://packages.unity.com"
},
"com.unity.sysroot.linux-x86_64": {
"version": "2.0.1",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.sysroot": "2.0.2"
},
"url": "https://packages.unity.com"
},
"com.unity.test-framework": { "com.unity.test-framework": {
"version": "1.1.31", "version": "1.1.31",
"depth": 0, "depth": 0,
@@ -82,6 +98,16 @@
}, },
"url": "https://packages.unity.com" "url": "https://packages.unity.com"
}, },
"com.unity.toolchain.win-x86_64-linux-x86_64": {
"version": "2.0.1",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.sysroot": "2.0.2",
"com.unity.sysroot.linux-x86_64": "2.0.1"
},
"url": "https://packages.unity.com"
},
"com.unity.ugui": { "com.unity.ugui": {
"version": "1.0.0", "version": "1.0.0",
"depth": 0, "depth": 0,
@@ -92,7 +92,7 @@ InputManager:
negativeButton: negativeButton:
positiveButton: space positiveButton: space
altNegativeButton: altNegativeButton:
altPositiveButton: altPositiveButton: joystick button 0
gravity: 1000 gravity: 1000
dead: 0.001 dead: 0.001
sensitivity: 1000 sensitivity: 1000
@@ -234,7 +234,7 @@ InputManager:
descriptiveName: descriptiveName:
descriptiveNegativeName: descriptiveNegativeName:
negativeButton: negativeButton:
positiveButton: joystick button 3 positiveButton: joystick button 0
altNegativeButton: altNegativeButton:
altPositiveButton: altPositiveButton:
gravity: 1000 gravity: 1000
@@ -293,3 +293,83 @@ InputManager:
type: 0 type: 0
axis: 0 axis: 0
joyNum: 0 joyNum: 0
- serializedVersion: 3
m_Name: Mouse X
descriptiveName:
descriptiveNegativeName:
negativeButton:
positiveButton:
altNegativeButton:
altPositiveButton:
gravity: 0
dead: 0
sensitivity: 0.3
snap: 0
invert: 0
type: 2
axis: 3
joyNum: 0
- serializedVersion: 3
m_Name: Mouse Y
descriptiveName:
descriptiveNegativeName:
negativeButton:
positiveButton:
altNegativeButton:
altPositiveButton:
gravity: 0
dead: 0
sensitivity: 0.3
snap: 0
invert: 1
type: 2
axis: 4
joyNum: 0
- serializedVersion: 3
m_Name: Right Trigger
descriptiveName:
descriptiveNegativeName:
negativeButton:
positiveButton:
altNegativeButton:
altPositiveButton:
gravity: 0
dead: 0
sensitivity: 0.3
snap: 0
invert: 0
type: 2
axis: 9
joyNum: 0
- serializedVersion: 3
m_Name: Left Trigger
descriptiveName:
descriptiveNegativeName:
negativeButton:
positiveButton:
altNegativeButton:
altPositiveButton:
gravity: 0
dead: 0
sensitivity: 0.3
snap: 0
invert: 0
type: 2
axis: 8
joyNum: 0
- serializedVersion: 3
m_Name: Left Stick Button
descriptiveName:
descriptiveNegativeName:
negativeButton:
positiveButton: joystick button 8
altNegativeButton:
altPositiveButton:
gravity: 1000
dead: 0.001
sensitivity: 1000
snap: 0
invert: 0
type: 0
axis: 8
joyNum: 0
@@ -621,8 +621,8 @@ PlayerSettings:
Standalone: 3 Standalone: 3
m_RenderingPath: 1 m_RenderingPath: 1
m_MobileRenderingPath: 1 m_MobileRenderingPath: 1
metroPackageName: Template_3D metroPackageName: Template3D
metroPackageVersion: metroPackageVersion: 1.0.0.0
metroCertificatePath: metroCertificatePath:
metroCertificatePassword: metroCertificatePassword:
metroCertificateSubject: metroCertificateSubject:
@@ -630,7 +630,7 @@ PlayerSettings:
metroCertificateNotAfter: 0000000000000000 metroCertificateNotAfter: 0000000000000000
metroApplicationDescription: Template_3D metroApplicationDescription: Template_3D
wsaImages: {} wsaImages: {}
metroTileShortName: metroTileShortName: Minecraft Client
metroTileShowName: 0 metroTileShowName: 0
metroMediumTileShowName: 0 metroMediumTileShowName: 0
metroLargeTileShowName: 0 metroLargeTileShowName: 0
+14
View File
@@ -46,6 +46,8 @@ public class Server
//[0] = 6: player ready //[0] = 6: player ready
//[0] = 7: player position update //[0] = 7: player position update
//[0] = 8: player rotation update //[0] = 8: player rotation update
//[0] = 9: Save the World
//[0] = 10: Player died
private void Receive() private void Receive()
{ {
@@ -242,6 +244,18 @@ public class Server
} }
} }
} }
//Save the World
if (data[0] == 9)
{
world.SaveWorld();
}
//player died
if (data[0] == 10)
{
Console.WriteLine(playerNames[GetPlayerID(endPoint)] + " died! \n");
}
} }
catch (Exception e) catch (Exception e)
{ {
+99 -3
View File
@@ -4,11 +4,15 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Text; using System.Text;
using UnityEngine; using UnityEngine;
using Random = UnityEngine.Random;
public class World : MonoBehaviour public class World : MonoBehaviour
{ {
//basic //basic
[SerializeField] public int worldSize; [SerializeField] public int worldSize;
private int randomOffsetX, randomOffsetZ;
private int seed = 0;
private string dataPath;
//chunks //chunks
public Chunk[,] chunks; public Chunk[,] chunks;
@@ -18,6 +22,11 @@ public class World : MonoBehaviour
[SerializeField] private int transferDelay; [SerializeField] private int transferDelay;
private void Start() private void Start()
{ {
dataPath = Application.dataPath;
randomOffsetX = Random.Range(0, 10000);
randomOffsetZ = Random.Range(0, 10000);
if (File.Exists(Application.dataPath + "\\save.world")) if (File.Exists(Application.dataPath + "\\save.world"))
{ {
chunks = new Chunk[worldSize, worldSize]; chunks = new Chunk[worldSize, worldSize];
@@ -57,6 +66,7 @@ public class World : MonoBehaviour
else else
{ {
CreateChunks(); CreateChunks();
CreateTrees();
} }
Console.WriteLine("world loaded! \n"); Console.WriteLine("world loaded! \n");
server = new Server(this, transferDelay); server = new Server(this, transferDelay);
@@ -85,6 +95,78 @@ public class World : MonoBehaviour
} }
//Create Trees
private void CreateTrees()
{
for (int x = 4; x < worldSize * Data.chunkWidth - 4; x++)
{
for (int z = 4; z < worldSize * Data.chunkWidth - 4; z++)
{
if (CheckTree(x, z))
{
ChunkCoord chunk = new ChunkCoord((int)(x / Data.chunkWidth),
(int)(z / Data.chunkWidth));
int xInChunk = (int)(x - chunk.x * Data.chunkWidth);
int yInChunk = (int)(GetHeight(x, z));
int zInChunk = (int)(z - chunk.z * Data.chunkWidth);
int height = Random.Range(5, 9);
for (int i = 0; i <= height; i++)
{
chunks[chunk.x, chunk.z].blocks[xInChunk, yInChunk + i, zInChunk] = 7;
}
chunks[chunk.x, chunk.z].blocks[xInChunk, yInChunk + height + 2, zInChunk] = 6;
for (int ty = -1; ty <= 0; ty++)
{
for (int tx = -2; tx <= 2; tx++)
{
for (int tz = -2; tz <= 2; tz++)
{
ChunkCoord tempChunk = new ChunkCoord((int)((x - tx) / Data.chunkWidth),
(int)((z - tz) / Data.chunkWidth));
int xTempInChunk = (int)((x - tx) - tempChunk.x * Data.chunkWidth);
int zTempInChunk = (int)((z - tz) - tempChunk.z * Data.chunkWidth);
if (chunks[tempChunk.x, tempChunk.z].blocks[xTempInChunk, yInChunk + height + ty,
zTempInChunk] != 7)
{
chunks[tempChunk.x, tempChunk.z].blocks[xTempInChunk, yInChunk + height + ty,
zTempInChunk] = 6;
}
}
}
}
for (int tx = -1; tx <= 1; tx++)
{
for (int tz = -1; tz <= 1; tz++)
{
ChunkCoord tempChunk = new ChunkCoord((int)((x - tx) / Data.chunkWidth),
(int)((z - tz) / Data.chunkWidth));
int xTempInChunk = (int)((x - tx) - tempChunk.x * Data.chunkWidth);
int zTempInChunk = (int)((z - tz) - tempChunk.z * Data.chunkWidth);
if (chunks[tempChunk.x, tempChunk.z].blocks[xTempInChunk, yInChunk + height + 1,
zTempInChunk] != 7)
{
chunks[tempChunk.x, tempChunk.z].blocks[xTempInChunk, yInChunk + height + 1,
zTempInChunk] = 6;
}
}
}
}
}
}
}
//return the ID of a block //return the ID of a block
public byte GetBlockID(Vector3 positionInWorld) public byte GetBlockID(Vector3 positionInWorld)
{ {
@@ -164,10 +246,24 @@ public class World : MonoBehaviour
byte perlinHeight = 10; byte perlinHeight = 10;
byte groundHeight = 10; byte groundHeight = 10;
byte height = (byte)(Mathf.PerlinNoise((x) * scale + 0.1f, (z) * scale + 0.1f) * perlinHeight + groundHeight); byte height = (byte)(Mathf.PerlinNoise((x + randomOffsetX) * scale + 0.1f, (z + randomOffsetZ) * scale + 0.1f) * perlinHeight + groundHeight);
return height; return height;
} }
private bool CheckTree(int x, int z)
{
float scale = .99f;
float threshold = .96f;
if (Mathf.PerlinNoise((x) * scale + 0.1f, (z) * scale + 0.1f) >= threshold)
{
return true;
}
return false;
}
public void EditBlock(ChunkCoord chunk, Vector3 positionInChunk, byte blockID) public void EditBlock(ChunkCoord chunk, Vector3 positionInChunk, byte blockID)
{ {
byte xInChunk = (byte)(positionInChunk.x); byte xInChunk = (byte)(positionInChunk.x);
@@ -188,9 +284,9 @@ public class World : MonoBehaviour
} }
private void SaveWorld() public void SaveWorld()
{ {
StreamWriter writer = new StreamWriter(Application.dataPath + "\\save.world", false); StreamWriter writer = new StreamWriter(dataPath + "\\save.world", false);
for (int xChunk = 0; xChunk < worldSize; xChunk++) for (int xChunk = 0; xChunk < worldSize; xChunk++)
{ {
for (int zChunk = 0; zChunk < worldSize; zChunk++) for (int zChunk = 0; zChunk < worldSize; zChunk++)
Binary file not shown.
+1
View File
@@ -7,6 +7,7 @@
"com.unity.test-framework": "1.1.31", "com.unity.test-framework": "1.1.31",
"com.unity.textmeshpro": "3.0.6", "com.unity.textmeshpro": "3.0.6",
"com.unity.timeline": "1.4.8", "com.unity.timeline": "1.4.8",
"com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.1",
"com.unity.ugui": "1.0.0", "com.unity.ugui": "1.0.0",
"com.unity.modules.ai": "1.0.0", "com.unity.modules.ai": "1.0.0",
"com.unity.modules.androidjni": "1.0.0", "com.unity.modules.androidjni": "1.0.0",
@@ -50,6 +50,22 @@
}, },
"url": "https://packages.unity.com" "url": "https://packages.unity.com"
}, },
"com.unity.sysroot": {
"version": "2.0.2",
"depth": 1,
"source": "registry",
"dependencies": {},
"url": "https://packages.unity.com"
},
"com.unity.sysroot.linux-x86_64": {
"version": "2.0.1",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.sysroot": "2.0.2"
},
"url": "https://packages.unity.com"
},
"com.unity.test-framework": { "com.unity.test-framework": {
"version": "1.1.31", "version": "1.1.31",
"depth": 0, "depth": 0,
@@ -82,6 +98,16 @@
}, },
"url": "https://packages.unity.com" "url": "https://packages.unity.com"
}, },
"com.unity.toolchain.win-x86_64-linux-x86_64": {
"version": "2.0.1",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.sysroot": "2.0.2",
"com.unity.sysroot.linux-x86_64": "2.0.1"
},
"url": "https://packages.unity.com"
},
"com.unity.ugui": { "com.unity.ugui": {
"version": "1.0.0", "version": "1.0.0",
"depth": 0, "depth": 0,
@@ -621,8 +621,8 @@ PlayerSettings:
Standalone: 3 Standalone: 3
m_RenderingPath: 1 m_RenderingPath: 1
m_MobileRenderingPath: 1 m_MobileRenderingPath: 1
metroPackageName: Template_3D metroPackageName: Template3D
metroPackageVersion: metroPackageVersion: 1.0.0.0
metroCertificatePath: metroCertificatePath:
metroCertificatePassword: metroCertificatePassword:
metroCertificateSubject: metroCertificateSubject:
@@ -630,7 +630,7 @@ PlayerSettings:
metroCertificateNotAfter: 0000000000000000 metroCertificateNotAfter: 0000000000000000
metroApplicationDescription: Template_3D metroApplicationDescription: Template_3D
wsaImages: {} wsaImages: {}
metroTileShortName: metroTileShortName: Minecraft Server
metroTileShowName: 0 metroTileShowName: 0
metroMediumTileShowName: 0 metroMediumTileShowName: 0
metroLargeTileShowName: 0 metroLargeTileShowName: 0