diff --git a/ServerLog.t4jlog b/ServerLog.t4jlog index 57c352a..2c4c10c 100644 --- a/ServerLog.t4jlog +++ b/ServerLog.t4jlog @@ -1,163 +1,163 @@ -191:07:2026 14:40:19.401 INFO: +192:07:2026 01:57:48.537 INFO: Launching New Terrain4J Powered Software! -191:07:2026 14:40:19.411 DEBUG: File [terrain4j.properties] read -191:07:2026 14:40:19.418 DEBUG: +192:07:2026 01:57:48.542 DEBUG: File [terrain4j.properties] read +192:07:2026 01:57:48.546 DEBUG: successfully loaded configuration: {compatibility_mode=false, ShaderRecompiling=true, cap_main_to_tickrate=true, LoadingScreenLocation=resources/EngineResources/Texture/Terrain4JTitleImage.png, z_near_plane=10000.0f, display_width=640, anti_alias_mode=0, main_thread_tickrate=120, Software_Icon=ProgramIcon.png, MaxAllowedVulkanCrashes=10, throttle_on_unfocus=false, vsync=false, cap_fast_to_tickrate=true, Software_Icon_Path=/WindowResources/Icon/, RequestedImages=3, throttle_accuracy=4000000, DualPassRendering=false, field_of_view=60.0f, ShadowMapSize=2048, PhysicalDeviceName=, fast_thread_tickrate=240, vkValidated=true, cap_master_to_tickrate=true, AlphaToCoverage=false, display_height=480, Renderer=1, Software_Title=Terrain4J Game Engine, z_far_plane=0.1f, frame_accuracy=0, master_tick_rate=240, Debug_Shaders=false, DefaultTexturePath=resources/EngineResources/Texture/NoTexture.png} -191:07:2026 14:40:19.496 DEBUG: Loading Models From [resources/models/cube/Cube.json] -191:07:2026 14:40:19.569 DEBUG: Loaded Model Data: [ModelData[ID=Cube, Meshes=[MeshData[ID=mesh_0, MaterialID=Cube-mat-1, OffsetVertex=0, VertexSize=1344, OffsetIndex=0, IndexSize=144]], VertexPath=resources/models/cube/Cube.vtx, IndexPath=resources/models/cube/Cube.idx]] -191:07:2026 14:40:19.569 DEBUG: Loading Materials From [resources/models/cube/Cube_mat.json] -191:07:2026 14:40:19.584 DEBUG: Loaded Material Data: [[MaterialData[ID=Cube-mat-0, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=Cube-mat-1, TexturePath=resources\models\cube\cubetexture.png, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=Cube-mat-2, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0]]] -191:07:2026 14:40:19.584 DEBUG: Loading Models From [resources/models/VisualCollision/CollisionCube.json] -191:07:2026 14:40:19.585 DEBUG: Loaded Model Data: [ModelData[ID=CollisionCube, Meshes=[MeshData[ID=mesh_0, MaterialID=CollisionCube-mat-1, OffsetVertex=0, VertexSize=1344, OffsetIndex=0, IndexSize=144]], VertexPath=resources/models/VisualCollision/CollisionCube.vtx, IndexPath=resources/models/VisualCollision/CollisionCube.idx]] -191:07:2026 14:40:19.586 DEBUG: Loading Materials From [resources/models/VisualCollision/CollisionCube_mat.json] -191:07:2026 14:40:19.588 DEBUG: Loaded Material Data: [[MaterialData[ID=CollisionCube-mat-0, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=CollisionCube-mat-1, TexturePath=resources\models\VisualCollision\CollisionCubeTexture.png, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=CollisionCube-mat-2, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0]]] -191:07:2026 14:40:19.588 DEBUG: Loading Models From [resources/models/melona/melona.json] -191:07:2026 14:40:19.588 DEBUG: Loaded Model Data: [ModelData[ID=melona, Meshes=[MeshData[ID=m_6d7d0384-980c-6574-37d9-8a8b11a5fdda_0, MaterialID=melona-mat-1, OffsetVertex=0, VertexSize=24192, OffsetIndex=0, IndexSize=2640], MeshData[ID=none_1, MaterialID=melona-mat-2, OffsetVertex=24192, VertexSize=672, OffsetIndex=2640, IndexSize=96]], VertexPath=resources/models/melona/melona.vtx, IndexPath=resources/models/melona/melona.idx]] -191:07:2026 14:40:19.588 DEBUG: Loading Materials From [resources/models/melona/melona_mat.json] -191:07:2026 14:40:19.589 DEBUG: Loaded Material Data: [[MaterialData[ID=melona-mat-0, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=melona-mat-1, TexturePath=resources\models\melona\Melonamodel.png, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=melona-mat-2, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0]]] -191:07:2026 14:40:19.590 DEBUG: Loading Models From [resources/models/musket/musket.json] -191:07:2026 14:40:19.590 DEBUG: Loaded Model Data: [ModelData[ID=musket, Meshes=[MeshData[ID=cube_0, MaterialID=musket-mat-1, OffsetVertex=0, VertexSize=25088, OffsetIndex=0, IndexSize=2880]], VertexPath=resources/models/musket/musket.vtx, IndexPath=resources/models/musket/musket.idx]] -191:07:2026 14:40:19.590 DEBUG: Loading Materials From [resources/models/musket/musket_mat.json] -191:07:2026 14:40:19.591 DEBUG: Loaded Material Data: [[MaterialData[ID=musket-mat-0, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=musket-mat-1, TexturePath=resources\models\musket\Musket.png, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=musket-mat-2, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0]]] -191:07:2026 14:40:19.591 DEBUG: Loading Models From [resources/models/Revolver/Revolver.json] -191:07:2026 14:40:19.592 DEBUG: Loaded Model Data: [ModelData[ID=Revolver, Meshes=[MeshData[ID=cube_0, MaterialID=Revolver-mat-1, OffsetVertex=0, VertexSize=21280, OffsetIndex=0, IndexSize=2304]], VertexPath=resources/models/Revolver/Revolver.vtx, IndexPath=resources/models/Revolver/Revolver.idx]] -191:07:2026 14:40:19.592 DEBUG: Loading Materials From [resources/models/Revolver/Revolver_mat.json] -191:07:2026 14:40:19.593 DEBUG: Loaded Material Data: [[MaterialData[ID=Revolver-mat-0, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=Revolver-mat-1, TexturePath=resources\models\Revolver\Revolver.png, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=Revolver-mat-2, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0]]] -191:07:2026 14:40:19.593 DEBUG: Loading Models From [resources/models/Flintlock/Flintlock.json] -191:07:2026 14:40:19.594 DEBUG: Loaded Model Data: [ModelData[ID=Flintlock, Meshes=[MeshData[ID=cube_0, MaterialID=Flintlock-mat-1, OffsetVertex=0, VertexSize=19936, OffsetIndex=0, IndexSize=2160]], VertexPath=resources/models/Flintlock/Flintlock.vtx, IndexPath=resources/models/Flintlock/Flintlock.idx]] -191:07:2026 14:40:19.594 DEBUG: Loading Materials From [resources/models/Flintlock/Flintlock_mat.json] -191:07:2026 14:40:19.595 DEBUG: Loaded Material Data: [[MaterialData[ID=Flintlock-mat-0, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=Flintlock-mat-1, TexturePath=resources\models\Flintlock\Flintlock.png, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=Flintlock-mat-2, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0]]] -191:07:2026 14:40:19.599 INFO: Spawning static cube actor [MelonaSpawned0] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.629 INFO: Spawning static cube actor [MelonaSpawned1] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.629 INFO: Spawning static cube actor [MelonaSpawned2] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.629 INFO: Spawning static cube actor [MelonaSpawned3] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.629 INFO: Spawning static cube actor [MelonaSpawned4] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.630 INFO: Spawning static cube actor [MelonaSpawned5] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.630 INFO: Spawning static cube actor [MelonaSpawned6] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.630 INFO: Spawning static cube actor [MelonaSpawned7] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.631 INFO: Spawning static cube actor [MelonaSpawned8] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.631 INFO: Spawning static cube actor [MelonaSpawned9] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.631 INFO: Spawning static cube actor [MelonaSpawned10] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.631 INFO: Spawning static cube actor [MelonaSpawned11] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.631 INFO: Spawning static cube actor [MelonaSpawned12] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.632 INFO: Spawning static cube actor [MelonaSpawned13] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.632 INFO: Spawning static cube actor [MelonaSpawned14] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.632 INFO: Spawning static cube actor [MelonaSpawned15] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.632 INFO: Spawning static cube actor [MelonaSpawned16] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.632 INFO: Spawning static cube actor [MelonaSpawned17] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.633 INFO: Spawning static cube actor [MelonaSpawned18] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.633 INFO: Spawning static cube actor [MelonaSpawned19] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.633 INFO: Spawning static cube actor [MelonaSpawned20] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.633 INFO: Spawning static cube actor [MelonaSpawned21] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.634 INFO: Spawning static cube actor [MelonaSpawned22] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.634 INFO: Spawning static cube actor [MelonaSpawned23] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.634 INFO: Spawning static cube actor [MelonaSpawned24] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.634 INFO: Spawning static cube actor [MelonaSpawned25] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.635 INFO: Spawning static cube actor [MelonaSpawned26] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.635 INFO: Spawning static cube actor [MelonaSpawned27] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.635 INFO: Spawning static cube actor [MelonaSpawned28] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.635 INFO: Spawning static cube actor [MelonaSpawned29] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.635 INFO: Spawning static cube actor [MelonaSpawned30] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.635 INFO: Spawning static cube actor [MelonaSpawned31] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.635 INFO: Spawning static cube actor [MelonaSpawned32] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.635 INFO: Spawning static cube actor [MelonaSpawned33] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.636 INFO: Spawning static cube actor [MelonaSpawned34] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.636 INFO: Spawning static cube actor [MelonaSpawned35] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.636 INFO: Spawning static cube actor [MelonaSpawned36] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.636 INFO: Spawning static cube actor [MelonaSpawned37] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.636 INFO: Spawning static cube actor [MelonaSpawned38] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.636 INFO: Spawning static cube actor [MelonaSpawned39] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.636 INFO: Spawning static cube actor [MelonaSpawned40] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.637 INFO: Spawning static cube actor [MelonaSpawned41] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.637 INFO: Spawning static cube actor [MelonaSpawned42] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.637 INFO: Spawning static cube actor [MelonaSpawned43] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.637 INFO: Spawning static cube actor [MelonaSpawned44] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.637 INFO: Spawning static cube actor [MelonaSpawned45] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.638 INFO: Spawning static cube actor [MelonaSpawned46] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.638 INFO: Spawning static cube actor [MelonaSpawned47] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.638 INFO: Spawning static cube actor [MelonaSpawned48] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.638 INFO: Spawning static cube actor [MelonaSpawned49] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.638 INFO: Spawning static cube actor [MelonaSpawned50] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.638 INFO: Spawning static cube actor [MelonaSpawned51] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.639 INFO: Spawning static cube actor [MelonaSpawned52] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.639 INFO: Spawning static cube actor [MelonaSpawned53] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.639 INFO: Spawning static cube actor [MelonaSpawned54] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.639 INFO: Spawning static cube actor [MelonaSpawned55] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.639 INFO: Spawning static cube actor [MelonaSpawned56] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.639 INFO: Spawning static cube actor [MelonaSpawned57] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.639 INFO: Spawning static cube actor [MelonaSpawned58] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.639 INFO: Spawning static cube actor [MelonaSpawned59] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.641 INFO: Spawning static cube actor [MelonaSpawned60] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.641 INFO: Spawning static cube actor [MelonaSpawned61] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.641 INFO: Spawning static cube actor [MelonaSpawned62] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.641 INFO: Spawning static cube actor [MelonaSpawned63] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.641 INFO: Spawning static cube actor [MelonaSpawned64] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.641 INFO: Spawning static cube actor [MelonaSpawned65] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.641 INFO: Spawning static cube actor [MelonaSpawned66] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.642 INFO: Spawning static cube actor [MelonaSpawned67] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.642 INFO: Spawning static cube actor [MelonaSpawned68] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.642 INFO: Spawning static cube actor [MelonaSpawned69] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.642 INFO: Spawning static cube actor [MelonaSpawned70] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.642 INFO: Spawning static cube actor [MelonaSpawned71] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.642 INFO: Spawning static cube actor [MelonaSpawned72] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.642 INFO: Spawning static cube actor [MelonaSpawned73] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.642 INFO: Spawning static cube actor [MelonaSpawned74] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.643 INFO: Spawning static cube actor [MelonaSpawned75] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.643 INFO: Spawning static cube actor [MelonaSpawned76] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.643 INFO: Spawning static cube actor [MelonaSpawned77] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.643 INFO: Spawning static cube actor [MelonaSpawned78] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.643 INFO: Spawning static cube actor [MelonaSpawned79] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.644 INFO: Spawning static cube actor [MelonaSpawned80] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.644 INFO: Spawning static cube actor [MelonaSpawned81] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.644 INFO: Spawning static cube actor [MelonaSpawned82] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.644 INFO: Spawning static cube actor [MelonaSpawned83] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.644 INFO: Spawning static cube actor [MelonaSpawned84] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.644 INFO: Spawning static cube actor [MelonaSpawned85] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.645 INFO: Spawning static cube actor [MelonaSpawned86] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.645 INFO: Spawning static cube actor [MelonaSpawned87] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.645 INFO: Spawning static cube actor [MelonaSpawned88] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.645 INFO: Spawning static cube actor [MelonaSpawned89] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.645 INFO: Spawning static cube actor [MelonaSpawned90] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.646 INFO: Spawning static cube actor [MelonaSpawned91] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.646 INFO: Spawning static cube actor [MelonaSpawned92] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.646 INFO: Spawning static cube actor [MelonaSpawned93] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.646 INFO: Spawning static cube actor [MelonaSpawned94] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.646 INFO: Spawning static cube actor [MelonaSpawned95] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.646 INFO: Spawning static cube actor [MelonaSpawned96] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.647 INFO: Spawning static cube actor [MelonaSpawned97] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.647 INFO: Spawning static cube actor [MelonaSpawned98] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.647 INFO: Spawning static cube actor [MelonaSpawned99] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.647 INFO: Spawning static cube actor [MelonaSpawned100] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.647 INFO: Spawning static cube actor [MelonaSpawned101] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.647 INFO: Spawning static cube actor [MelonaSpawned102] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.647 INFO: Spawning static cube actor [MelonaSpawned103] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.648 INFO: Spawning static cube actor [MelonaSpawned104] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.648 INFO: Spawning static cube actor [MelonaSpawned105] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.648 INFO: Spawning static cube actor [MelonaSpawned106] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.648 INFO: Spawning static cube actor [MelonaSpawned107] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.648 INFO: Spawning static cube actor [MelonaSpawned108] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.649 INFO: Spawning static cube actor [MelonaSpawned109] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.649 INFO: Spawning static cube actor [MelonaSpawned110] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.649 INFO: Spawning static cube actor [MelonaSpawned111] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.649 INFO: Spawning static cube actor [MelonaSpawned112] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.649 INFO: Spawning static cube actor [MelonaSpawned113] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.649 INFO: Spawning static cube actor [MelonaSpawned114] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.649 INFO: Spawning static cube actor [MelonaSpawned115] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.649 INFO: Spawning static cube actor [MelonaSpawned116] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.649 INFO: Spawning static cube actor [MelonaSpawned117] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.650 INFO: Spawning static cube actor [MelonaSpawned118] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.650 INFO: Spawning static cube actor [MelonaSpawned119] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.650 INFO: Spawning static cube actor [MelonaSpawned120] with model ID [Cube], with cached ID of [Cube] -191:07:2026 14:40:19.655 DEBUG: Starting Main Thread -191:07:2026 14:40:19.656 DEBUG: Starting Fast Thread -191:07:2026 14:40:19.656 DEBUG: Starting Render Thread -191:07:2026 14:40:19.662 INFO: Launched Terrain4J Engine -191:07:2026 14:40:19.662 DEBUG: Primary Thread Started -191:07:2026 14:40:19.662 INFO: Terrain4J dedicated server running without GLFW/Vulkan/OpenAL -191:07:2026 14:40:19.662 DEBUG: Main Thread Started -191:07:2026 14:40:19.662 DEBUG: Render Thread Started -191:07:2026 14:40:19.662 DEBUG: Fast Thread Started +192:07:2026 01:57:48.599 DEBUG: Loading Models From [resources/models/cube/Cube.json] +192:07:2026 01:57:48.646 DEBUG: Loaded Model Data: [ModelData[ID=Cube, Meshes=[MeshData[ID=mesh_0, MaterialID=Cube-mat-1, OffsetVertex=0, VertexSize=1344, OffsetIndex=0, IndexSize=144]], VertexPath=resources/models/cube/Cube.vtx, IndexPath=resources/models/cube/Cube.idx]] +192:07:2026 01:57:48.646 DEBUG: Loading Materials From [resources/models/cube/Cube_mat.json] +192:07:2026 01:57:48.657 DEBUG: Loaded Material Data: [[MaterialData[ID=Cube-mat-0, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=Cube-mat-1, TexturePath=resources\models\cube\cubetexture.png, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=Cube-mat-2, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0]]] +192:07:2026 01:57:48.657 DEBUG: Loading Models From [resources/models/VisualCollision/CollisionCube.json] +192:07:2026 01:57:48.658 DEBUG: Loaded Model Data: [ModelData[ID=CollisionCube, Meshes=[MeshData[ID=mesh_0, MaterialID=CollisionCube-mat-1, OffsetVertex=0, VertexSize=1344, OffsetIndex=0, IndexSize=144]], VertexPath=resources/models/VisualCollision/CollisionCube.vtx, IndexPath=resources/models/VisualCollision/CollisionCube.idx]] +192:07:2026 01:57:48.659 DEBUG: Loading Materials From [resources/models/VisualCollision/CollisionCube_mat.json] +192:07:2026 01:57:48.660 DEBUG: Loaded Material Data: [[MaterialData[ID=CollisionCube-mat-0, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=CollisionCube-mat-1, TexturePath=resources\models\VisualCollision\CollisionCubeTexture.png, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=CollisionCube-mat-2, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0]]] +192:07:2026 01:57:48.660 DEBUG: Loading Models From [resources/models/melona/melona.json] +192:07:2026 01:57:48.661 DEBUG: Loaded Model Data: [ModelData[ID=melona, Meshes=[MeshData[ID=m_6d7d0384-980c-6574-37d9-8a8b11a5fdda_0, MaterialID=melona-mat-1, OffsetVertex=0, VertexSize=24192, OffsetIndex=0, IndexSize=2640], MeshData[ID=none_1, MaterialID=melona-mat-2, OffsetVertex=24192, VertexSize=672, OffsetIndex=2640, IndexSize=96]], VertexPath=resources/models/melona/melona.vtx, IndexPath=resources/models/melona/melona.idx]] +192:07:2026 01:57:48.661 DEBUG: Loading Materials From [resources/models/melona/melona_mat.json] +192:07:2026 01:57:48.662 DEBUG: Loaded Material Data: [[MaterialData[ID=melona-mat-0, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=melona-mat-1, TexturePath=resources\models\melona\Melonamodel.png, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=melona-mat-2, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0]]] +192:07:2026 01:57:48.662 DEBUG: Loading Models From [resources/models/musket/musket.json] +192:07:2026 01:57:48.663 DEBUG: Loaded Model Data: [ModelData[ID=musket, Meshes=[MeshData[ID=cube_0, MaterialID=musket-mat-1, OffsetVertex=0, VertexSize=25088, OffsetIndex=0, IndexSize=2880]], VertexPath=resources/models/musket/musket.vtx, IndexPath=resources/models/musket/musket.idx]] +192:07:2026 01:57:48.663 DEBUG: Loading Materials From [resources/models/musket/musket_mat.json] +192:07:2026 01:57:48.665 DEBUG: Loaded Material Data: [[MaterialData[ID=musket-mat-0, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=musket-mat-1, TexturePath=resources\models\musket\Musket.png, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=musket-mat-2, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0]]] +192:07:2026 01:57:48.665 DEBUG: Loading Models From [resources/models/Revolver/Revolver.json] +192:07:2026 01:57:48.666 DEBUG: Loaded Model Data: [ModelData[ID=Revolver, Meshes=[MeshData[ID=cube_0, MaterialID=Revolver-mat-1, OffsetVertex=0, VertexSize=21280, OffsetIndex=0, IndexSize=2304]], VertexPath=resources/models/Revolver/Revolver.vtx, IndexPath=resources/models/Revolver/Revolver.idx]] +192:07:2026 01:57:48.666 DEBUG: Loading Materials From [resources/models/Revolver/Revolver_mat.json] +192:07:2026 01:57:48.668 DEBUG: Loaded Material Data: [[MaterialData[ID=Revolver-mat-0, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=Revolver-mat-1, TexturePath=resources\models\Revolver\Revolver.png, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=Revolver-mat-2, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0]]] +192:07:2026 01:57:48.668 DEBUG: Loading Models From [resources/models/Flintlock/Flintlock.json] +192:07:2026 01:57:48.668 DEBUG: Loaded Model Data: [ModelData[ID=Flintlock, Meshes=[MeshData[ID=cube_0, MaterialID=Flintlock-mat-1, OffsetVertex=0, VertexSize=19936, OffsetIndex=0, IndexSize=2160]], VertexPath=resources/models/Flintlock/Flintlock.vtx, IndexPath=resources/models/Flintlock/Flintlock.idx]] +192:07:2026 01:57:48.668 DEBUG: Loading Materials From [resources/models/Flintlock/Flintlock_mat.json] +192:07:2026 01:57:48.669 DEBUG: Loaded Material Data: [[MaterialData[ID=Flintlock-mat-0, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=Flintlock-mat-1, TexturePath=resources\models\Flintlock\Flintlock.png, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0], MaterialData[ID=Flintlock-mat-2, TexturePath=, NormalTexturePath=, MetalRoughnessMap=, DiffuseColour=( 6.000E-1 6.000E-1 6.000E-1 1.000E+0), Roughness=0.0, Metallic=0.0]]] +192:07:2026 01:57:48.673 INFO: Spawning static cube actor [MelonaSpawned0] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.694 INFO: Spawning static cube actor [MelonaSpawned1] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.694 INFO: Spawning static cube actor [MelonaSpawned2] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.694 INFO: Spawning static cube actor [MelonaSpawned3] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.694 INFO: Spawning static cube actor [MelonaSpawned4] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.695 INFO: Spawning static cube actor [MelonaSpawned5] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.695 INFO: Spawning static cube actor [MelonaSpawned6] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.695 INFO: Spawning static cube actor [MelonaSpawned7] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.695 INFO: Spawning static cube actor [MelonaSpawned8] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.695 INFO: Spawning static cube actor [MelonaSpawned9] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.695 INFO: Spawning static cube actor [MelonaSpawned10] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.695 INFO: Spawning static cube actor [MelonaSpawned11] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.696 INFO: Spawning static cube actor [MelonaSpawned12] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.696 INFO: Spawning static cube actor [MelonaSpawned13] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.696 INFO: Spawning static cube actor [MelonaSpawned14] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.696 INFO: Spawning static cube actor [MelonaSpawned15] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.696 INFO: Spawning static cube actor [MelonaSpawned16] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.696 INFO: Spawning static cube actor [MelonaSpawned17] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.696 INFO: Spawning static cube actor [MelonaSpawned18] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.696 INFO: Spawning static cube actor [MelonaSpawned19] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.697 INFO: Spawning static cube actor [MelonaSpawned20] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.697 INFO: Spawning static cube actor [MelonaSpawned21] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.697 INFO: Spawning static cube actor [MelonaSpawned22] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.697 INFO: Spawning static cube actor [MelonaSpawned23] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.697 INFO: Spawning static cube actor [MelonaSpawned24] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.697 INFO: Spawning static cube actor [MelonaSpawned25] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.697 INFO: Spawning static cube actor [MelonaSpawned26] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.698 INFO: Spawning static cube actor [MelonaSpawned27] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.698 INFO: Spawning static cube actor [MelonaSpawned28] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.698 INFO: Spawning static cube actor [MelonaSpawned29] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.698 INFO: Spawning static cube actor [MelonaSpawned30] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.698 INFO: Spawning static cube actor [MelonaSpawned31] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.698 INFO: Spawning static cube actor [MelonaSpawned32] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.698 INFO: Spawning static cube actor [MelonaSpawned33] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.698 INFO: Spawning static cube actor [MelonaSpawned34] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.698 INFO: Spawning static cube actor [MelonaSpawned35] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.698 INFO: Spawning static cube actor [MelonaSpawned36] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.698 INFO: Spawning static cube actor [MelonaSpawned37] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.698 INFO: Spawning static cube actor [MelonaSpawned38] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.698 INFO: Spawning static cube actor [MelonaSpawned39] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned40] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned41] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned42] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned43] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned44] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned45] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned46] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned47] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned48] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned49] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned50] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned51] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned52] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.699 INFO: Spawning static cube actor [MelonaSpawned53] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.700 INFO: Spawning static cube actor [MelonaSpawned54] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.700 INFO: Spawning static cube actor [MelonaSpawned55] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.700 INFO: Spawning static cube actor [MelonaSpawned56] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.700 INFO: Spawning static cube actor [MelonaSpawned57] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.700 INFO: Spawning static cube actor [MelonaSpawned58] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.700 INFO: Spawning static cube actor [MelonaSpawned59] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.700 INFO: Spawning static cube actor [MelonaSpawned60] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.700 INFO: Spawning static cube actor [MelonaSpawned61] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.700 INFO: Spawning static cube actor [MelonaSpawned62] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.700 INFO: Spawning static cube actor [MelonaSpawned63] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.700 INFO: Spawning static cube actor [MelonaSpawned64] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.701 INFO: Spawning static cube actor [MelonaSpawned65] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.701 INFO: Spawning static cube actor [MelonaSpawned66] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.701 INFO: Spawning static cube actor [MelonaSpawned67] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.701 INFO: Spawning static cube actor [MelonaSpawned68] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.701 INFO: Spawning static cube actor [MelonaSpawned69] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.701 INFO: Spawning static cube actor [MelonaSpawned70] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.701 INFO: Spawning static cube actor [MelonaSpawned71] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.701 INFO: Spawning static cube actor [MelonaSpawned72] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.702 INFO: Spawning static cube actor [MelonaSpawned73] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.702 INFO: Spawning static cube actor [MelonaSpawned74] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.702 INFO: Spawning static cube actor [MelonaSpawned75] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.702 INFO: Spawning static cube actor [MelonaSpawned76] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.702 INFO: Spawning static cube actor [MelonaSpawned77] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.702 INFO: Spawning static cube actor [MelonaSpawned78] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.702 INFO: Spawning static cube actor [MelonaSpawned79] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.702 INFO: Spawning static cube actor [MelonaSpawned80] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.702 INFO: Spawning static cube actor [MelonaSpawned81] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.702 INFO: Spawning static cube actor [MelonaSpawned82] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.702 INFO: Spawning static cube actor [MelonaSpawned83] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.703 INFO: Spawning static cube actor [MelonaSpawned84] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.703 INFO: Spawning static cube actor [MelonaSpawned85] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.703 INFO: Spawning static cube actor [MelonaSpawned86] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.703 INFO: Spawning static cube actor [MelonaSpawned87] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.704 INFO: Spawning static cube actor [MelonaSpawned88] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.704 INFO: Spawning static cube actor [MelonaSpawned89] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.704 INFO: Spawning static cube actor [MelonaSpawned90] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.704 INFO: Spawning static cube actor [MelonaSpawned91] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.704 INFO: Spawning static cube actor [MelonaSpawned92] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.704 INFO: Spawning static cube actor [MelonaSpawned93] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.704 INFO: Spawning static cube actor [MelonaSpawned94] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.704 INFO: Spawning static cube actor [MelonaSpawned95] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.704 INFO: Spawning static cube actor [MelonaSpawned96] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.704 INFO: Spawning static cube actor [MelonaSpawned97] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.704 INFO: Spawning static cube actor [MelonaSpawned98] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.704 INFO: Spawning static cube actor [MelonaSpawned99] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned100] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned101] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned102] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned103] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned104] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned105] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned106] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned107] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned108] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned109] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned110] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned111] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned112] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned113] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned114] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned115] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned116] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned117] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.705 INFO: Spawning static cube actor [MelonaSpawned118] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.706 INFO: Spawning static cube actor [MelonaSpawned119] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.706 INFO: Spawning static cube actor [MelonaSpawned120] with model ID [Cube], with cached ID of [Cube] +192:07:2026 01:57:48.709 DEBUG: Starting Main Thread +192:07:2026 01:57:48.710 DEBUG: Starting Fast Thread +192:07:2026 01:57:48.710 DEBUG: Starting Render Thread +192:07:2026 01:57:48.924 INFO: Launched Terrain4J Engine +192:07:2026 01:57:48.924 DEBUG: Primary Thread Started +192:07:2026 01:57:48.924 INFO: Terrain4J dedicated server running without GLFW/Vulkan/OpenAL +192:07:2026 01:57:48.924 DEBUG: Main Thread Started +192:07:2026 01:57:48.924 DEBUG: Render Thread Started +192:07:2026 01:57:48.924 DEBUG: Fast Thread Started diff --git a/resources/EngineResources/audio/music/WildWestIntroTheme.ogg b/resources/EngineResources/audio/music/WildWestIntroTheme.ogg new file mode 100644 index 0000000..7d001f8 Binary files /dev/null and b/resources/EngineResources/audio/music/WildWestIntroTheme.ogg differ diff --git a/src/main/java/net/halbear/Executable/Server.java b/src/main/java/net/halbear/Executable/Server.java index 047c50a..5d45b89 100644 --- a/src/main/java/net/halbear/Executable/Server.java +++ b/src/main/java/net/halbear/Executable/Server.java @@ -56,7 +56,7 @@ public class Server { public static void main(String[] args) throws IOException { Configuration.set("writer.file", "ServerLog.t4jlog"); - ServerSocket server = new ServerSocket(25565); + ServerSocket server = new ServerSocket(ServerConnectionThread.ServerPort); Logger.info("\nLaunching New Terrain4J Powered Software!"); RenderThread.Headless = true; diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Window.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Window.java index c3a65c5..9f8184b 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Window.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Window.java @@ -4,6 +4,7 @@ import net.halbear.Terrain4J.EngineCore.Input.KeyboardInput; import net.halbear.Terrain4J.EngineCore.Input.MouseListener; import net.halbear.Terrain4J.EngineCore.Logic.EngineConfig; import net.halbear.Terrain4J.EngineCore.Main.PrimaryRuntime; +import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFWImage; import org.lwjgl.glfw.GLFWVidMode; import org.lwjgl.glfw.GLFWWindowFocusCallback; @@ -53,8 +54,8 @@ public class Window { handle = glfwCreateWindow(width, height, title, MemoryUtil.NULL, MemoryUtil.NULL); if (glfwRawMouseMotionSupported()) { glfwSetInputMode(handle, GLFW_RAW_MOUSE_MOTION, GLFW_TRUE); - } - LockCursor(); + } + //LockCursor(); if (handle == MemoryUtil.NULL) { //throw new RuntimeException("Failed to create the GLFW window"); } @@ -106,11 +107,11 @@ public class Window { public void LockCursor(){ CursorLocked = true; - glfwSetInputMode(handle, GLFW_CURSOR, GLFW_CURSOR_DISABLED); + // glfwSetInputMode(handle, GLFW_CURSOR, GLFW_CURSOR_DISABLED); } public void UnlockCursor(){ CursorLocked = false; - glfwSetInputMode(handle, GLFW_CURSOR, GLFW_CURSOR_NORMAL); + //glfwSetInputMode(handle, GLFW_CURSOR, GLFW_CURSOR_NORMAL); } public void cleanup() { @@ -138,6 +139,14 @@ public class Window { } keyboardInput.input(); mouseInput.input(); + /* if(CursorLocked) { + int[] width = new int[1]; + int[] height = new int[1]; + glfwGetWindowSize(handle, width, height); + double centerX = width[0] / 2.0; + double centerY = height[0] / 2.0; + glfwSetCursorPos(handle, centerX, centerY); + }*/ EngineConfig.RENDERFRAMES++; } public void UpdateWindowTitle(){ diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Logic/EngineConfig.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Logic/EngineConfig.java index e7f4774..d5cb95d 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Logic/EngineConfig.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Logic/EngineConfig.java @@ -85,6 +85,8 @@ public class EngineConfig { public float WeaponVolume = 1.0f; public float AmbientVolume = 1.0f; + public float PlayerOnline = 1.0f; + public float PhysicsSpeed(){return PhysicsSpeed;} public void SetPhysicsSpeed(float NewSpeed){PhysicsSpeed =NewSpeed;} @@ -366,3 +368,6 @@ public class EngineConfig { return IconPath + IconName; } } + + + diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/GameCore.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/GameCore.java index 0cc1ad7..49b6860 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/GameCore.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/GameCore.java @@ -23,10 +23,7 @@ import net.halbear.Terrain4J.EngineCore.Logic.Physics.RigidBody.RigidPhysicsCont import net.halbear.Terrain4J.EngineCore.Logic.Physics.WorldPhysicsManager; import net.halbear.Terrain4J.EngineCore.Logic.Rendering.ModelLoader; import net.halbear.Terrain4J.EngineCore.Main.Scene.*; -import net.halbear.Terrain4J.EngineCore.Main.Scene.GUIs.Gimbal; -import net.halbear.Terrain4J.EngineCore.Main.Scene.GUIs.LoadingScreen; -import net.halbear.Terrain4J.EngineCore.Main.Scene.GUIs.SettingsMenu; -import net.halbear.Terrain4J.EngineCore.Main.Scene.GUIs.StartMenu; +import net.halbear.Terrain4J.EngineCore.Main.Scene.GUIs.*; import net.halbear.Terrain4J.EngineCore.Profiling.CPUMonitor; import net.halbear.Terrain4J.EngineCore.Profiling.GPUProfiler; import net.halbear.Terrain4J.EngineCore.Threads.ClientConnectionThread; @@ -45,6 +42,7 @@ import org.tinylog.Logger; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.UUID; import static org.lwjgl.glfw.GLFW.*; @@ -73,6 +71,7 @@ public class GameCore implements GameLogic { private LoadingScreen loadingScreen; public final StartMenu startMenu = new StartMenu(); public final SettingsMenu Settings = new SettingsMenu(); + public final CreditsMenu Credits = new CreditsMenu(); public boolean StartMenuActive = true; public List ActorEditorComponents = new ArrayList<>(); private Vector2f DeltaPos = new Vector2f(0,0); @@ -170,6 +169,8 @@ public class GameCore implements GameLogic { SpawnNewActor(engineInstance, new Vector3f(-5 + (float)Math.random() * 10,10 + (float)Math.random() * 10, -5 + (float)Math.random() * 10), new Vector3f(0, 0, 0), new Vector3f(1, 1, 1)); } } + Settings.textBuffer.set(ClientConnectionThread.ServerIP); + Settings.UsernameBuffer.set("Player"); return new InitData(models,materials,guiTextures); } @@ -315,7 +316,7 @@ public class GameCore implements GameLogic { LastMousePos.y = CurrentMousePos.y; if(MouseInput.isRightButtonPressed()){ - camera.AddRotation((float)Math.toRadians(-deltaPos.y * Multiplier),(float)Math.toRadians(-deltaPos.x * Multiplier),0); + camera.AddRotation((float)Math.toRadians(deltaPos.y * Multiplier),(float)Math.toRadians(deltaPos.x * Multiplier),0); } DeltaPos = new Vector2f(deltaPos); engineInstance.audioManager().UpdateListenerPosition(camera); @@ -420,6 +421,7 @@ public class GameCore implements GameLogic { } else if (StartMenuActive) { startMenu.RenderGUI(engineInstance, frameTimeNS, this); Settings.RenderGUI(engineInstance, frameTimeNS, this); + Credits.RenderGUI(engineInstance, frameTimeNS, this); if (startMenu.GameStarted && !StartMenu.ShowSettings) { StartMenuActive = false; } diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/PrimaryRuntime.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/PrimaryRuntime.java index 8a99094..097b715 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/PrimaryRuntime.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/PrimaryRuntime.java @@ -93,7 +93,7 @@ public class PrimaryRuntime { timer.scheduleAtFixedRate(new TimerTask() {; @Override public void run() { - String text = "Halbear.Net Launcher : " + PingServer(ClientConnectionThread.ServerIP, false); + String text = "Pinging : " + PingServer(ClientConnectionThread.ServerIP, false); if (ClientConnectionThread.Connected){ ClientConnectionThread.pinging = false; this.cancel(); diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/GUIs/CreditsMenu.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/GUIs/CreditsMenu.java new file mode 100644 index 0000000..59af30a --- /dev/null +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/GUIs/CreditsMenu.java @@ -0,0 +1,85 @@ +package net.halbear.Terrain4J.EngineCore.Main.Scene.GUIs; + +import imgui.ImDrawList; +import imgui.ImGui; +import imgui.ImGuiViewport; +import imgui.ImVec2; +import imgui.flag.ImGuiCol; +import imgui.flag.ImGuiCond; +import imgui.flag.ImGuiStyleVar; +import imgui.flag.ImGuiWindowFlags; +import imgui.type.ImInt; +import imgui.type.ImString; +import net.halbear.Terrain4J.EngineCore.Logic.EngineConfig; +import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance; +import net.halbear.Terrain4J.EngineCore.Main.AudioInstance; +import net.halbear.Terrain4J.EngineCore.Main.GameCore; +import net.halbear.Terrain4J.EngineCore.Main.PrimaryRuntime; +import net.halbear.Terrain4J.EngineCore.Main.Scene.GUIOverlay; +import net.halbear.Terrain4J.EngineCore.Main.Scene.Scene; +import net.halbear.Terrain4J.EngineCore.Threads.ClientConnectionThread; +import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DisplayToScreen.DeferredSceneRender; +import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DisplayToScreen.ForwardSceneRender; +import org.tinylog.Logger; + +public class CreditsMenu implements GUIOverlay { + public int[] Music = new int[]{100}; + public int[] SFX = new int[]{100}; + public int[] Weapons = new int[]{100}; + public int[] Ambient = new int[]{100}; + public ImInt ServerPort = new ImInt(25565); + public final ImString textBuffer = new ImString(100); + public final ImString UsernameBuffer = new ImString(24); + + @Override + public void RenderGUI(EngineInstance engineInstance, long frameTimeNS, GameCore parent) { + if (!StartMenu.ShowCredits) return; + ImGuiViewport viewport = ImGui.getMainViewport(); + int menuFlags = ImGuiWindowFlags.NoDecoration + | ImGuiWindowFlags.AlwaysAutoResize + | ImGuiWindowFlags.NoSavedSettings + | ImGuiWindowFlags.NoFocusOnAppearing + | ImGuiWindowFlags.NoNav + | ImGuiWindowFlags.NoMove; + + float CenterX = viewport.getWorkPosX() + viewport.getWorkSizeX() / 2.0f; + float CenterY = viewport.getWorkPosY() + viewport.getWorkSizeY() / 2.0f; + ImGui.setNextWindowPos(viewport.getWorkPosX(), viewport.getWorkPosY(), ImGuiCond.Always); + ImGui.setNextWindowSize(viewport.getWorkSizeX(), viewport.getWorkSizeY()); + ImGui.pushStyleColor(ImGuiCol.WindowBg, 0.08f, 0.08f, 0.1f, 1.0f); + ImGui.pushStyleVar(ImGuiStyleVar.WindowPadding, 40f, 30f); + ImGui.pushStyleVar(ImGuiStyleVar.ItemSpacing, 10f, 16f); + ImGui.pushStyleVar(ImGuiStyleVar.WindowRounding, 8f); + + ImGui.begin("Start Menu", menuFlags); + if (ImGui.button("Main Menu")) { + StartMenu.ShowSettings = false; + StartMenu.GameStarted = false; + StartMenu.ShowCredits = false; + } + ImGui.setWindowFontScale(8.0f); + float titleX = (viewport.getWorkSizeX() - ImGui.calcTextSize("Shooter Game").x) / 2.0f; + float titleY = viewport.getWorkSizeY() * 0.15f; + ImGui.setCursorPos(titleX, titleY); + ImGui.text("Game Credits"); + ImGui.setWindowFontScale(3.0f); + ImGui.spacing(); + ImGui.spacing(); + String[] Text = new String[]{"Game Engine Development","Harrison Corlett","Christian Lincoln","","Game Programming","Harrison Corlett","William Allen","","Art & Level Design","Harrison Corlett","","Music","Kevin Macleod - Incompetech","Luis Humanoide - Freesound.org","Flower Mantis - Freesound.org"}; + for(int i = 0; i < Text.length; i++) { + String text = Text[i]; + float rightEdge = ImGui.getMainViewport().getPos().x + ImGui.getMainViewport().getSize().x / 2; + ImVec2 textSize = new ImVec2(); + ImGui.calcTextSize(textSize, text); + float textWidth = textSize.x; + float targetX = rightEdge - textWidth / 2; + ImVec2 currentPos = new ImVec2(); + ImGui.getCursorScreenPos(currentPos); + ImGui.setCursorScreenPos(targetX, currentPos.y); + ImGui.text(text); + } + ImGui.end(); + ImGui.popStyleVar(3); + ImGui.popStyleColor(); + } +} \ No newline at end of file diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/GUIs/SettingsMenu.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/GUIs/SettingsMenu.java index 22591a0..c39cc4c 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/GUIs/SettingsMenu.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/GUIs/SettingsMenu.java @@ -1,11 +1,15 @@ package net.halbear.Terrain4J.EngineCore.Main.Scene.GUIs; +import imgui.ImDrawList; import imgui.ImGui; import imgui.ImGuiViewport; +import imgui.ImVec2; import imgui.flag.ImGuiCol; import imgui.flag.ImGuiCond; import imgui.flag.ImGuiStyleVar; import imgui.flag.ImGuiWindowFlags; +import imgui.type.ImInt; +import imgui.type.ImString; import net.halbear.Terrain4J.EngineCore.Logic.EngineConfig; import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance; import net.halbear.Terrain4J.EngineCore.Main.AudioInstance; @@ -13,6 +17,7 @@ import net.halbear.Terrain4J.EngineCore.Main.GameCore; import net.halbear.Terrain4J.EngineCore.Main.PrimaryRuntime; import net.halbear.Terrain4J.EngineCore.Main.Scene.GUIOverlay; import net.halbear.Terrain4J.EngineCore.Main.Scene.Scene; +import net.halbear.Terrain4J.EngineCore.Threads.ClientConnectionThread; import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DisplayToScreen.DeferredSceneRender; import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DisplayToScreen.ForwardSceneRender; import org.tinylog.Logger; @@ -22,6 +27,9 @@ public class SettingsMenu implements GUIOverlay { public int[] SFX = new int[]{100}; public int[] Weapons = new int[]{100}; public int[] Ambient = new int[]{100}; + public ImInt ServerPort = new ImInt(25565); + public final ImString textBuffer = new ImString(100); + public final ImString UsernameBuffer = new ImString(24); @Override public void RenderGUI(EngineInstance engineInstance, long frameTimeNS, GameCore parent) { @@ -44,6 +52,7 @@ public class SettingsMenu implements GUIOverlay { ImGui.pushStyleVar(ImGuiStyleVar.WindowRounding, 8f); ImGui.begin("Start Menu", menuFlags); + ImDrawList drawList = ImGui.getForegroundDrawList(); ImGui.setWindowFontScale(4.0f); if (ImGui.button("Return")) { StartMenu.ShowSettings = false; @@ -58,10 +67,47 @@ public class SettingsMenu implements GUIOverlay { StartMenu.GameStarted = false; } ImGui.sameLine(); + int color = ImGui.getColorU32(ClientConnectionThread.Connected ? 0.0f : 1.0f, ClientConnectionThread.Connected ? 1.0f : 0.0f, 0.0f, 1.0f); + String text = ClientConnectionThread.Connected ? "ONLINE" : "OFFLINE"; + float rightEdge = ImGui.getMainViewport().getPos().x + ImGui.getMainViewport().getSize().x; + ImVec2 textSize = new ImVec2(); + ImGui.calcTextSize(textSize, text); + float textWidth = textSize.x; + float targetX = rightEdge - textWidth - (textSize.y * 2); + + ImVec2 currentPos = new ImVec2(); + ImGui.getCursorScreenPos(currentPos); + ImGui.setCursorScreenPos(targetX, currentPos.y); + + ImGui.text(text); + drawList.addCircleFilled(rightEdge - (textSize.y), currentPos.y + textSize.y/2, textSize.y/2, color); + ImGui.text("Settings"); ImGui.setWindowFontScale(3f); ImGui.spacing(); if (ImGui.beginTabBar("Settings")) { + if (ImGui.beginTabItem("Multiplayer")) { + ImGui.setWindowFontScale(4.0f); + ImGui.text("Multiplayer Settings"); + ImGui.setWindowFontScale(3f); + ImGui.text("User Configuration"); + if (ImGui.inputText("Player Username", UsernameBuffer)) { + + } + ImGui.text("Server Configuration"); + if (ImGui.inputText("Server IP Address", textBuffer)) { + ClientConnectionThread.ServerIP = textBuffer.get(); + } + if (ImGui.inputInt("Server Port", ServerPort)) { + ClientConnectionThread.ServerPort = ServerPort.get(); + } + ImGui.text("Players Online: " + (ClientConnectionThread.Connected ? ClientConnectionThread.PlayersOnline : "Not Connected to Server")); + ImGui.text("Client UUID: " + (ClientConnectionThread.Connected ? ClientConnectionThread.clientUUID : "Not Connected to Server")); + if (ImGui.button("Apply and reconnect")) { + + } + ImGui.endTabItem(); + } if (ImGui.beginTabItem("Audio")) { ImGui.setWindowFontScale(4.0f); ImGui.text("Audio Settings"); diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/GUIs/StartMenu.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/GUIs/StartMenu.java index ba86d5c..1030f5f 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/GUIs/StartMenu.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/GUIs/StartMenu.java @@ -24,6 +24,7 @@ import org.tinylog.Logger; public class StartMenu implements GUIOverlay { public static boolean GameStarted = false; public static boolean ShowSettings = false; + public static boolean ShowCredits = false; public float Volume = 1.0f; private void ApplyVolume(EngineInstance engineInstance) { @@ -35,7 +36,7 @@ public class StartMenu implements GUIOverlay { } @Override public void RenderGUI(EngineInstance engineInstance, long frameTimeNS, GameCore parent) { - if (GameStarted || ShowSettings) return; + if (GameStarted || ShowSettings || ShowCredits) return; ImGuiViewport viewport = ImGui.getMainViewport(); int menuFlags = ImGuiWindowFlags.NoDecoration | ImGuiWindowFlags.AlwaysAutoResize @@ -77,6 +78,10 @@ public class StartMenu implements GUIOverlay { ShowSettings = true; } ImGui.setCursorPosX(buttonX); + if (ImGui.button("Credits", buttonWidth, buttonHeight)) { + ShowCredits = true; + } + ImGui.setCursorPosX(buttonX); if (ImGui.button("Quit", buttonWidth, buttonHeight)) { System.exit(0); } diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/Scene.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/Scene.java index 4ce154d..5436c64 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/Scene.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/Scene/Scene.java @@ -308,7 +308,7 @@ public class Scene implements IScene { } else { CurrentWeapon.SetPositionOffset(new Vector3f(0.5f,1.15f,-1.25f)); } - if(mouseListener.isRightButtonPressed()) { + if(mouseListener.isLeftButtonPressed()) { if (CurrentItem != null&& playerActor != null) { long NewTime = System.nanoTime(); float FireRate = 1000f/CurrentItem.FireRate(); diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/ServerNetworking/Packet.java b/src/main/java/net/halbear/Terrain4J/EngineCore/ServerNetworking/Packet.java index 63e178f..32dd888 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/ServerNetworking/Packet.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/ServerNetworking/Packet.java @@ -9,6 +9,7 @@ import java.nio.charset.StandardCharsets; import java.util.UUID; public class Packet { + public static final byte PACKET_UPDATE_LOCATION = 0; public static final byte PACKET_UPDATE_ROTATION = 1; public static final byte PACKET_UPDATE_LINEAR_VELOCITY =2; @@ -22,7 +23,10 @@ public class Packet { public static final byte PACKET_CLIENT_INPUT = 10; public static final byte PACKET_UPDATE_MODEL_ID = 11; public static final byte PACKET_FIRE_WEAPON = 12; - public byte PacketTypeByte; //0 Location 1 Rotation 2 LinearVelocity 3 AngularVelocity 4 CombinedActorDownload 5 Ping 6 PosRotVelAngularVel 7 AssignUUID + public static final byte PACKET_SEND_PLAYER_COUNT = 13; + public static final byte PACKET_UPDATE_PLAYER_DISPLAY_NAME = 14; + + public byte PacketTypeByte; public byte TargetType; //0 Actor public byte[] Data; public String TargetID; diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Threads/ClientConnectionThread.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Threads/ClientConnectionThread.java index 694eb88..0d61279 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Threads/ClientConnectionThread.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Threads/ClientConnectionThread.java @@ -1,5 +1,6 @@ package net.halbear.Terrain4J.EngineCore.Threads; +import net.halbear.Executable.Server; import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance; import net.halbear.Terrain4J.EngineCore.Logic.Physics.RigidBody.ConvexMesh; import net.halbear.Terrain4J.EngineCore.Logic.Physics.RigidBody.RigidBody; @@ -30,9 +31,10 @@ public class ClientConnectionThread implements Runnable{ public static final Queue IncomingPacketQueue = new ConcurrentLinkedQueue<>(); public static DataOutputStream outToServer; public static DataInputStream in; - public static long UUID; + public static String clientUUID; public static String OwnedActorID = "NULL"; public static String PendingPossessActorID = "NULL"; + public static int PlayersOnline = 0; private static boolean TryPossessActor(String actorID, GameCore gameCore, IScene scene){ Actor actor = Actor.Actors.get(actorID); @@ -90,7 +92,9 @@ public class ClientConnectionThread implements Runnable{ && packet.PacketTypeByte != Packet.PACKET_CREATE_ACTOR && packet.PacketTypeByte != Packet.PACKET_PING && packet.PacketTypeByte != Packet.PACKET_POSSESS_ACTOR - && packet.PacketTypeByte != Packet.PACKET_DESTROY_ACTOR) { + && packet.PacketTypeByte != Packet.PACKET_DESTROY_ACTOR + && packet.PacketTypeByte != Packet.PACKET_ASSIGN_UUID + && packet.PacketTypeByte != Packet.PACKET_SEND_PLAYER_COUNT) { continue; } @@ -241,15 +245,26 @@ public class ClientConnectionThread implements Runnable{ actorToChangeModelID.SetModelID(stringdata); } break; + case Packet.PACKET_SEND_PLAYER_COUNT: + System.out.println("decoding player count packet"); + stringdata = Packet.DecodeAsString(packet.Data); + PlayersOnline = Integer.parseInt(stringdata); + break; + case Packet.PACKET_ASSIGN_UUID: + System.out.println("decoding UUID packet"); + clientUUID = Packet.DecodeAsString(packet.Data); + break; } } } } + public static int ServerPort = 25565; + public ClientConnectionThread(){ Connected = true; try { - SocketToServer = new Socket(ServerIP, 25565); + SocketToServer = new Socket(ServerIP, ServerPort); SocketToServer.setSoTimeout(5); } catch (IOException e) { Connected = false; @@ -267,6 +282,14 @@ public class ClientConnectionThread implements Runnable{ } } + public static void RequestPlayerCount(){ + Packet packet = new Packet(Packet.PACKET_SEND_PLAYER_COUNT); + packet.SetTargetType((byte) 0); + packet.SetData(new byte[]{0}); + packet.SetID("NULL"); + OutGoingPacketQueue.add(packet); + } + public static void FireWeapon(String ActorID, float Damage){ Packet packet = new Packet(Packet.PACKET_FIRE_WEAPON); packet.SetTargetType((byte) 0); @@ -300,7 +323,6 @@ public class ClientConnectionThread implements Runnable{ if(in == null) return 0; Packet newIncomingPacket = new Packet(in.readByte()); - if(newIncomingPacket.PacketTypeByte == 5) { return 5; } @@ -344,7 +366,7 @@ public class ClientConnectionThread implements Runnable{ try { PacketRead = readPacket(in); } catch (SocketTimeoutException ignored) { - // No incoming packet this moment. Continue so outgoing packets can still flush. + } if(PacketRead == Packet.PACKET_PING){ diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Threads/ServerConnectionThread.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Threads/ServerConnectionThread.java index 22e5e16..040b694 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Threads/ServerConnectionThread.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Threads/ServerConnectionThread.java @@ -27,10 +27,20 @@ public class ServerConnectionThread implements Runnable{ private String OwnedActorID; private final Socket clientSocket; private final UUID ClientID; + private String PlayerDisplayName; + public static int PlayersOnline = 0; + + public static int ServerPort = 25565; public final Queue IncomingPacketQueue = new ConcurrentLinkedQueue<>(); public final Queue OutgoingPacketQueue = new ConcurrentLinkedQueue<>(); + public void SetPlayerDisplayName(String displayName){ + this.PlayerDisplayName = displayName; + } + + public String GetPlayerDisplayName(){return PlayerDisplayName;} + public UUID GetClientID(){ return ClientID; } @@ -47,7 +57,6 @@ public class ServerConnectionThread implements Runnable{ UUID uuid = UUID.randomUUID(); ClientID = uuid; this.clientSocket = clientSocket; - try { this.clientSocket.setSoTimeout(5); } catch (IOException e) { @@ -78,6 +87,8 @@ public class ServerConnectionThread implements Runnable{ } private void InitialiseJoinedClient(){ + Packet PlayerCountPacket = CreatePlayerCountPacket(Server.ConnectedClients.size()); + Server.OutGoingPacketQueue.add(PlayerCountPacket); EngineInstance engineInstance = PrimaryRuntime.GetEngineInstance(); IScene scene = engineInstance.scene(); @@ -101,6 +112,8 @@ public class ServerConnectionThread implements Runnable{ BroadcastCreateActorPacket(player); SendPossessActorPacket(player.GetID()); + Packet UUIDUpdatePacket = CreatePlayerUUIDPacket(ClientID,this); + Server.OutGoingPacketQueue.add(UUIDUpdatePacket); System.out.println("Queued possess packet for joining player's actor: " + player.GetID()); } @@ -123,7 +136,7 @@ public class ServerConnectionThread implements Runnable{ } if(PacketRead == Packet.PACKET_PING){ - WritePacket(new Packet(Packet.PACKET_PING),out); + WritePacket(new Packet(Packet.PACKET_PING),out,this); } if(PacketRead == -1) break; @@ -131,10 +144,12 @@ public class ServerConnectionThread implements Runnable{ if(!OutgoingPacketQueue.isEmpty()){ Packet packet; while((packet = OutgoingPacketQueue.poll()) != null) { - WritePacket(packet,out); + WritePacket(packet,out,this); } } } + Packet PlayerCountPacket = CreatePlayerCountPacket(Server.ConnectedClients.size()); + Server.OutGoingPacketQueue.add(PlayerCountPacket); System.out.println("Connection Closing: " + Thread.currentThread() + "\n"); } catch (Exception e) { System.out.println("Connection Closing: " + Thread.currentThread() + "\n"); @@ -188,10 +203,7 @@ public class ServerConnectionThread implements Runnable{ case Packet.PACKET_CLIENT_INPUT: if(!sender.OwnsActor(packet.TargetID)) return; - - // Later: decode input commands here instead of trusting full transforms. - // Example future data: - // forward/back/left/right/jump/yaw/pitch/sequenceNumber + //to be implemented later break; case Packet.PACKET_UPDATE_MODEL_ID: if(!packet.TargetID.equals(ConnectedClients.get(packet.ClientID).OwnedActorID)) { @@ -200,6 +212,11 @@ public class ServerConnectionThread implements Runnable{ Packet ReboundPacket = CreateUpdateModelIDPacket(packet.TargetID, Packet.DecodeAsString(packet.Data)); Server.OutGoingPacketQueue.add(ReboundPacket); break; + case Packet.PACKET_SEND_PLAYER_COUNT: + if(!packet.TargetID.equals("NULL")) { + return; + } + break; } } @@ -207,7 +224,23 @@ public class ServerConnectionThread implements Runnable{ return OwnedActorID != null && OwnedActorID.equals(actorID); } + public static Packet CreatePlayerUUIDPacket(UUID clientID, ServerConnectionThread sender){ + System.out.println("Creating UUID packet for client: " + clientID); + Packet packet = new Packet(Packet.PACKET_ASSIGN_UUID); + packet.SetTargetType((byte) 0); + packet.SetData(clientID.toString().getBytes(StandardCharsets.UTF_8)); + packet.SetID("New Client"); + packet.ClientID = sender.ClientID; + return packet; + } + public static Packet CreatePlayerCountPacket(int PlayerCount){ + Packet packet = new Packet(Packet.PACKET_SEND_PLAYER_COUNT); + packet.SetTargetType((byte) 0); + packet.SetData(Integer.toString(PlayerCount).getBytes(StandardCharsets.UTF_8)); + packet.SetID("New Client"); + return packet; + } public static Packet CreateActorPacket(Actor actor){ Packet newOutgoingPacket = new Packet(Packet.PACKET_CREATE_ACTOR); @@ -337,8 +370,12 @@ public class ServerConnectionThread implements Runnable{ return 0; } - public static void WritePacket(Packet outPacket, DataOutputStream Outgoing) throws IOException { - if(Outgoing == null ) return; + public static void WritePacket(Packet outPacket, DataOutputStream Outgoing, ServerConnectionThread client) throws IOException { + if(Outgoing == null || outPacket.PacketTypeByte == Packet.PACKET_ASSIGN_UUID && outPacket.ClientID != client.ClientID){ + System.out.println(outPacket.PacketTypeByte == Packet.PACKET_ASSIGN_UUID ? "Packet Client ID: " + outPacket.ClientID + " != " + client.ClientID : + "Packet not sent to client: " + outPacket.ClientID); + return; + } byte[] DataToSend = Packet.GetOutgoingData(outPacket); Outgoing.write(DataToSend); }