diff --git a/src/bb/loader.bbmodel b/src/bb/loader.bbmodel new file mode 100644 index 000000000..6c2f8a72b --- /dev/null +++ b/src/bb/loader.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.10","model_format":"modded_entity","box_uv":true},"name":"loader","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":128,"height":64},"elements":[{"name":"torso","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-10,32,-6],"to":[10,42,7],"autouv":0,"color":5,"origin":[-7,28,-7],"faces":{"north":{"uv":[13,13,33,23],"texture":0},"east":{"uv":[0,13,13,23],"texture":0},"south":{"uv":[46,13,66,23],"texture":0},"west":{"uv":[33,13,46,23],"texture":0},"up":{"uv":[33,13,13,0],"texture":0},"down":{"uv":[53,0,33,13],"texture":0}},"type":"cube","uuid":"814c3695-0447-39a1-76f7-67446edfae84"},{"name":"waist","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-3,24,-5],"to":[3,29,3],"autouv":0,"color":5,"origin":[-7,13,-8],"uv_offset":[0,50],"faces":{"north":{"uv":[8,58,14,63],"texture":0},"east":{"uv":[0,58,8,63],"texture":0},"south":{"uv":[22,58,28,63],"texture":0},"west":{"uv":[14,58,22,63],"texture":0},"up":{"uv":[14,58,8,50],"texture":0},"down":{"uv":[20,50,14,58],"texture":0}},"type":"cube","uuid":"d4bde61a-a2bc-2e0e-d424-6d2a5fd49c8e"},{"name":"leg_r","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[4,0,-3],"to":[8,16,4],"autouv":0,"color":5,"origin":[-4,0,-9],"uv_offset":[84,24],"faces":{"north":{"uv":[91,31,95,47],"texture":0},"east":{"uv":[84,31,91,47],"texture":0},"south":{"uv":[102,31,106,47],"texture":0},"west":{"uv":[95,31,102,47],"texture":0},"up":{"uv":[95,31,91,24],"texture":0},"down":{"uv":[99,24,95,31],"texture":0}},"type":"cube","uuid":"875db368-a5a5-0032-1521-03229112dabe"},{"name":"leg_l","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-9,16,-4],"to":[-3,28,2],"autouv":0,"color":5,"origin":[-16,12,-9],"uv_offset":[66,46],"faces":{"north":{"uv":[72,52,78,64],"texture":0},"east":{"uv":[66,52,72,64],"texture":0},"south":{"uv":[84,52,90,64],"texture":0},"west":{"uv":[78,52,84,64],"texture":0},"up":{"uv":[78,52,72,46],"texture":0},"down":{"uv":[84,46,78,52],"texture":0}},"type":"cube","uuid":"6c41d302-78c7-0b70-1381-dc318bdeffaa"},{"name":"arm_r","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[12,27,-3],"to":[16,43,5],"autouv":0,"color":5,"origin":[5,27,-7],"uv_offset":[80,0],"faces":{"north":{"uv":[88,8,92,24],"texture":0},"east":{"uv":[80,8,88,24],"texture":0},"south":{"uv":[100,8,104,24],"texture":0},"west":{"uv":[92,8,100,24],"texture":0},"up":{"uv":[92,8,88,0],"texture":0},"down":{"uv":[96,0,92,8],"texture":0}},"type":"cube","uuid":"119c57f2-6f39-6a4a-d621-2f39f6afe8de"},{"name":"joint","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[10,33,-2],"to":[12,39,4],"autouv":0,"color":5,"origin":[4,26,-7],"uv_offset":[96,52],"faces":{"north":{"uv":[102,58,104,64],"texture":0},"east":{"uv":[96,58,102,64],"texture":0},"south":{"uv":[110,58,112,64],"texture":0},"west":{"uv":[104,58,110,64],"texture":0},"up":{"uv":[104,58,102,52],"texture":0},"down":{"uv":[106,52,104,58],"texture":0}},"type":"cube","uuid":"881ca750-ae6a-60ac-4442-e7fa528a00dc"},{"name":"arm_r","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[12,8.2,-2],"to":[16,27.2,6],"autouv":0,"color":5,"inflate":-0.1,"origin":[5,11.2,-6],"uv_offset":[0,23],"faces":{"north":{"uv":[8,31,12,50],"texture":0},"east":{"uv":[0,31,8,50],"texture":0},"south":{"uv":[20,31,24,50],"texture":0},"west":{"uv":[12,31,20,50],"texture":0},"up":{"uv":[12,31,8,23],"texture":0},"down":{"uv":[16,23,12,31],"texture":0}},"type":"cube","uuid":"04cc32cf-81f9-b699-03b1-ab6f6e096afe"},{"name":"arm_l","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,8.2,-1],"to":[-12,27.2,7],"autouv":0,"color":5,"inflate":-0.1,"origin":[-23,11.2,-5],"uv_offset":[24,23],"faces":{"north":{"uv":[32,31,36,50],"texture":0},"east":{"uv":[24,31,32,50],"texture":0},"south":{"uv":[44,31,48,50],"texture":0},"west":{"uv":[36,31,44,50],"texture":0},"up":{"uv":[36,31,32,23],"texture":0},"down":{"uv":[40,23,36,31],"texture":0}},"type":"cube","uuid":"f3f72252-bd21-08bf-61ea-10740d9905c1"},{"name":"arm_l","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-16,27,-2],"to":[-12,43,6],"autouv":0,"color":5,"origin":[-23,27,-6],"uv_offset":[104,0],"faces":{"north":{"uv":[112,8,116,24],"texture":0},"east":{"uv":[104,8,112,24],"texture":0},"south":{"uv":[124,8,128,24],"texture":0},"west":{"uv":[116,8,124,24],"texture":0},"up":{"uv":[116,8,112,0],"texture":0},"down":{"uv":[120,0,116,8],"texture":0}},"type":"cube","uuid":"a9e25394-526f-d387-d1ed-8d53a3085025"},{"name":"joint","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-12,33,-1],"to":[-10,39,5],"autouv":0,"color":5,"origin":[-18,26,-6],"uv_offset":[112,52],"faces":{"north":{"uv":[118,58,120,64],"texture":0},"east":{"uv":[112,58,118,64],"texture":0},"south":{"uv":[126,58,128,64],"texture":0},"west":{"uv":[120,58,126,64],"texture":0},"up":{"uv":[120,58,118,52],"texture":0},"down":{"uv":[122,52,120,58],"texture":0}},"type":"cube","uuid":"9d99a85f-5d82-fb1d-1a34-32e445b2a60b"},{"name":"leg_r","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[3,16,-4],"to":[9,28,2],"autouv":0,"color":5,"origin":[-4,12,-9],"uv_offset":[48,34],"faces":{"north":{"uv":[54,40,60,52],"texture":0},"east":{"uv":[48,40,54,52],"texture":0},"south":{"uv":[66,40,72,52],"texture":0},"west":{"uv":[60,40,66,52],"texture":0},"up":{"uv":[60,40,54,34],"texture":0},"down":{"uv":[66,34,60,40],"texture":0}},"type":"cube","uuid":"33d60e6d-97a2-25f9-335e-1b1e34feb983"},{"name":"leg_l","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-8,0,-3],"to":[-4,16,4],"autouv":0,"color":5,"origin":[-16,0,-9],"uv_offset":[106,24],"faces":{"north":{"uv":[113,31,117,47],"texture":0},"east":{"uv":[106,31,113,47],"texture":0},"south":{"uv":[124,31,128,47],"texture":0},"west":{"uv":[117,31,124,47],"texture":0},"up":{"uv":[117,31,113,24],"texture":0},"down":{"uv":[121,24,117,31],"texture":0}},"type":"cube","uuid":"f28e1a84-932b-1c79-948e-0bb712c319d5"},{"name":"head","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1,30,-7],"to":[7,33,-4],"autouv":0,"color":5,"origin":[-3,26,-10],"uv_offset":[48,23],"faces":{"north":{"uv":[51,26,57,29],"texture":0},"east":{"uv":[48,26,51,29],"texture":0},"south":{"uv":[60,26,66,29],"texture":0},"west":{"uv":[57,26,60,29],"texture":0},"up":{"uv":[57,26,51,23],"texture":0},"down":{"uv":[63,23,57,26],"texture":0}},"type":"cube","uuid":"39910222-2ee3-f872-643d-0e5eb3b52c76"},{"name":"waist","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-2,27,-3],"to":[2,34,4],"autouv":0,"color":5,"rotation":[15,0,0],"origin":[0,29,1],"uv_offset":[28,50],"faces":{"north":{"uv":[35,57,39,64],"texture":0},"east":{"uv":[28,57,35,64],"texture":0},"south":{"uv":[46,57,50,64],"texture":0},"west":{"uv":[39,57,46,64],"texture":0},"up":{"uv":[39,57,35,50],"texture":0},"down":{"uv":[43,50,39,57],"texture":0}},"type":"cube","uuid":"b8a04e05-1ec0-77f7-9790-9eac08a7dba6"},{"name":"canister","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-5,23,3],"to":[5,27,7],"autouv":0,"color":9,"origin":[0,25,4],"uv_offset":[53,0],"faces":{"north":{"uv":[57,4,67,8],"texture":0},"east":{"uv":[53,4,57,8],"texture":0},"south":{"uv":[71,4,81,8],"texture":0},"west":{"uv":[67,4,71,8],"texture":0},"up":{"uv":[67,4,57,0],"texture":0},"down":{"uv":[77,0,67,4],"texture":0}},"type":"cube","uuid":"95641dec-5f50-5280-94bd-3367b934546e"},{"name":"antenna","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-8,41,6],"to":[-8,55,8],"autouv":0,"color":0,"rotation":[15,0,0],"origin":[-8,48,7],"uv_offset":[76,6],"faces":{"north":{"uv":[78,8,78,22],"texture":0},"east":{"uv":[76,8,78,22],"texture":0},"south":{"uv":[80,8,80,22],"texture":0},"west":{"uv":[78,8,80,22],"texture":0},"up":{"uv":[78,8,78,6],"texture":0},"down":{"uv":[78,6,78,8],"texture":0}},"type":"cube","uuid":"ffa15fd9-1b87-5f57-f40e-84f4af6e8cea"}],"outliner":[{"name":"root","origin":[0,0,0],"color":0,"uuid":"70492b75-a238-2093-aee7-2e34103a16f7","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":[{"name":"Head","origin":[4,32,-5],"color":0,"uuid":"1ac29cbf-6a37-f40e-3378-1970cfbbcedf","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["39910222-2ee3-f872-643d-0e5eb3b52c76"]},{"name":"Body","origin":[0,26,-1],"color":0,"uuid":"88d057c8-aaec-acdf-2b62-5ff3c25da745","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["814c3695-0447-39a1-76f7-67446edfae84","d4bde61a-a2bc-2e0e-d424-6d2a5fd49c8e","b8a04e05-1ec0-77f7-9790-9eac08a7dba6","ffa15fd9-1b87-5f57-f40e-84f4af6e8cea","9d99a85f-5d82-fb1d-1a34-32e445b2a60b","881ca750-ae6a-60ac-4442-e7fa528a00dc","95641dec-5f50-5280-94bd-3367b934546e"]},{"name":"LeftLeg","origin":[-4,26,-1],"color":0,"uuid":"1a6dd538-885d-1a07-b404-079aa2a6d33e","export":true,"mirror_uv":false,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["f28e1a84-932b-1c79-948e-0bb712c319d5","6c41d302-78c7-0b70-1381-dc318bdeffaa"]},{"name":"RightLeg","origin":[4,26,-1],"color":0,"uuid":"95722aa0-de6d-5b71-e4a2-6e4961d4ec06","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["875db368-a5a5-0032-1521-03229112dabe","33d60e6d-97a2-25f9-335e-1b1e34feb983"]},{"name":"LeftArm","origin":[-13,36,2],"color":0,"uuid":"f844f14b-21ca-39e1-6894-44acf6a87e82","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["a9e25394-526f-d387-d1ed-8d53a3085025",{"name":"ElbowL","origin":[-14,27,1],"color":0,"uuid":"268467a2-4618-ea8b-5939-33514427d85d","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["f3f72252-bd21-08bf-61ea-10740d9905c1"]}]},{"name":"RightArm","origin":[13,36,1],"color":0,"uuid":"5f36cdfe-dde4-7230-1baf-aa1a87c0547b","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["119c57f2-6f39-6a4a-d621-2f39f6afe8de",{"name":"ElbowR","origin":[14,27,0],"color":0,"uuid":"633b2662-0fe0-f0d4-c002-49d98baece5f","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["04cc32cf-81f9-b699-03b1-ab6f6e096afe"]}]}]}],"textures":[{"path":"L:\\overdrive_that_matters\\src\\main\\resources\\assets\\overdrive_that_matters\\textures\\entity\\loader.png","name":"loader.png","folder":"block","namespace":"","id":"0","group":"","width":128,"height":64,"uv_width":128,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","pbr_channel":"color","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"5d91dc01-e8a2-6bd9-d3d2-e81fe7ee8465","relative_path":"../main/resources/assets/overdrive_that_matters/textures/entity/loader.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAAAXNSR0IArs4c6QAADJVJREFUeF7tXW+MnkUR3xobeqlwtJCc5bQWwctZwVBChVZDYjSiARL5U2sIQWzPP/BBEhsVv2j8JBprRBPU2FolhNiUqkmLBqMxKdCiJVSl1MuB0lbbcgk0HNgUUmPNb9/O03nmZndnnz/v+x7X/XLvPc/s7Ozub2dnZ3b3meMqpJ3bV5/k2Y5MHnOLhuZHOa249hf+/ebNm93q1avdroc/WdA/ve9F/3v9hn9N47Fu7O0q3xjt5778hzk802+vvtrL+9CFQ+7m5ydL/PizI8eP+3c/dM7dIUrlz9bs3l3iH6s4tRXa6MWXjrvf7XxziXzrrx8x89LK+fG3P3Ty/PMGivZfv+HlLP6VCt+68boSACwYOjH/1hLZ3GMPFP+jYZA2bHllGquxVeeo7GO0IQBsWDjgxo52yqLEnxEAHh5e6K49dLREx5/lAOCmj19z8uCho27x8EL3kZX/9QDA/0h41gQAiCf4IeXwrwQAqQEsACANQLRcA9z1jX+6UEeDHhUcvmDIZz10eNI3ZCgBGLvFCP3p8uUesKmOXTQw0AFiAigf27HD3G5oK4z+B7edKADw9L7nfTmXLr2wMQDccv1crwWgAXL4myvCG9wKAJoa8PfGNdvcxMSEGxkZ8awkAKampqb16eDgoHvv0iVu/vwBd+xYZ+TS77/t2+9CeUIASKl2AkBqqjgDAGEDhEYj5vZLl57v8PezX/p9Mf9rAAjxiAEglAfz9+Rrr/nXQ/PmFb9/OW+eu/HUc8rLn3Fa/G4CELNaA+QAIKYBXp56pTQFnDt4jotpAHTyc5ePOuS74h+HC5ykAADCJy+6wIH/xU+Nu8sWLHCwCx5fukQ1Ht+/b78HSUwjzGoANDUFaCM9BQDekdpoDz3jwGkCAJoRmDNHp+wrrAKkEZjDv1UbgAufMgJDGiDWAKE8/TYFoA58GZjTQRYAyGVgDv/KANi45X9etrWr3pSS0b+XABi7/RNFfqwCtM4EAQxBLcXopRFoEtBINDIyUloC/+y7y7zlvW7s3BIH+SzkB5DFYoUTW9en6PE+R56+AUBsGcgrra3/ZaP0OwCwTpcABtDJVyABkEPfNQCQx0kiPzSQpAa4+YaPelLkJz9AqnMBEqLpFw3wza+M+DU+1uE8ac/IE2jpUOIFPjn0yJcjTyUNUMUTeMkH1pcaaO9j64r/Y55AnsmqJaQn0KjdTWRNTAHkqZMFxjSAJpxG3zUNwAXKiQWQM0iLBUg/uTbfWXqpTQCgfALBxMTEHCzzcuZcqiOWmjxhyYoUsgGs9NkAoHVqKpgDxqGOrguAGG/Z4VpZmF5CXkYNMBqPlddtNmtDDQByVGN08umRG4HoTM23gWcaAHLoCQBWeTyC+Xo9NMIAEN5wB/9zg1u2bJnbs2ePz4LfSC89+zWVBdkAmgbgAEAZVhmIrtcACMnMB5UEgObejgHASk9tqbWhJo8HAIVjLeoVrl0kAgB+AwQEhsVv+VUlAFSRoV8AYGm3bgIgR54CALCuoba0uYasUMTmCQC8kCamAAAAMX5aDoXkgCEoZSANQDJxAzOmTfi7OlNAToPDBshR6bAvcugtspCWgPFdACAlGLxL3QAAQqSpCmsA4BXnBqa1QboJAMhkNepouW2lt9aXNNI0AITmmm4DIDbnzXQAtL0MtICgMQAQI+690gRIGYE0BZAGsACA7IbBxZ8pFTl18CfTpomYjQFAdVMD0JT66bPOcrsuW+nG//THYurTVgFEP3rlB92Kv+x0m15/PUhv6fxKUwCE4POv1Wij0WoBALdDYssk4gkZQlvDpJZI0dYFQGz1Qp0iPYFNAiDV8XKZX2gAePUgWMoIRAEAAEY6krbBUQpBaMZz8gTSikEaaiQDaGPGqJQhtDmU5OSNH6O9ae32yn4APqJSHUGhW7iyqwAA/KXGSJWpaecCAIgngwGNJNpYSEz5fCVdsX9+prMJMZTe957TGys1NS3z8dEckkPK0NZO4lSj0ntt1y832KDJ+CZN5Ks6BSAvpgEOAOKnDRzNr0ByFwBIVRQbGjgNgh40+lHRjT/fYh45WlmSP60ASHvkjEzJK1W3ujtywZ/HRXi7UNnoBB6fT8nEtSZoEdhJJc5fgk/y47z8MjDFnHa0EMLaAAAfITMNAKn24+8lQOVqoGoYuw5fEwA4wjgA/AioebABwmsjpIoGWPupVVnnFepqr5zOB60cTFRv4oPgUi7PunyTBcoOakMDSBXG567UFEDol44S2ZAUbQs1cF0gWzpOtmWTGoC3YQ7fNxQA4Du49777i764687b/G+cKehHADSpATgAcvjWAkA/TAFnNEBnapm1GsCievuFRnZUzkiN1aEO31oaoKllYB0boF861yJHnZGaA4AsG0Du75Nr2V6tY7khGKo8ZG17+5elY+VSDwMD9ggSDrOSgSrbkj+nw68xe6UNvj4aSBWQmxbwXPNkhSzu2I4WrSHJMJN+ACpXBkY4D5J1pgEgVFcJAN7ZBIoYAKryVQEQQz3fN8ARLB04FHzgGxpC9LHyQlHGmQQAixaRAMD/u3b/3WddsfzdhSbhmqUJvtMAEGPKpweM3qYAIAM3UgZtw2oKACG3sDS8qKyqThgpK8qVo9fSUdSxNNpTAKDj8ineKb4lAMSYadODpK8yBcTUvEWe0BRAQS7JQwsegaYtAKQ6SL7X1L32rCm+c1KHPOjQBhWYu3c/lz6lDaQ8IQCgXjKQAi/mPT8q3xFE9arqh09pgKY6ijQujeim+FbSAP20pSkEABi3OHJ29+c7V8ug4+/9+jv9ZRVaasqY5FMARq61w4jWMgU0ybcyAKpuaGh6S1MMAPzEDv3uJgAANEtncRoLAJrkOysBMPnqJSUlMHT23sb8CdIIbEpV990U0C8aADZGyJDUNADvEMuZ/dwoYVMA0IDDVxdVgSXz1dYAYBjbpYpOaHNXa1MACDm3cvcMyOUnre9THQaPYU5qim8tAFi2KWsAQEVxYVPoeLOlIfjojWkA7iGTdxloBzZ52VViHTg4StfbcV9Jqk5EG7r7CPnb4Nt1AGBDI1WmbQDIrdqhrdHcu1kXAMtPXUqJ6+1SexAkKAA4ACCWmuZbyQ+QUum8AnwbNO1olQDg9Ll+gNgUkBp1bWoAXnboNhOikfcgWe9LaoKvSQNQQ6UaVHYkRpz1AEnqZJFmvOEZBwDRpO464JpB28nLy6prA+S0WS9ozQCwbE/mFeB311oqRvQWWnQgl4ffHZzSIMSfexRpCtDKDqnxUEwhdKuZpV69oMkCgNxzLoNBVAE0GnUoXSenBY80eksjEAAoAkl5rHEFy/KP89RkajumYGmHJmiSNgAVghGXCwDk/c2OzsYICwByKkTyPLrrrz4bRh4dG7NMAXQUjc+j4EH/02+6BUxqt7ZjCjltUYf2DQ2AJ8c7N5NTumJ0wv8kDYCjaCkA4CLIXsQU6nRqTl7TnkCNobwXj2hS+/hjwm3fe6B0sGPT+h+UyLdu+s40eenCJk0DAACkefD3w1e+UAkAvYgp5HRiHVoTALQbp2AEacuXOnF1AOCqi9/m6/PEc/92AMDw0Fv9/4cmX3BWAFCDPLP/ouK2EUxfwws6F1ohWacAeRUsDyq1GVOo06k5eU0AkBYvLnHoFwDkVDZGCxduv8UUuLxVYhKW/GcAcKqVmgJAUzEFec4x1x9hzX8GAEYAdDum8IU7byvZQ9+/7/5kX/ERb82fZMoPM1ABs20K6EVMwdqBoWnNmt8EgG4agbxCllVAN2yAVBltxBSsKjwkmzW/CQBaIVWXgbRsgxahxI1MHjDiGkfS4n4d7EOgVGf1AR7cBiCeFocSX1XEXMq5c7jcV9CaEZjaFZxCf+578qDxr4HxEOii0cvdkfGnSmw1WnwYCnsKKNXd1UsAIH5NxxRCAKAdRLzCMv4QuiSS8tR57z2BIbcmdtTKS6L5xdJV8t3+xc5aPKQBrrn1DvfIA/jC3+mk0d49OOjuYd8abEIDUIltxBRCIxiqWrsSTwKCfzhT6/Cq7z0AvvqtjotUJvjBCQD8HT2z5CM1SsCBWxWJ3wLGbYyrrr/Fvz/w7Lh7x7tG/d+5r57eJHHi7CX+OaUntj3of9bVADGPYkjL5biUQwAFALRLMfmJnjbfmwCgNQAqXwUAKQ2glaVpANgAh1etKbRFXQ2QcilzuarEFGYsAELox/MYAEL5Jr53wH/NEx9jJGTjA4z40qf8yifxCNkAuGYV5wyQL+eDzppsKQDUjSnEANDTKSDWwW28S60CUKa08C0rhjY0ANW/iZhCSL5eG4H/B+VWqNfitjynAAAAAElFTkSuQmCC"}],"animations":[{"uuid":"1c636d17-a07c-9948-4cbd-ca4621e1570d","name":"Idle","loop":"loop","override":false,"length":0.16,"snapping":25,"selected":false,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"88d057c8-aaec-acdf-2b62-5ff3c25da745":{"name":"Body","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"4c8bc2ce-01d3-3618-51be-c32772f9f3e5","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"-0.1","z":"0"}],"uuid":"eee55604-44a1-cb70-a605-9d301960a66c","time":0.08,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"1a2b0737-505d-f39b-e2ba-c1177be3183e","time":0.16,"color":-1,"interpolation":"linear"}]},"1ac29cbf-6a37-f40e-3378-1970cfbbcedf":{"name":"Head","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"-0.1","z":"0"}],"uuid":"3495d3da-b68f-2b36-d97c-b338c91ab3db","time":0.08,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"c80186d3-2820-1f4c-c630-0271f698f8de","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"2b5fac7a-1c1f-025e-d99d-d73925652d3a","time":0.16,"color":-1,"interpolation":"linear"}]},"f844f14b-21ca-39e1-6894-44acf6a87e82":{"name":"LeftArm","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"0.1","z":"0"}],"uuid":"0ba8d7f1-f6bb-d281-4d32-aa1320da9bac","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"-0.2","z":"0"}],"uuid":"5ec0529e-78af-da29-6b79-0dd5d41ca0c3","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"156daf99-5b44-74fa-f4fa-f88a7fe7fdf1","time":0.16,"color":-1,"interpolation":"linear"}]},"5f36cdfe-dde4-7230-1baf-aa1a87c0547b":{"name":"RightArm","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"0.1","z":"0"}],"uuid":"1669453e-e9ea-54eb-157a-ade5bc4acfca","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"-0.2","z":"0"}],"uuid":"f65492fa-fd3e-b6ec-5a87-a21616f07974","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"31f4b9e5-4ec9-34b5-2e98-2810f389e3cd","time":0.16,"color":-1,"interpolation":"linear"}]}}},{"uuid":"11883990-8ed5-76fb-6ad5-88877ad19206","name":"Move","loop":"loop","override":false,"length":0.48,"snapping":25,"selected":false,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"88d057c8-aaec-acdf-2b62-5ff3c25da745":{"name":"Body","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"d197d715-2135-a6b6-2c27-6102f7af421d","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"02b9f92d-f769-ba18-b3aa-c09db0c98d2f","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.3","z":"0"}],"uuid":"f185aefb-7095-6361-8b19-c83881676414","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"7c7e3f65-d803-9b49-ab9a-76d85beb56f9","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.3","z":"0"}],"uuid":"939bf97f-8385-970a-5778-b671eba240b8","time":0.36,"color":-1,"interpolation":"linear"}]},"1ac29cbf-6a37-f40e-3378-1970cfbbcedf":{"name":"Head","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"af1fda25-23f4-abcb-2732-83533bfa2ce9","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"c2ebf76a-0ccc-2c68-0518-908001c5a54d","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"8c4c4af1-8909-ce97-a249-86775ac5ee95","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.3\n\n","z":"0"}],"uuid":"c060f1a3-83b5-2ecb-3bc6-baef22237038","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.3\n\n","z":"0"}],"uuid":"b61c7f88-4c73-e6a6-9562-e58a2736fdca","time":0.36,"color":-1,"interpolation":"linear"}]},"1a6dd538-885d-1a07-b404-079aa2a6d33e":{"name":"LeftLeg","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-22.5","y":"0","z":"0"}],"uuid":"bd5770ff-8ccd-c043-d0fa-062d2e5048c4","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"22.5","y":"0","z":"0"}],"uuid":"b0893e6a-eb82-98d9-5eaf-8f4b2850bac8","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-22.5","y":"0","z":"0"}],"uuid":"2be537f5-bd1d-8a51-828d-132ae4b17475","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-2"}],"uuid":"edc991d2-7db9-3888-e406-f900b22e8a94","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"1c1a7f4d-9a40-84de-4a21-e7c60d497d74","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"2","z":"-2"}],"uuid":"37c5c3fc-c161-2b5c-5e4b-f6a04af7dde0","time":0.36,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-2"}],"uuid":"83acc05a-ad21-62ae-4117-00367709f538","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"1","z":"1"}],"uuid":"43acca1c-e84d-3891-7a81-4c70a03725b6","time":0.24,"color":-1,"interpolation":"linear"}]},"95722aa0-de6d-5b71-e4a2-6e4961d4ec06":{"name":"RightLeg","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"22.5","y":"0","z":"0"}],"uuid":"09ec6dd7-3127-1f13-e8a3-dcfd2da776fc","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-22.5","y":"0","z":"0"}],"uuid":"0173cd08-d356-d4ef-46b5-d7cbffdc01d1","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"22.5","y":"0","z":"0"}],"uuid":"e6a71516-8f2c-fe88-3290-14490c396a02","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"2"}],"uuid":"5a851052-195e-01c7-0dd0-7de72aeb81d8","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"2","z":"-2"}],"uuid":"13a4db9a-c9b3-2da0-8792-d8ab843c447e","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"-2"}],"uuid":"0d401039-50ff-f0e9-4183-4c3a3fd1db55","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"02de010a-22b6-5325-b11e-1acf694c255f","time":0.36,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"2"}],"uuid":"b7317f11-b928-29f7-98ae-e8573c385d10","time":0.48,"color":-1,"interpolation":"linear"}]},"f844f14b-21ca-39e1-6894-44acf6a87e82":{"name":"LeftArm","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"6","y":"0","z":"0"}],"uuid":"422efc11-7e19-3ecb-e011-a2fb51d1120f","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-6","y":"0","z":"0"}],"uuid":"2e0f259d-3095-aa71-87e9-b51eac2a3e17","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"6","y":"0","z":"0"}],"uuid":"ecf8f5d3-7a87-64f1-db04-4a54e117c463","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.2\n\n","z":"0"}],"uuid":"ed94c6d3-55ed-51cc-422b-e34430c4035b","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"4a566952-2082-99c6-0499-f32ac4639806","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"19af21f0-0527-bd6e-5b44-290d9c085384","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.2\n\n","z":"0"}],"uuid":"2fc07e1c-219d-5f0c-7b02-e4c042409aa2","time":0.36,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"15216770-03c9-b3dd-fe84-5bf991ccbcbc","time":0.48,"color":-1,"interpolation":"linear"}]},"633b2662-0fe0-f0d4-c002-49d98baece5f":{"name":"ElbowR","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-30\n\n","y":"0","z":"0"}],"uuid":"1e414dda-1b9b-5684-b718-8aa5e84cbffd","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-19.5","y":"0","z":"0"}],"uuid":"a4512673-e7f6-8465-1db6-a5666cc83612","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-30\n\n","y":"0","z":"0"}],"uuid":"bb27fe16-7b73-2d2a-7245-e38c6f3f725d","time":0.48,"color":-1,"interpolation":"linear"}]},"5f36cdfe-dde4-7230-1baf-aa1a87c0547b":{"name":"RightArm","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-6","y":"0","z":"0"}],"uuid":"59c1e6b7-0b46-a513-b3b8-0b6372a827da","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"6","y":"0","z":"0"}],"uuid":"eaa5279e-adee-6a2e-ad31-03808285c8e8","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-6","y":"0","z":"0"}],"uuid":"cecb0f80-0f7c-f85a-d290-63c80c8dae67","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.2\n\n","z":"0"}],"uuid":"fbd8d639-3bf9-55b4-6900-a94c7fd626ab","time":0.12,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"02be819a-e5fb-4bb2-f14e-72bff7095860","time":0,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"10f78b40-9248-1bac-65c5-2baae38a1370","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"7ed7cae5-e481-b030-6d4d-b616b0eb616b","time":0.48,"color":-1,"interpolation":"linear"},{"channel":"position","data_points":[{"x":"0","y":"0.2\n\n","z":"0"}],"uuid":"87c26349-b1f0-063d-13c0-a1dbd5b4aa1e","time":0.36,"color":-1,"interpolation":"linear"}]},"268467a2-4618-ea8b-5939-33514427d85d":{"name":"ElbowL","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-16.5","y":"0","z":"0"}],"uuid":"b83eb8f9-d509-6eb4-88ea-d73a856b7c08","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-25.5","y":"0","z":"0"}],"uuid":"6ca26d91-3570-1ef5-bd53-1a935b06e9f5","time":0.24,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-16.5","y":"0","z":"0"}],"uuid":"a48444f7-dfe6-a98c-5cce-063d6acb5ddb","time":0.48,"color":-1,"interpolation":"linear"}]}}},{"uuid":"54cd83c4-2295-8df8-6f9f-d9d8db1267b5","name":"Atack","loop":"once","override":true,"length":0.48,"snapping":25,"selected":true,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"f844f14b-21ca-39e1-6894-44acf6a87e82":{"name":"LeftArm","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-135","y":"0","z":"0"}],"uuid":"c478f30b-1924-a3b8-24dc-efb0e6c3cfae","time":0.2,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"93e730fe-281f-85cd-7dce-bfbbb248338a","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"81b027a3-ba76-0438-942c-232afbad77d9","time":0.48,"color":-1,"interpolation":"linear"}]},"633b2662-0fe0-f0d4-c002-49d98baece5f":{"name":"ElbowR","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-2","y":"0","z":"0"}],"uuid":"4e491bfa-c7f7-8ac1-5eea-bd2e628376cf","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-24.5","y":"0","z":"0"}],"uuid":"71cbeb2d-40d3-03cf-4172-49307b99d085","time":0.2,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-2","y":"0","z":"0"}],"uuid":"20f7512e-2914-ee79-77e1-c24470e12344","time":0.48,"color":-1,"interpolation":"linear"}]},"5f36cdfe-dde4-7230-1baf-aa1a87c0547b":{"name":"RightArm","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-135","y":"0","z":"0"}],"uuid":"2ef7a014-1acc-1049-741b-fa5409872f45","time":0.2,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"1b4dc962-9f75-77e7-5ed7-cbaa2584ac81","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"33f2e475-8b15-bb20-8055-87c846f76f31","time":0.48,"color":-1,"interpolation":"linear"}]},"268467a2-4618-ea8b-5939-33514427d85d":{"name":"ElbowL","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-2","y":"0","z":"0"}],"uuid":"2d75223d-06ab-f5e8-bf82-212f2493500b","time":0,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-24.5","y":"0","z":"0"}],"uuid":"80416315-93aa-5f4f-a149-07138e0212a7","time":0.2,"color":-1,"interpolation":"linear"},{"channel":"rotation","data_points":[{"x":"-2","y":"0","z":"0"}],"uuid":"5a79cf0b-5910-89ef-9eac-2729d0aea7c3","time":0.48,"color":-1,"interpolation":"linear"}]}}}]} \ No newline at end of file diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt index 44f383f0f..249085671 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DecorativeData.kt @@ -226,6 +226,7 @@ fun addDecorativeData(blockStateProvider: MatteryBlockStateProvider, itemModelPr } DataGen.decorativePillar(MBlocks.METAL_BEAM, "metal_beam_side", "metal_beam_top") + blockModelProvider.decorativeCubeAll(MBlocks.METAL_BEAM_CENTER, "metal_beam_top") var labLampOn: BlockModelBuilder? = null var labLampOff: BlockModelBuilder? = null @@ -259,6 +260,9 @@ fun addDecorativeData(blockStateProvider: MatteryBlockStateProvider, itemModelPr itemModelProvider.block(MItems.DANGER_STRIPE_BLOCK, MItems.DANGER_STRIPE_BLOCK.registryName!!.path + "_0") itemModelProvider.block(MItems.METAL_BEAM) + blockStateProvider.block(MBlocks.METAL_BEAM_CENTER) + itemModelProvider.block(MItems.METAL_BEAM_CENTER) + blockStateProvider.exec { blockStateProvider.getVariantBuilder(MBlocks.LABORATORY_LAMP).forAllStates { return@forAllStates ConfiguredModel.builder() diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt index 332eadc9e..603be74a9 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/SoundDataProvider.kt @@ -47,6 +47,18 @@ class SoundDataProvider(event: GatherDataEvent) : SoundDefinitionsProvider(event .stream() )) + add( + MSoundEvents.LOADER_AMBIENT, + definition().subtitle("otm.sound.entity.loader.loader_ambient") + .with( + SoundDefinition.Sound.sound(modLocation("entity/loader/loader_ambient"), SoundDefinition.SoundType.SOUND) + .attenuationDistance(32) + .stream(), + SoundDefinition.Sound.sound(modLocation("entity/loader/loader_ambient2"), SoundDefinition.SoundType.SOUND) + .attenuationDistance(32) + .stream() + )) + add( MSoundEvents.ANDROID_PROJ_PARRY, definition().subtitle("otm.sound.android.projectile_parry") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt index bbf8da1e4..31d960642 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockModels.kt @@ -11,6 +11,8 @@ fun addBlockModels(provider: MatteryBlockModelProvider) { resourceCubeAll(MBlocks.DEEPSLATE_TRITANIUM_ORE) resourceCubeAll(MBlocks.TRITANIUM_INGOT_BLOCK) + resourceCubeAll(MBlocks.WITHERED_STEEL_BLOCK) + resourceCubeAll(MBlocks.DILITHIUM_ORE) resourceCubeAll(MBlocks.DEEPSLATE_DILITHIUM_ORE) resourceCubeAll(MBlocks.DILITHIUM_CRYSTAL_BLOCK) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt index 597b94ab4..13b574356 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/BlockStates.kt @@ -32,6 +32,20 @@ fun addBlockStates(provider: MatteryBlockStateProvider) { provider.ore(MBlocks.TRITANIUM_RAW_BLOCK) provider.block(MBlocks.TRITANIUM_INGOT_BLOCK) + provider.block(MBlocks.WITHERED_STEEL_BLOCK) + provider.exec { + provider.getVariantBuilder(MBlocks.ROFLITE_ALLOY_BLOCK).forAllStates { + val side1 = modLocation("block/resource/roflite_alloy_1") + val side2 = modLocation("block/resource/roflite_alloy_2") + val top = modLocation("block/resource/roflite_alloy_top") + + val a = provider.models().cube(MBlocks.ROFLITE_ALLOY_BLOCK.registryName!!.path, top, top, side1, side1, side2, side2).texture("particle", side1) + val b = provider.models().cube("${MBlocks.ROFLITE_ALLOY_BLOCK.registryName!!.path}_b", top, top, side2, side2, side1, side1).texture("particle", side2) + + return@forAllStates arrayOf(ConfiguredModel.builder().modelFile(a).buildLast(), ConfiguredModel.builder().modelFile(b).buildLast()) + } + } + provider.ore(MBlocks.DILITHIUM_ORE) provider.ore(MBlocks.DEEPSLATE_DILITHIUM_ORE) provider.block(MBlocks.DILITHIUM_CRYSTAL_BLOCK) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt index 452c25f6c..f071a31a6 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/ItemModels.kt @@ -35,6 +35,9 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.block(MItems.TRITANIUM_RAW_BLOCK) provider.block(MItems.TRITANIUM_INGOT_BLOCK) + provider.block(MItems.WITHERED_STEEL_BLOCK) + provider.block(MItems.ROFLITE_ALLOY_BLOCK) + provider.block(MItems.DILITHIUM_ORE) provider.block(MItems.DEEPSLATE_DILITHIUM_ORE) provider.block(MItems.DILITHIUM_CRYSTAL_BLOCK) @@ -68,6 +71,7 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.generated(MItems.PILL_HEAL) provider.generated(MItems.PILL_NOT_NORMAL) provider.generated(MItems.NUTRIENT_PASTE) + provider.generated(MItems.IMPERFECT_BREAD) provider.generated(MItems.REDSTONE_INTERACTOR) provider.generated(MItems.ESSENCE_DRIVE) @@ -100,6 +104,7 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.resource(MItems.DILITHIUM_CRYSTAL) provider.resource(MItems.WITHERED_STEEL) + provider.resource(MItems.ROFLITE_ALLOY_INGOT) provider.generated(MItems.EXOPACK_PROBE) @@ -110,6 +115,7 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.handheld(MItems.CHEST_UPGRADER) provider.generated(MItems.BREAD_MONSTER_SPAWN_EGG, modLocation("item/egg/bread_monster")) + provider.generated(MItems.LOADER_SPAWN_EGG, modLocation("item/egg/loader")) provider.generatedTiered(MItems.BATTERIES, "battery_tier") provider.generated(MItems.BATTERY_CREATIVE) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index ee8818b27..801a266c1 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -612,6 +612,8 @@ private fun blocks(provider: MatteryLanguageProvider) { add(MBlocks.HOLO_SIGN, "desc", "Multi-line, colored and glowing, text sign") add(MBlocks.TRITANIUM_INGOT_BLOCK, "Tritanium Plating Block") + add(MBlocks.WITHERED_STEEL_BLOCK, "Withered Steel Block") + add(MBlocks.ROFLITE_ALLOY_BLOCK, "Roflite Alloy Block") addBlock(MBlocks.ENERGY_COUNTER.values, "Energy Counter") addBlock(MBlocks.ENERGY_COUNTER.values, "desc", "Restricts energy flow direction;") @@ -679,6 +681,7 @@ private fun blocks(provider: MatteryLanguageProvider) { add(MBlocks.LABORATORY_LAMP_INVERTED, "Laboratory Lamp (Inverted signal)") add(MBlocks.DANGER_STRIPE_BLOCK, "Danger Stripes") add(MBlocks.METAL_BEAM, "Metal Beam") + add(MBlocks.METAL_BEAM_CENTER, "Metal Beam (Center)") add(MBlocks.TRITANIUM_DOOR[null]!!, "Tritanium Door") add(MBlocks.TRITANIUM_DOOR[null]!!, "description0", "High blast resistance door with redstone latch...") @@ -741,6 +744,7 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.ESSENCE_SERVO, "desc2", "Can be used as a tool to pump essence manually") add(MItems.NUTRIENT_PASTE, "Nutrient Paste") + add(MItems.IMPERFECT_BREAD, "Imperfect Bread") add(MItems.FLUID_CAPSULE, "Fluid Capsule") add(MItems.FLUID_CAPSULE, "named", "Fluid Capsule (%s)") @@ -788,6 +792,7 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.TRITANIUM_INGOT, "Tritanium Ingot") add(MItems.DILITHIUM_CRYSTAL, "Dilithium Crystal") add(MItems.WITHERED_STEEL, "Withered Steel Ingot") + add(MItems.ROFLITE_ALLOY_INGOT, "Roflite Alloy Ingot") add(MItems.TRITANIUM_NUGGET, "Tritanium Nugget") add(MItems.MATTER_IO_PORT, "Matter IO Port") add(MItems.MATTER_TRANSFORM_MATRIX, "Matter Transformation Matrix") @@ -915,6 +920,9 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.BREAD_MONSTER_SPAWN_EGG, "Bread Monster Spawn Egg") add(MEntityTypes.BREAD_MONSTER, "Bread Monster") + + add(MItems.LOADER_SPAWN_EGG, "Loader Spawn Egg") + add(MEntityTypes.LOADER, "Loader") } } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt index 229c311d1..8c2b8ba63 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt @@ -616,6 +616,8 @@ private fun blocks(provider: MatteryLanguageProvider) { add(MBlocks.HOLO_SIGN, "desc", "Многострочная, крашеная и светящееся, табличка") add(MBlocks.TRITANIUM_INGOT_BLOCK, "Блок слитков тритана") + add(MBlocks.WITHERED_STEEL_BLOCK, "Блок иссушенной стали") + add(MBlocks.ROFLITE_ALLOY_BLOCK, "Блок рофлитового сплава") addBlock(MBlocks.ENERGY_COUNTER.values, "Счётчик энергии") addBlock(MBlocks.ENERGY_COUNTER.values, "desc", "Ограничивает направление передачи энергии;") @@ -682,6 +684,7 @@ private fun blocks(provider: MatteryLanguageProvider) { add(MBlocks.LABORATORY_LAMP_INVERTED, "Лабораторная лампа (инвентированный сигнал)") add(MBlocks.DANGER_STRIPE_BLOCK, "Полоски 'опасность'") add(MBlocks.METAL_BEAM, "Металлическая опора") + add(MBlocks.METAL_BEAM_CENTER, "Металлическая опора (середина)") add(MBlocks.TRITANIUM_DOOR[null]!!, "Тритановая дверь") add(MBlocks.TRITANIUM_DOOR[null]!!, "description0", "Взрывоустойчивая дверь с засовом красного камня...") @@ -734,6 +737,7 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.ESSENCE_SERVO, "desc2", "Может использоваться как инструмент для ручной перекачки эссенции") add(MItems.NUTRIENT_PASTE, "Питательная паста") + add(MItems.IMPERFECT_BREAD, "Несовершенный хлеб") add(MItems.FLUID_CAPSULE, "Жидкостная капсула") add(MItems.FLUID_CAPSULE, "named", "Жидкостная капсула (%s)") @@ -781,6 +785,7 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.TRITANIUM_INGOT, "Тритановый слиток") add(MItems.DILITHIUM_CRYSTAL, "Дилитевый кристалл") add(MItems.WITHERED_STEEL, "Слиток иссушенной стали") + add(MItems.ROFLITE_ALLOY_INGOT, "Слиток рофлитового сплава") add(MItems.TRITANIUM_NUGGET, "Тритановый самородок") add(MItems.MATTER_IO_PORT, "Порт ввода/вывода материи") add(MItems.MATTER_TRANSFORM_MATRIX, "Матрица преобразования материи") @@ -908,6 +913,9 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.BREAD_MONSTER_SPAWN_EGG, "Яйцо призыва хлебного монстра") add(MEntityTypes.BREAD_MONSTER, "Хлебный монстр") + + add(MItems.LOADER_SPAWN_EGG, "Яйцо призыва погрузчика") + add(MEntityTypes.LOADER, "Погрузчик") } } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/DecorativeLoot.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/DecorativeLoot.kt index 4fe3eb50b..2eda654e7 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/DecorativeLoot.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/DecorativeLoot.kt @@ -50,6 +50,8 @@ fun addDecorativeLoot(lootTables: LootTables) { lootTables.dropsSelf(MBlocks.TRITANIUM_INGOT_BLOCK) { condition(ExplosionCondition.survivesExplosion()) } lootTables.dropsSelf(MBlocks.TRITANIUM_BARS) { condition(ExplosionCondition.survivesExplosion()) } + lootTables.dropsSelf(MBlocks.WITHERED_STEEL_BLOCK) { condition(ExplosionCondition.survivesExplosion()) } + lootTables.dropsSelf(MBlocks.TRITANIUM_HULL) { condition(ExplosionCondition.survivesExplosion()) } lootTables.dropsSelf(MBlocks.GENERATOR_BLOCK) { condition(ExplosionCondition.survivesExplosion()) } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/DecorativesRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/DecorativesRecipes.kt index 9d2799116..eb70427c6 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/DecorativesRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/DecorativesRecipes.kt @@ -177,6 +177,11 @@ fun addDecorativesRecipes(provider: MatteryRecipeProvider, consumer: RecipeOutpu .save(consumer, modLocation("decorative/vent/from_alt/${color?.name?.lowercase() ?: "default"}")) } + ShapelessRecipeBuilder(RecipeCategory.BUILDING_BLOCKS, MItems.METAL_BEAM_CENTER, 1).requires(MItems.METAL_BEAM) + .unlockedBy(MItems.METAL_BEAM) + ShapelessRecipeBuilder(RecipeCategory.BUILDING_BLOCKS, MItems.METAL_BEAM, 1).requires(MItems.METAL_BEAM_CENTER) + .unlockedBy(MItems.METAL_BEAM_CENTER) + MatteryRecipe(MRegistry.DECORATIVE_CRATE.item, 24, category = RecipeCategory.BUILDING_BLOCKS) .rowB(Tags.Items.INGOTS_IRON) .row(Tags.Items.INGOTS_IRON, Tags.Items.COBBLESTONES, Tags.Items.INGOTS_IRON) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt index 294a57307..cfbda0e05 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/ShapelessRecipes.kt @@ -93,4 +93,24 @@ fun addShapelessRecipes(consumer: RecipeOutput) { hammerRecipe(MItems.TRITANIUM_PLATE, MItemTags.TRITANIUM_INGOTS, consumer) hammerRecipe(MItems.IRON_PLATE, Tags.Items.INGOTS_IRON, consumer) hammerRecipe(MItems.GOLD_PLATE, Tags.Items.INGOTS_GOLD, consumer) + + ShapelessRecipeBuilder(RecipeCategory.BUILDING_BLOCKS, MItems.WITHERED_STEEL_BLOCK, 1) + .requires(Ingredient.of(MItems.WITHERED_STEEL), 9) + .unlockedBy(MItems.WITHERED_STEEL) + .save(consumer) + + ShapelessRecipeBuilder(RecipeCategory.MISC, MItems.WITHERED_STEEL, 9) + .requires(Ingredient.of(MItems.WITHERED_STEEL_BLOCK)) + .unlockedBy(MItems.WITHERED_STEEL_BLOCK) + .save(consumer) + + ShapelessRecipeBuilder(RecipeCategory.BUILDING_BLOCKS, MItems.ROFLITE_ALLOY_BLOCK, 1) + .requires(Ingredient.of(MItems.ROFLITE_ALLOY_INGOT), 9) + .unlockedBy(MItems.ROFLITE_ALLOY_INGOT) + .save(consumer) + + ShapelessRecipeBuilder(RecipeCategory.MISC, MItems.ROFLITE_ALLOY_INGOT, 9) + .requires(Ingredient.of(MItems.ROFLITE_ALLOY_BLOCK)) + .unlockedBy(MItems.ROFLITE_ALLOY_BLOCK) + .save(consumer) } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ConstructionTags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ConstructionTags.kt index b8b11e83c..a021f54a8 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ConstructionTags.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ConstructionTags.kt @@ -11,7 +11,11 @@ import ru.dbotthepony.mc.otm.registry.game.MItems import ru.dbotthepony.mc.otm.registry.MRegistry fun addConstructionTags(tagsProvider: TagsProvider) { - tagsProvider.blocks.Appender(BlockTags.BEACON_BASE_BLOCKS).add(MBlocks.TRITANIUM_INGOT_BLOCK) + tagsProvider.blocks.Appender(BlockTags.BEACON_BASE_BLOCKS) + .add(MBlocks.TRITANIUM_INGOT_BLOCK) + .add(MBlocks.DILITHIUM_CRYSTAL_BLOCK) + .add(MBlocks.WITHERED_STEEL_BLOCK) + .add(MBlocks.ROFLITE_ALLOY_BLOCK) tagsProvider.blocks.Appender(MBlockTags.MULTIBLOCK_STRUCTURE) .add(MBlockTags.MULTIBLOCK_HARD_STRUCTURE, MBlockTags.MULTIBLOCK_SOFT_STRUCTURE) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt index f89bde310..b92bca831 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/MineableTags.kt @@ -51,6 +51,8 @@ fun addMineableTags(tagsProvider: TagsProvider) { *MBlocks.ENERGY_SERVO.values.toTypedArray(), MBlocks.TRITANIUM_INGOT_BLOCK, + MBlocks.WITHERED_STEEL_BLOCK, + MBlocks.METAL_JUNK, MBlocks.METAL_MESH, MBlocks.TRITANIUM_BARS, @@ -96,6 +98,7 @@ fun addMineableTags(tagsProvider: TagsProvider) { MBlocks.DILITHIUM_ORE, MBlocks.DEEPSLATE_DILITHIUM_ORE, MBlocks.DILITHIUM_CRYSTAL_BLOCK, + MBlocks.ROFLITE_ALLOY_BLOCK, MBlocks.GRAVITATION_STABILIZER, MBlocks.GRAVITATION_STABILIZER_LENS, @@ -143,6 +146,7 @@ fun addMineableTags(tagsProvider: TagsProvider) { tagsProvider.requiresPickaxe(MBlocks.LABORATORY_LAMP, Tiers.IRON) tagsProvider.requiresPickaxe(MBlocks.LABORATORY_LAMP_INVERTED, Tiers.IRON) tagsProvider.requiresPickaxe(MBlocks.METAL_BEAM, Tiers.IRON) + tagsProvider.requiresPickaxe(MBlocks.METAL_BEAM_CENTER, Tiers.IRON) tagsProvider.requiresPickaxe(MBlocks.DANGER_STRIPE_BLOCK) } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ResourceTags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ResourceTags.kt index e4412cc17..af890afef 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ResourceTags.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/ResourceTags.kt @@ -21,6 +21,8 @@ fun addResourceTags(tagsProvider: TagsProvider) { tagsProvider.dusts.add("tritanium", MItems.TRITANIUM_DUST) tagsProvider.ingots.add("tritanium", MItems.TRITANIUM_INGOT) + tagsProvider.ingots.add("withered_steel", MItems.WITHERED_STEEL) + tagsProvider.ingots.add("roflite_alloy", MItems.ROFLITE_ALLOY_INGOT) tagsProvider.wires.add("copper", MItems.COPPER_WIRING) tagsProvider.wires.add("gold", MItems.GOLD_WIRING) @@ -32,6 +34,10 @@ fun addResourceTags(tagsProvider: TagsProvider) { tagsProvider.storageBlocksAsItem.add("tritanium", MItems.TRITANIUM_INGOT_BLOCK) tagsProvider.storageBlocksAsBlock.add("tritanium", MBlocks.TRITANIUM_INGOT_BLOCK) + tagsProvider.storageBlocksAsItem.add("withered_steel", MItems.WITHERED_STEEL_BLOCK) + tagsProvider.storageBlocksAsBlock.add("withered_steel", MBlocks.WITHERED_STEEL_BLOCK) + tagsProvider.storageBlocksAsItem.add("roflite_alloy", MItems.ROFLITE_ALLOY_BLOCK) + tagsProvider.storageBlocksAsBlock.add("roflite_alloy", MBlocks.ROFLITE_ALLOY_BLOCK) tagsProvider.singleDropOre( MBlocks.TRITANIUM_ORE, diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt index 0d70d1a62..6f0af90f0 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/tags/Tags.kt @@ -20,6 +20,8 @@ fun addTags(tagsProvider: TagsProvider) { tagsProvider.items.Appender(ItemTags.BEACON_PAYMENT_ITEMS) .add(MItems.TRITANIUM_INGOT) .add(MItems.DILITHIUM_CRYSTAL) + .add(MItems.WITHERED_STEEL) + .add(MItems.ROFLITE_ALLOY_INGOT) tagsProvider.items.Appender(ItemTags.MEAT).add(MItems.NUTRIENT_PASTE) diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/animation/LoaderAnimation.java b/src/main/java/ru/dbotthepony/mc/otm/client/animation/LoaderAnimation.java new file mode 100644 index 000000000..70accc04c --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/client/animation/LoaderAnimation.java @@ -0,0 +1,129 @@ +package ru.dbotthepony.mc.otm.client.animation; + +import net.minecraft.client.animation.AnimationChannel; +import net.minecraft.client.animation.AnimationDefinition; +import net.minecraft.client.animation.Keyframe; +import net.minecraft.client.animation.KeyframeAnimations; + +public class LoaderAnimation { + public static final AnimationDefinition IDLE = AnimationDefinition.Builder.withLength(0.16F).looping() + .addAnimation("Body", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.08F, KeyframeAnimations.posVec(0F, -0.1F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.16F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("Head", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.08F, KeyframeAnimations.posVec(0F, -0.1F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.16F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("LeftArm", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0.1F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.12F, KeyframeAnimations.posVec(0F, -0.2F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.16F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("RightArm", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0.1F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.12F, KeyframeAnimations.posVec(0F, -0.2F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.16F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .build(); + + public static final AnimationDefinition MOVE = AnimationDefinition.Builder.withLength(0.48F).looping() + .addAnimation("Body", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.12F, KeyframeAnimations.posVec(0F, 0.3F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.24F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.36F, KeyframeAnimations.posVec(0F, 0.3F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("Head", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.12F, KeyframeAnimations.posVec(0F, 0.3F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.24F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.36F, KeyframeAnimations.posVec(0F, 0.3F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("LeftLeg", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, -2F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.12F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.24F, KeyframeAnimations.posVec(0F, 1F, 1F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.36F, KeyframeAnimations.posVec(0F, 2F, -2F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.posVec(0F, 0F, -2F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("LeftLeg", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-22.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(22.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.degreeVec(-22.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("RightLeg", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 2F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.12F, KeyframeAnimations.posVec(0F, 2F, -2F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.24F, KeyframeAnimations.posVec(0F, 0F, -2F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.36F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.posVec(0F, 0F, 2F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("RightLeg", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(22.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(-22.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.degreeVec(22.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("LeftArm", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.12F, KeyframeAnimations.posVec(0F, 0.2F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.24F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.36F, KeyframeAnimations.posVec(0F, 0.2F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("LeftArm", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(6F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(-6F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.degreeVec(6F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("ElbowR", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-30F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(-19.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.degreeVec(-30F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("RightArm", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.12F, KeyframeAnimations.posVec(0F, 0.2F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.24F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.36F, KeyframeAnimations.posVec(0F, 0.2F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.posVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("RightArm", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-6F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(6F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.degreeVec(-6F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("ElbowL", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-16.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.24F, KeyframeAnimations.degreeVec(-25.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.degreeVec(-16.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .build(); + + public static final AnimationDefinition ATTACK = AnimationDefinition.Builder.withLength(0.48F).looping() + .addAnimation("LeftArm", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.2F, KeyframeAnimations.degreeVec(-135F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.degreeVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("ElbowR", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-2F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.2F, KeyframeAnimations.degreeVec(-24.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.degreeVec(-2F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("RightArm", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.2F, KeyframeAnimations.degreeVec(-135F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.degreeVec(0F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("ElbowL", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-2F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.2F, KeyframeAnimations.degreeVec(-24.5F, 0F, 0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.48F, KeyframeAnimations.degreeVec(-2F, 0F, 0F), AnimationChannel.Interpolations.LINEAR) + )) + .build(); +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/model/entity/LoaderModel.java b/src/main/java/ru/dbotthepony/mc/otm/client/model/entity/LoaderModel.java new file mode 100644 index 000000000..fb6f7fe48 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/client/model/entity/LoaderModel.java @@ -0,0 +1,100 @@ +package ru.dbotthepony.mc.otm.client.model.entity; + +import net.minecraft.client.model.HierarchicalModel; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.neoforged.neoforge.client.event.EntityRenderersEvent; +import org.jetbrains.annotations.NotNull; +import ru.dbotthepony.mc.otm.client.animation.LoaderAnimation; +import ru.dbotthepony.mc.otm.entity.Loader; +import ru.dbotthepony.mc.otm.registry.MNames; + +import static ru.dbotthepony.mc.otm.OverdriveThatMatters.loc; + +public class LoaderModel { + public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(loc(MNames.LOADER), "main"); + + private static HierarchicalModel model; + private static LayerDefinition def; + + public static HierarchicalModel getModel() { + if (def == null) { + def = createBodyLayer(); // Ensure def is created before using it + } + + if (model == null) { + return model = new LoaderHierarchicalModel<>(def.bakeRoot()); + } + + + return model; + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition root = partdefinition.addOrReplaceChild("root", CubeListBuilder.create(), PartPose.offset(0.0F, 24.0F, 0.0F)); + + PartDefinition Head = root.addOrReplaceChild("Head", CubeListBuilder.create().texOffs(48, 23).addBox(-3.0F, -1.0F, -2.0F, 6.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(-4.0F, -32.0F, -5.0F)); + PartDefinition Body = root.addOrReplaceChild("Body", CubeListBuilder.create().texOffs(0, 0).addBox(-10.0F, -16.0F, -5.0F, 20.0F, 10.0F, 13.0F, new CubeDeformation(0.0F)) + .texOffs(0, 50).addBox(-3.0F, -3.0F, -4.0F, 6.0F, 5.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(112, 52).addBox(10.0F, -13.0F, 0.0F, 2.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(96, 52).addBox(-12.0F, -13.0F, -1.0F, 2.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(53, 0).addBox(-5.0F, -1.0F, 4.0F, 10.0F, 4.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -26.0F, -1.0F)); + PartDefinition antenna_r1 = Body.addOrReplaceChild("antenna_r1", CubeListBuilder.create().texOffs(76, 6).addBox(0.0F, -7.0F, -1.0F, 0.0F, 14.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(8.0F, -22.0F, 8.0F, -0.2618F, 0.0F, 0.0F)); + PartDefinition waist_r1 = Body.addOrReplaceChild("waist_r1", CubeListBuilder.create().texOffs(28, 50).addBox(-2.0F, -5.0F, -4.0F, 4.0F, 7.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -3.0F, 2.0F, -0.2618F, 0.0F, 0.0F)); + + PartDefinition LeftLeg = root.addOrReplaceChild("LeftLeg", CubeListBuilder.create().texOffs(106, 24).addBox(0.0F, 10.0F, -2.0F, 4.0F, 16.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(66, 46).addBox(-1.0F, -2.0F, -3.0F, 6.0F, 12.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, -26.0F, -1.0F)); + PartDefinition RightLeg = root.addOrReplaceChild("RightLeg", CubeListBuilder.create().texOffs(84, 24).addBox(-4.0F, 10.0F, -2.0F, 4.0F, 16.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(48, 34).addBox(-5.0F, -2.0F, -3.0F, 6.0F, 12.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(-4.0F, -26.0F, -1.0F)); + + PartDefinition LeftArm = root.addOrReplaceChild("LeftArm", CubeListBuilder.create().texOffs(104, 0).addBox(-1.0F, -7.0F, -4.0F, 4.0F, 16.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(13.0F, -36.0F, 2.0F)); + PartDefinition ElbowL = LeftArm.addOrReplaceChild("ElbowL", CubeListBuilder.create().texOffs(24, 23).addBox(-2.0F, -0.2F, -2.0F, 4.0F, 19.0F, 8.0F, new CubeDeformation(-0.1F)), PartPose.offset(1.0F, 9.0F, -1.0F)); + PartDefinition RightArm = root.addOrReplaceChild("RightArm", CubeListBuilder.create().texOffs(80, 0).addBox(-3.0F, -7.0F, -4.0F, 4.0F, 16.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(-13.0F, -36.0F, 1.0F)); + PartDefinition ElbowR = RightArm.addOrReplaceChild("ElbowR", CubeListBuilder.create().texOffs(0, 23).addBox(-2.0F, -0.2F, -2.0F, 4.0F, 19.0F, 8.0F, new CubeDeformation(-0.1F)), PartPose.offset(-1.0F, 9.0F, -1.0F)); + + model = null; + return def = LayerDefinition.create(meshdefinition, 128, 64); + } + + private static class LoaderHierarchicalModel extends HierarchicalModel { + private final ModelPart root; + public LoaderHierarchicalModel(ModelPart root) { + this.root = root.getChild("root"); + } + + @Override + public void setupAnim(@NotNull T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.root().getAllParts().forEach(ModelPart::resetPose); + + this.root.getChild("Head").yRot = netHeadYaw * ((float) Math.PI / 180F); + this.root.getChild("Head").xRot = headPitch * ((float) Math.PI / 180F); + + if (entity.getAttackAnimationTick() > 0) { + this.animate(entity.getIdleState(), LoaderAnimation.ATTACK, ageInTicks, 1.0F); + } + + this.animateWalk(LoaderAnimation.MOVE, limbSwing, limbSwingAmount, 1.0F, 2.5F); + this.animate(entity.getIdleState(), LoaderAnimation.IDLE, ageInTicks, 1.0F); + + } + + public ModelPart getHead() { + return this.root.getChild("Head"); + } + + + @Override + public @NotNull ModelPart root() { + return this.root; + } + } + + public static void register(EntityRenderersEvent.RegisterLayerDefinitions event) { + event.registerLayerDefinition(LAYER_LOCATION, LoaderModel::createBodyLayer); + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java b/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java new file mode 100644 index 000000000..6ad554f3f --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java @@ -0,0 +1,18 @@ +package ru.dbotthepony.mc.otm.mixin; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import ru.dbotthepony.mc.otm.core.IMatteryLevel; +import ru.dbotthepony.mc.otm.core.util.CMWCRandom; + +@Mixin(Level.class) +public abstract class LevelMixin implements IMatteryLevel { + public final RandomSource otm_random = new CMWCRandom(); + + @Override + public @NotNull RandomSource getOtmRandom() { + return otm_random; + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinAbstractHurtingProjectile.java b/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinAbstractHurtingProjectile.java index 9e25c9de4..3733aedb7 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinAbstractHurtingProjectile.java +++ b/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinAbstractHurtingProjectile.java @@ -8,6 +8,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.dbotthepony.mc.otm.capability.IMatteryPlayer; +import ru.dbotthepony.mc.otm.core.IMatteryLevel; import ru.dbotthepony.mc.otm.registry.game.MSoundEvents; @Mixin(AbstractHurtingProjectile.class) @@ -24,7 +25,7 @@ public class MixinAbstractHurtingProjectile { AbstractHurtingProjectile proj = (AbstractHurtingProjectile)(Object)this; if (cap.isAndroid() && proj.getOwner() != entity) { - entity.level().playSound(entity, proj.blockPosition(), MSoundEvents.INSTANCE.getANDROID_PROJ_PARRY(), SoundSource.PLAYERS, 1.0f, 0.95f + entity.level().random.nextFloat() * 0.1f); + entity.level().playSound(entity, proj.blockPosition(), MSoundEvents.INSTANCE.getANDROID_PROJ_PARRY(), SoundSource.PLAYERS, 1.0f, 0.95f + ((IMatteryLevel) entity.level()).getOtmRandom().nextFloat() * 0.1f); } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt index 6c5e26eb8..a90aebf88 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/EnderTeleporterFeature.kt @@ -49,6 +49,7 @@ import ru.dbotthepony.mc.otm.core.math.rotateXDegrees import ru.dbotthepony.mc.otm.core.math.rotateYDegrees import ru.dbotthepony.mc.otm.core.math.shortestDistanceBetween import ru.dbotthepony.mc.otm.core.math.times +import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.milliTime import ru.dbotthepony.mc.otm.registry.game.AndroidFeatures import ru.dbotthepony.mc.otm.triggers.EnderTeleporterFallDeathTrigger @@ -302,7 +303,7 @@ class EnderTeleporterFeature(capability: MatteryPlayer) : AndroidActiveFeature(A val event = EventHooks.onEnderTeleport(ply, blockPos.x + 0.5, blockPos.y.toDouble(), blockPos.z + 0.5) if (event.isCanceled) { - (ply as ServerPlayer).connection.send(ClientboundSoundEntityPacket(SoundEvents.ITEM_BREAK.holder, SoundSource.PLAYERS, ply, 0.3f, 0.5f, ply.level().random.nextLong())) + (ply as ServerPlayer).connection.send(ClientboundSoundEntityPacket(SoundEvents.ITEM_BREAK.holder, SoundSource.PLAYERS, ply, 0.3f, 0.5f, ply.level().otmRandom.nextLong())) return false } @@ -310,9 +311,9 @@ class EnderTeleporterFeature(capability: MatteryPlayer) : AndroidActiveFeature(A lastTeleport = ply.server!!.tickCount android.androidEnergy.extractEnergy(AndroidConfig.EnderTeleporter.ENERGY_COST, false) - ply.level().playSound(null, ply, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 0.3f, 0.8f + ply.level().random.nextFloat() * 0.4f) + ply.level().playSound(null, ply, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 0.3f, 0.8f + ply.level().otmRandom.nextFloat() * 0.4f) ply.teleportTo(event.targetX, event.targetY, event.targetZ) - ply.level().playSound(null, ply, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 1f, 0.8f + ply.level().random.nextFloat() * 0.4f) + ply.level().playSound(null, ply, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 1f, 0.8f + ply.level().otmRandom.nextFloat() * 0.4f) ply.deltaMovement = Vector(0.0, 0.0, 0.0) ply.resetFallDistance() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt index 25e5efc70..c94c15b68 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt @@ -44,6 +44,7 @@ import ru.dbotthepony.mc.otm.core.math.getSphericalBlockPositions import ru.dbotthepony.mc.otm.core.math.times import ru.dbotthepony.mc.otm.core.nbt.map import ru.dbotthepony.mc.otm.core.nbt.set +import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.isClient import ru.dbotthepony.mc.otm.matter.MatterManager import ru.dbotthepony.mc.otm.registry.MDamageTypes @@ -270,7 +271,7 @@ class BlackHoleBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Mattery } // шанс 1% что черная дыра потеряет 0.1 MtU каждую секунду * силу гравитации дыры ^ -1 - if (level.random.nextDouble() < 0.01 * 0.05 * (1 / gravitationStrength)) { + if (level.otmRandom.nextDouble() < 0.01 * 0.05 * (1 / gravitationStrength)) { this.mass += HAWKING_MASS_LOSE_STEP } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleGeneratorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleGeneratorBlockEntity.kt index 04827ffa3..2c3ab16f5 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleGeneratorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleGeneratorBlockEntity.kt @@ -34,6 +34,7 @@ import ru.dbotthepony.mc.otm.core.math.times import ru.dbotthepony.mc.otm.core.multiblock.BlockEntityTag import ru.dbotthepony.mc.otm.core.multiblock.MultiblockStatus import ru.dbotthepony.mc.otm.core.multiblock.shapedMultiblock +import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.core.util.InvalidableLazy import ru.dbotthepony.mc.otm.menu.tech.BlackHoleGeneratorMenu import ru.dbotthepony.mc.otm.registry.game.MBlockEntities @@ -85,8 +86,8 @@ class BlackHoleGeneratorBlockEntity(blockPos: BlockPos, blockState: BlockState) multiblock?.blockEntities(MatterHatchBlockEntity.INPUT_TAG)?.iterator()?.map { it.matter }?.toList() ?: listOf() } - val energy = CombinedProfiledEnergyStorage(FlowDirection.NONE, energyTarget::value, { level?.random }) - val matter = CombinedProfiledMatterStorage(FlowDirection.NONE, matterTarget::value, { level?.random }) + val energy = CombinedProfiledEnergyStorage(FlowDirection.NONE, energyTarget::value, { level?.otmRandom }) + val matter = CombinedProfiledMatterStorage(FlowDirection.NONE, matterTarget::value, { level?.otmRandom }) enum class Mode(val label: Component, val tooltip: Component) { TARGET_MASS(TranslatableComponent("otm.gui.black_hole_generator.sustain.mode"), TranslatableComponent("otm.gui.black_hole_generator.sustain.desc")), diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableGraph.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableGraph.kt index df421a4b4..49b77cbe7 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableGraph.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/cable/EnergyCableGraph.kt @@ -13,6 +13,7 @@ import ru.dbotthepony.mc.otm.core.collect.map import ru.dbotthepony.mc.otm.core.collect.reduce import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.math.RelativeSide +import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.core.shuffle import ru.dbotthepony.mc.otm.graph.GraphNodeList import ru.dbotthepony.mc.otm.onceServer @@ -614,7 +615,7 @@ class EnergyCableGraph : GraphNodeList= failureChance * upgrades.failureMultiplier) + if (failureChance * upgrades.failureMultiplier <= 0.0 || level!!.otmRandom.nextDouble() >= failureChance * upgrades.failureMultiplier) repairProgress += progressPerTick energy.extractEnergy(energyConsumption * (progressPerTick / thisProgressPerTick), false) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt index bca170286..d8fe21afe 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt @@ -24,6 +24,7 @@ import ru.dbotthepony.mc.otm.config.MachinesConfig import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.HandlerFilter import ru.dbotthepony.mc.otm.core.math.Decimal +import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.graph.matter.MatterGraph import ru.dbotthepony.mc.otm.item.matter.MatterDustItem import ru.dbotthepony.mc.otm.menu.matter.MatterRecyclerMenu @@ -116,7 +117,7 @@ class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState) stack.shrink(1) container.setChanged(0) - val actualMatter = dustMatter.matter * (0.4 + level!!.random.nextDouble() * 0.6) + val actualMatter = dustMatter.matter * (0.4 + level!!.otmRandom.nextDouble() * 0.6) return JobContainer.success( RecyclerJob( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt index 593356487..ac9f9c181 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt @@ -28,6 +28,7 @@ import ru.dbotthepony.mc.otm.config.MachinesConfig import ru.dbotthepony.mc.otm.container.HandlerFilter import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.core.math.Decimal +import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.data.codec.DecimalCodec import ru.dbotthepony.mc.otm.data.codec.minRange import ru.dbotthepony.mc.otm.graph.matter.MatterNode @@ -183,7 +184,7 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : task = allocation.task.id, matterValue = matter.matter, pattern = Optional.ofNullable(allocation.pattern), - asDust = (level?.random?.nextDouble() ?: 1.0) * upgrades.failureMultiplier > (allocation.pattern?.researchPercent ?: 2.0), + asDust = (level?.otmRandom?.nextDouble() ?: 1.0) * upgrades.failureMultiplier > (allocation.pattern?.researchPercent ?: 2.0), ticks = ticks, )) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/AbstractPoweredFurnaceBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/AbstractPoweredFurnaceBlockEntity.kt index 748fb800b..4ca9c7317 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/AbstractPoweredFurnaceBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/AbstractPoweredFurnaceBlockEntity.kt @@ -35,6 +35,7 @@ import ru.dbotthepony.mc.otm.container.balance import ru.dbotthepony.mc.otm.core.collect.filter import ru.dbotthepony.mc.otm.core.collect.maybe import ru.dbotthepony.mc.otm.core.immutableList +import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.menu.tech.PoweredFurnaceMenu import ru.dbotthepony.mc.otm.recipe.MatteryCookingRecipe import ru.dbotthepony.mc.otm.recipe.MicrowaveRecipe @@ -152,7 +153,7 @@ sealed class AbstractPoweredFurnaceBlockEntity

0f) { - repairPoints += if ((level?.random?.nextFloat() ?: 1f) <= diff) 1 else 0 + repairPoints += if ((level?.otmRandom?.nextFloat() ?: 1f) <= diff) 1 else 0 } experienceStored -= 1 @@ -201,7 +202,7 @@ class EssenceStorageBlockEntity(blockPos: BlockPos, blockState: BlockState) : Ma level!!.playSound(null, ent.x, ent.y, ent.z, SoundEvents.EXPERIENCE_ORB_PICKUP, SoundSource.BLOCKS, - 0.1F, 0.5F + level!!.random.nextFloat() * 0.25F + 0.1F, 0.5F + level!!.otmRandom.nextFloat() * 0.25F ) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/PlatePressBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/PlatePressBlockEntity.kt index 199bddfbe..bc8c6e1aa 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/PlatePressBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/PlatePressBlockEntity.kt @@ -21,6 +21,7 @@ import ru.dbotthepony.mc.otm.container.HandlerFilter import ru.dbotthepony.mc.otm.container.balance import ru.dbotthepony.mc.otm.core.collect.filter import ru.dbotthepony.mc.otm.core.collect.maybe +import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.menu.tech.PlatePressMenu import ru.dbotthepony.mc.otm.registry.game.MBlockEntities import ru.dbotthepony.mc.otm.registry.game.MRecipes @@ -89,7 +90,7 @@ class PlatePressBlockEntity( recipe.getResultItem(level.registryAccess()).copyWithCount(toProcess), recipe.workTime * MachinesConfig.PLATE_PRESS.workTimeMultiplier, MachinesConfig.PLATE_PRESS.energyConsumption * toProcess, - experience = recipe.experience.sample(level.random) * toProcess)) + experience = recipe.experience.sample(level.otmRandom) * toProcess)) } override fun tick() { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayer.kt index 72eedca24..6f9ef3a6a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayer.kt @@ -542,7 +542,7 @@ class MatteryPlayer(val ply: Player) { override fun onJobTick(status: JobStatus) { super.onJobTick(status) - if (isExopackVisible && ply.level().random.nextFloat() <= 0.05f) { + if (isExopackVisible && ply.level().otmRandom.nextFloat() <= 0.05f) { PacketDistributor.sendToPlayersTrackingEntityAndSelf(ply, ExopackSmokePacket(ply.uuid)) } } @@ -1405,7 +1405,7 @@ class MatteryPlayer(val ply: Player) { pos.mul(RenderSystem.getProjectionMatrix()) pos.mul(poseStack.last().pose()) - makeSmoke(cam.x + pos.x, cam.y + pos.y, cam.z + pos.z, ply.level().random, ply.level()) + makeSmoke(cam.x + pos.x, cam.y + pos.y, cam.z + pos.z, ply.level().otmRandom, ply.level()) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/LoaderRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/LoaderRenderer.kt new file mode 100644 index 000000000..360c49274 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/LoaderRenderer.kt @@ -0,0 +1,18 @@ +package ru.dbotthepony.mc.otm.client.render.entity + +import net.minecraft.client.model.HierarchicalModel +import net.minecraft.client.renderer.entity.EntityRendererProvider +import net.minecraft.client.renderer.entity.MobRenderer +import net.minecraft.resources.ResourceLocation +import ru.dbotthepony.mc.otm.OverdriveThatMatters.loc +import ru.dbotthepony.mc.otm.client.model.entity.LoaderModel +import ru.dbotthepony.mc.otm.entity.Loader + +class LoaderRenderer(context: EntityRendererProvider.Context) + : MobRenderer>(context, LoaderModel.getModel(), 0.8f) { + override fun getTextureLocation(entity: Loader): ResourceLocation = TEXTURE_LOCATION + + companion object { + private val TEXTURE_LOCATION = loc("textures/entity/loader.png") + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/PainterScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/PainterScreen.kt index 615ee34b8..7fcc7edb8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/PainterScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/decorative/PainterScreen.kt @@ -104,7 +104,7 @@ class PainterScreen(menu: PainterMenu, inventory: Inventory, title: Component) : it.dock = Dock.FILL it.dockResize = DockResizeMode.NONE it.slotBackgroundEmpty = - ItemStackIcon(ItemStack(BuiltInRegistries.ITEM.getOrCreateTag(Tags.Items.DYES).getRandomElement(menu.player.level().random).map { it.value() }.orElse(Items.AIR)), 16f, 16f) + ItemStackIcon(ItemStack(BuiltInRegistries.ITEM.getOrCreateTag(Tags.Items.DYES).getRandomElement(menu.random).map { it.value() }.orElse(Items.AIR)), 16f, 16f) .fixed() .composeBefore(FlatRectangleIcon(16f, 16f, RGBAColor.rgb(0x8b8b8b).copy(alpha = 0.6f))) .fixed() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryLevel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryLevel.kt new file mode 100644 index 000000000..dba505e23 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/IMatteryLevel.kt @@ -0,0 +1,16 @@ +package ru.dbotthepony.mc.otm.core + +import net.minecraft.util.RandomSource +import net.minecraft.world.level.Level + +interface IMatteryLevel { + /** + * OTM provided [RandomSource], which has better statistical parameters + * + * Original Minecraft use LCG, which may show bad behavior when repeatedly sampled *a lot*, + * which is what [Level]'s random is used for. OTM provided PRNG should behave better in this scenario. + */ + val otmRandom: RandomSource +} + +val Level.otmRandom: RandomSource get() = (this as IMatteryLevel).otmRandom diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/CMWCRandom.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/CMWCRandom.kt new file mode 100644 index 000000000..aec7fc452 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/CMWCRandom.kt @@ -0,0 +1,115 @@ +package ru.dbotthepony.mc.otm.core.util + +import net.minecraft.util.Mth +import net.minecraft.util.RandomSource +import net.minecraft.world.level.levelgen.MarsagliaPolarGaussian +import net.minecraft.world.level.levelgen.PositionalRandomFactory +import java.lang.StringBuilder +import java.util.random.RandomGenerator + +class CMWCRandom(seed: Long = System.nanoTime(), private val stateSize: Int = CMWC_DEFAULT_STATE_SIZE) : RandomGenerator, RandomSource { + private val state = IntArray(stateSize) + private var carry = 0 + private var stateIndex = 0 + private val gaussian = MarsagliaPolarGaussian(this) + + var seed: Long = seed + private set + + init { + setSeed(seed) + } + + override fun setSeed(seed: Long) { + this.seed = seed + carry = Integer.remainderUnsigned(seed.toInt(), CMWC_CARRY_MAX) + + // init state with regular LCG produced values + state[0] = seed.toInt() + state[1] = seed.shr(32).toInt() + + for (i in 2 until state.size) { + state[i] = 69069 * state[i - 2] + 362437 + } + + stateIndex = state.size - 1 + gaussian.reset() + } + + override fun nextInt(): Int { + stateIndex = (stateIndex + 1) % state.size + val t = 18782L * state[stateIndex] + carry + + carry = t.ushr(32).toInt() + var x = t.toInt() + carry + + if (x < carry) { + x++ + carry++ + } + + state[stateIndex] = 0xfffffffe.toInt() - x + return state[stateIndex] + } + + override fun nextLong(): Long { + val a = nextInt().toLong() and 0xFFFFFFFFL + val b = nextInt().toLong() and 0xFFFFFFFFL + return a.shl(32) or b + } + + override fun nextInt(bound: Int): Int { + return super.nextInt(bound) + } + + override fun nextInt(origin: Int, bound: Int): Int { + return super.nextInt(origin, bound) + } + + override fun nextBoolean(): Boolean { + return super.nextBoolean() + } + + override fun nextFloat(): Float { + return super.nextFloat() + } + + override fun nextDouble(): Double { + return super.nextDouble() + } + + override fun nextGaussian(): Double { + return gaussian.nextGaussian() + } + + override fun fork(): RandomSource { + return CMWCRandom(nextLong(), stateSize) + } + + override fun forkPositional(): PositionalRandomFactory { + return Positional(nextLong(), stateSize) + } + + class Positional(val seed: Long, val stateSize: Int = CMWC_DEFAULT_STATE_SIZE) : PositionalRandomFactory { + override fun at(x: Int, y: Int, z: Int): RandomSource { + return CMWCRandom(Mth.getSeed(x, y, z).xor(seed), stateSize) + } + + override fun fromHashOf(name: String): RandomSource { + return CMWCRandom(name.hashCode().toLong().xor(seed), stateSize) + } + + override fun fromSeed(seed: Long): RandomSource { + return CMWCRandom(seed, stateSize) + } + + override fun parityConfigString(builder: StringBuilder) { + throw UnsupportedOperationException() + } + } + + companion object { + const val CMWC_DEFAULT_STATE_SIZE = 256 // 4096 + const val CMWC_CARRY_MAX = 809430660 + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/entity/Loader.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/Loader.kt new file mode 100644 index 000000000..0a6418b46 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/Loader.kt @@ -0,0 +1,130 @@ +package ru.dbotthepony.mc.otm.entity + +import net.minecraft.network.syncher.EntityDataAccessor +import net.minecraft.network.syncher.EntityDataSerializers +import net.minecraft.network.syncher.SynchedEntityData +import net.minecraft.sounds.SoundEvent +import net.minecraft.sounds.SoundEvents +import net.minecraft.world.entity.AnimationState +import net.minecraft.world.entity.Entity +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.ai.attributes.AttributeSupplier +import net.minecraft.world.entity.ai.attributes.Attributes +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal +import net.minecraft.world.entity.ai.navigation.GroundPathNavigation +import net.minecraft.world.entity.ai.navigation.PathNavigation +import net.minecraft.world.entity.monster.Monster +import net.minecraft.world.entity.player.Player +import net.minecraft.world.level.Level +import ru.dbotthepony.mc.otm.registry.game.MSoundEvents + + +class Loader(type: EntityType, level: Level) : Monster(type, level) { + + val idleState = AnimationState() + var attackAnimationState = AnimationState() + var attackAnimationTick = 0 + + companion object { + fun createAttributes() : AttributeSupplier.Builder { + return createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 60.0) + .add(Attributes.MOVEMENT_SPEED, 0.3) + .add(Attributes.ATTACK_DAMAGE, 5.0) + .add(Attributes.KNOCKBACK_RESISTANCE, 0.7) + } + + private val DATA_ATTACKING: EntityDataAccessor = + SynchedEntityData.defineId(Loader::class.java, EntityDataSerializers.BOOLEAN) + } + + override fun defineSynchedData(builder: SynchedEntityData.Builder) { + super.defineSynchedData(builder) + builder.define(DATA_ATTACKING, false) + } + var isAttacking: Boolean + get() = this.entityData.get(DATA_ATTACKING) + set(value) { + this.entityData.set(DATA_ATTACKING, value) + } + + //https://nc.dbotthepony.ru/s/qqKdbQEYy74KyGM + + init { + idleState.start(tickCount) + } + + override fun registerGoals() { + goalSelector.addGoal(8, RandomLookAroundGoal(this)) + goalSelector.addGoal(7, WaterAvoidingRandomStrollGoal(this, 0.8)) + goalSelector.addGoal(8, LookAtPlayerGoal(this, Player::class.java, 8f)) + goalSelector.addGoal(3, NearestAttackableTargetGoal(this, Player::class.java , true, true)) + + goalSelector.addGoal(2, MeleeAttackGoal(this, 1.0, true)) + + targetSelector.addGoal(1, HurtByTargetGoal(this)) + } + + override fun handleEntityEvent(id: Byte) { + if (id.toInt() == 4) { + this.attackAnimationTick = 7 // Attack animation lasts 10 ticks + } else { + super.handleEntityEvent(id) + } + } + + override fun doHurtTarget(target: Entity): Boolean { + level().broadcastEntityEvent(this, 4.toByte()) + val success = super.doHurtTarget(target) + if (success) { + this.playSound(SoundEvents.IRON_GOLEM_ATTACK, 1.0f, 1.0f) + //THIS IS FUCKING RETARDED + //fuck everything + + level().broadcastEntityEvent(this, 4.toByte()) + idleState.stop() + idleState.start(tickCount) + + + val dirx = target.x - this.x + val dirz = target.z - this.z + val dist = Math.sqrt(dirx * dirx + dirx * dirz) + + target.push(dirx / dist * 0.6, 0.3, dirz / dist * 0.6) + } + return success + } + + override fun aiStep() { + super.aiStep() + + if (attackAnimationTick > 0) { + attackAnimationTick-- + if (attackAnimationTick == 0) { + isAttacking = false + } + } + } + override fun getAmbientSound(): SoundEvent { + return MSoundEvents.LOADER_AMBIENT + } + + override fun getHurtSound(damageSource: net.minecraft.world.damagesource.DamageSource): SoundEvent { + return SoundEvents.IRON_GOLEM_HURT + } + + override fun getDeathSound(): SoundEvent { + return SoundEvents.IRON_GOLEM_DEATH + } + + override fun playStepSound(pos: net.minecraft.core.BlockPos, blockState: net.minecraft.world.level.block.state.BlockState) { + this.playSound(SoundEvents.IRON_GOLEM_STEP, 1.0f, 1.0f) + } + + override fun createNavigation(level: Level): PathNavigation = GroundPathNavigation(this, level) +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/entity/MinecartCargoCrate.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/MinecartCargoCrate.kt index 5e97a2e07..ee09e29ff 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/entity/MinecartCargoCrate.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/MinecartCargoCrate.kt @@ -19,6 +19,7 @@ import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.gameevent.GameEvent import ru.dbotthepony.mc.otm.block.decorative.CargoCrateBlock import ru.dbotthepony.mc.otm.block.entity.decorative.CargoCrateBlockEntity +import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.core.position import ru.dbotthepony.mc.otm.menu.decorative.MinecartCargoCrateMenu import ru.dbotthepony.mc.otm.registry.game.MItems @@ -89,7 +90,7 @@ class MinecartCargoCrate( if (interactingPlayers++ == 0) { if (!isRemoved) { - level().playSound(null, this, MSoundEvents.CARGO_CRATE_OPEN, SoundSource.BLOCKS, 1f, 0.8f + level().random.nextFloat() * 0.2f) + level().playSound(null, this, MSoundEvents.CARGO_CRATE_OPEN, SoundSource.BLOCKS, 1f, 0.8f + level().otmRandom.nextFloat() * 0.2f) this.gameEvent(GameEvent.CONTAINER_OPEN, player) PiglinAi.angerNearbyPiglins(player, true) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/BatteryItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/BatteryItem.kt index d7b76d2a1..5cbcab0f0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/BatteryItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/BatteryItem.kt @@ -184,7 +184,7 @@ class CrudeBatteryItem : BatteryItem(ItemsConfig.Batteries.CRUDE) { if (player is ServerPlayer) { if (!mattery.androidEnergy.item.isEmpty) { mattery.androidEnergy.item.getCapability(Capabilities.EnergyStorage.ITEM)?.let { - it.extractEnergy((it.maxEnergyStored * level.random.nextFloat() * .2f).roundToInt(), false) + it.extractEnergy((it.maxEnergyStored * level.otmRandom.nextFloat() * .2f).roundToInt(), false) } mattery.dropBattery() @@ -194,7 +194,7 @@ class CrudeBatteryItem : BatteryItem(ItemsConfig.Batteries.CRUDE) { copyStack.count = 1 mattery.androidEnergy.item = copyStack - val extraDamageMult = level.random.nextFloat() + val extraDamageMult = level.otmRandom.nextFloat() player.hurt(MatteryDamageSource(level.registryAccess().damageType(MDamageTypes.EMP), inflictor = itemStack), 1.5f + extraDamageMult * 3.5f) val debuffDuration = 100 + (100 * (1f - extraDamageMult)).roundToInt() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/EssenceCapsuleItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/EssenceCapsuleItem.kt index 6f9f0a569..91d300ed5 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/EssenceCapsuleItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/EssenceCapsuleItem.kt @@ -17,6 +17,7 @@ import ru.dbotthepony.mc.otm.capability.matteryPlayer import ru.dbotthepony.mc.otm.client.isShiftDown import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.core.util.getLevelFromXp import ru.dbotthepony.mc.otm.item.MatteryItem import ru.dbotthepony.mc.otm.registry.game.MDataComponentTypes @@ -80,7 +81,7 @@ class EssenceCapsuleItem(private val digital: Boolean) : MatteryItem(Properties( } else { if (level is ServerLevel) { level.levelEvent(2002, player.blockPosition(), PotionContents.getColor(Potions.WATER)) - ExperienceOrb.award(level, player.position(), (exp * (.5 + level.random.nextFloat() * .25)).toInt()) + ExperienceOrb.award(level, player.position(), (exp * (.5 + level.otmRandom.nextFloat() * .25)).toInt()) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/ImperfectBread.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/ImperfectBread.kt new file mode 100644 index 000000000..d67ae84e9 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/consumables/ImperfectBread.kt @@ -0,0 +1,25 @@ +package ru.dbotthepony.mc.otm.item.consumables + +import net.minecraft.world.effect.MobEffectInstance +import net.minecraft.world.effect.MobEffects +import net.minecraft.world.level.Level +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.player.Player +import net.minecraft.world.food.FoodProperties +import net.minecraft.world.item.Item +import net.minecraft.world.item.ItemStack + +class ImperfectBread(properties: Item.Properties) : Item(properties) { + override fun finishUsingItem(stack: ItemStack, level: Level, entity: LivingEntity): ItemStack { + if (entity is Player) { + entity.addEffect(MobEffectInstance(MobEffects.POISON, 80, 0)) + } + return super.finishUsingItem(stack, level, entity) + } +} + +val IMPERFECT_BREAD_FOOD: FoodProperties = FoodProperties.Builder() + .nutrition(5) + .saturationModifier(0.6f) + .build() + diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt index a79ab1ead..018d1d474 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/tool/ExplosiveHammerItem.kt @@ -84,7 +84,7 @@ class ExplosiveHammerItem(durability: Int = 512) : Item(Properties().stacksTo(1) itemStack.hurtAndBreak(8, level, player) {} if (isPrimed(itemStack)) { - itemStack.hurtAndBreak(level.random.nextInt(1, 20), level, player) {} + itemStack.hurtAndBreak(level.otmRandom.nextInt(1, 20), level, player) {} unprime(itemStack) val (ex, ey, ez) = Vector.atCenterOf(player.blockPosition()) @@ -226,7 +226,7 @@ class ExplosiveHammerItem(durability: Int = 512) : Item(Properties().stacksTo(1) val copy = itemStack.copy() - itemStack.hurtAndBreak(level.random.nextInt(1, 20), attacker, EquipmentSlot.MAINHAND) + itemStack.hurtAndBreak(level.otmRandom.nextInt(1, 20), attacker, EquipmentSlot.MAINHAND) if (!itemStack.isEmpty && attacker.random.nextDouble() <= ToolsConfig.ExplosiveHammer.FLY_OFF_CHANCE) { attacker.setItemInHand(hand, ItemStack.EMPTY) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/EnergySwordItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/EnergySwordItem.kt index a6d5c27b2..ec7cc1d4a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/EnergySwordItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/EnergySwordItem.kt @@ -1,6 +1,7 @@ package ru.dbotthepony.mc.otm.item.weapon import net.minecraft.core.BlockPos +import net.minecraft.core.component.DataComponents import net.minecraft.tags.BlockTags import net.minecraft.world.entity.EquipmentSlotGroup import net.minecraft.world.entity.LivingEntity @@ -32,6 +33,7 @@ import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.math.DecimalConfigValue import ru.dbotthepony.mc.otm.core.math.defineDecimal import ru.dbotthepony.mc.otm.core.math.nextVariance +import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.core.util.WriteOnce import ru.dbotthepony.mc.otm.item.MatteryItem import ru.dbotthepony.mc.otm.item.addSimpleDescription @@ -96,10 +98,10 @@ class EnergySwordItem : MatteryItem(Properties().stacksTo(1).rarity(Rarity.RARE) itemStack.getCapability(MatteryCapability.ITEM_ENERGY)?.let { if (it.extractEnergyExact(ENERGY_PER_SWING, false)) { - it.extractEnergy(attacker.level().random.nextVariance(ENERGY_PER_SWING_VARIANCE), false) + it.extractEnergy(attacker.level().otmRandom.nextVariance(ENERGY_PER_SWING_VARIANCE), false) victim.matteryPlayer?.let { if (it.isAndroid && it.androidEnergy.extractEnergyExact(ENERGY_ZAP, false)) { - it.androidEnergy.extractEnergy(attacker.level().random.nextVariance(ENERGY_ZAP_VARIANCE), false) + it.androidEnergy.extractEnergy(attacker.level().otmRandom.nextVariance(ENERGY_ZAP_VARIANCE), false) victim.hurt(MatteryDamageSource(attacker.level().registryAccess().damageType(MDamageTypes.EMP), attacker, itemStack), 8f) } } @@ -137,23 +139,34 @@ class EnergySwordItem : MatteryItem(Properties().stacksTo(1).rarity(Rarity.RARE) p_41419_: BlockPos, user: LivingEntity ): Boolean { - if (blockState.getDestroySpeed(p_41417_, p_41419_) != 0f && (user !is Player || !user.isCreative)) { + if (blockState.getDestroySpeed(p_41417_, p_41419_) > 0f && (user !is Player || !user.isCreative)) { val energy = itemStack.matteryEnergy if (blockState.`is`(BlockTags.SWORD_EFFICIENT)) { if (energy?.extractEnergyExact(PLANT_POWER_COST, false) == true) - energy.extractEnergyExact(user.level().random.nextVariance(PLANT_POWER_COST_VARIANCE), false) + energy.extractEnergyExact(user.level().otmRandom.nextVariance(PLANT_POWER_COST_VARIANCE), false) } if (blockState.`is`(Blocks.COBWEB)) { if (energy?.extractEnergyExact(COBWEB_POWER_COST, false) == true) - energy.extractEnergyExact(user.level().random.nextVariance(COBWEB_POWER_COST_VARIANCE), false) + energy.extractEnergyExact(user.level().otmRandom.nextVariance(COBWEB_POWER_COST_VARIANCE), false) } } return true } + override fun isCorrectToolForDrops(stack: ItemStack, state: BlockState): Boolean { + val energy = stack.matteryEnergy ?: return super.isCorrectToolForDrops(stack, state) + + if (state.`is`(BlockTags.SWORD_EFFICIENT) && energy.batteryLevel >= PLANT_POWER_COST) + return true + else if (state.`is`(Blocks.COBWEB) && energy.batteryLevel >= COBWEB_POWER_COST) + return true + + return super.isCorrectToolForDrops(stack, state) + } + private fun cap(stack: ItemStack) = EnergyConsumerItem(stack, MAX_ENERGY) override fun registerCapabilities(event: RegisterCapabilitiesEvent) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerPackets.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerPackets.kt index af2e71758..166cadfae 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerPackets.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryPlayerPackets.kt @@ -24,6 +24,7 @@ import ru.dbotthepony.mc.otm.core.math.component1 import ru.dbotthepony.mc.otm.core.math.component2 import ru.dbotthepony.mc.otm.core.math.component3 import ru.dbotthepony.mc.otm.core.math.toRadians +import ru.dbotthepony.mc.otm.core.otmRandom import ru.dbotthepony.mc.otm.core.position import ru.dbotthepony.mc.otm.core.readItem import ru.dbotthepony.mc.otm.core.writeItem @@ -445,7 +446,7 @@ class ExopackSmokePacket(val player: UUID) : CustomPacketPayload { z += kotlin.math.sin(deg) * -0.4 val level = ply.level() - val random = level.random + val random = level.otmRandom for (i in 0 .. random.nextInt(2, 4)) level.addParticle( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/SmokeParticlesPacket.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/SmokeParticlesPacket.kt index a80bb1ec5..5d87e004a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/SmokeParticlesPacket.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/SmokeParticlesPacket.kt @@ -13,6 +13,7 @@ import net.neoforged.neoforge.network.handling.IPayloadContext import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.core.ResourceLocation +import ru.dbotthepony.mc.otm.core.otmRandom class SmokeParticlesPacket(val x: Double, val y: Double, val z: Double) : CustomPacketPayload { fun write(buff: FriendlyByteBuf) { @@ -23,7 +24,7 @@ class SmokeParticlesPacket(val x: Double, val y: Double, val z: Double) : Custom fun play(context: IPayloadContext) { minecraft.player?.level()?.let { - makeSmoke(x, y, z, it.random, it) + makeSmoke(x, y, z, it.otmRandom, it) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt index c803ef655..a3612f1f0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt @@ -12,6 +12,7 @@ object MNames { const val LABORATORY_LAMP_LIGHT = "laboratory_lamp_light" const val DANGER_STRIPE_BLOCK = "danger_stripe_block" const val METAL_BEAM = "metal_beam" + const val METAL_BEAM_CENTER = "metal_beam_center" const val ENGINE = "engine" const val HOLO_SIGN = "holo_sign" const val FLUID_TANK = "fluid_tank" @@ -93,10 +94,12 @@ object MNames { // building blocks const val TRITANIUM_BLOCK = "tritanium_block" + const val TRITANIUM_BLOCK_YELLOW_CLASSIC = "tritanium_block_yellow_classic" const val TRITANIUM_STAIRS = "tritanium_stairs" const val TRITANIUM_SLAB = "tritanium_slab" const val TRITANIUM_WALL = "tritanium_wall" const val TRITANIUM_STRIPED_BLOCK = "tritanium_striped_block" + const val TRITANIUM_CLASSIC_STRIPED_BLOCK = "tritanium_classic_striped_block" const val TRITANIUM_STRIPED_STAIRS = "tritanium_striped_stairs" const val TRITANIUM_STRIPED_SLAB = "tritanium_striped_slab" const val TRITANIUM_STRIPED_WALL = "tritanium_striped_wall" @@ -128,6 +131,8 @@ object MNames { const val PILL_HEAL = "pill_heal" const val PILL_NOT_NORMAL = "pill_not_normal" + const val IMPERFECT_BREAD = "imperfect_bread" + const val BATTERY_CRUDE = "battery_crude" const val BATTERY_BASIC = "battery_basic" const val BATTERY_NORMAL = "battery_normal" @@ -198,6 +203,7 @@ object MNames { // eg const val BREAD_MONSTER_SPAWN_EGG = "bead_monster_spawn_egg" + const val LOADER_SPAWN_EGG = "loader_spawn_egg" // items: crafting components const val TRITANIUM_DUST = "tritanium_dust" @@ -205,8 +211,12 @@ object MNames { const val TRITANIUM_INGOT = "tritanium_ingot" const val TRITANIUM_INGOT_BLOCK = "tritanium_ingot_block" + const val WITHERED_STEEL_BLOCK = "withered_steel_block" const val WITHERED_STEEL = "withered_steel" + const val ROFLITE_ALLOY_INGOT = "roflite_alloy_ingot" + const val ROFLITE_ALLOY_BLOCK = "roflite_alloy_block" + const val MATTER_IO_PORT = "matter_io_port" const val CARBON_MESH = "carbon_mesh" @@ -315,6 +325,7 @@ object MNames { const val PLASMA = "plasma_projectile" const val RIDEABLE_DUMMY = "rideable_dummy" const val BREAD_MONSTER = "bread_monster" + const val LOADER = "loader" const val PHANTOM_ATTRACTOR = "phantom_attractor" const val JUMP_BOOST = "jump_boost" diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt index 5df204d9a..a3f6b5689 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MBlocks.kt @@ -252,6 +252,14 @@ object MBlocks { Block(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_BLUE).sound(SoundType.METAL).explosionResistance(400f).destroyTime(3f).requiresCorrectToolForDrops()) } + val WITHERED_STEEL_BLOCK: Block by registry.register(MNames.WITHERED_STEEL_BLOCK) { + Block(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_GREEN).sound(SoundType.NETHERITE_BLOCK).explosionResistance(400f).destroyTime(3f).requiresCorrectToolForDrops()) + } + + val ROFLITE_ALLOY_BLOCK: Block by registry.register(MNames.ROFLITE_ALLOY_BLOCK) { + Block(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_BROWN).sound(SoundType.NETHERITE_BLOCK).explosionResistance(400f).destroyTime(3f).requiresCorrectToolForDrops()) + } + val METAL_JUNK: MatteryBlock by registry.register(MNames.METAL_JUNK) { MatteryBlock(BlockBehaviour.Properties.of().sound(SoundType.NETHERITE_BLOCK).mapColor(MapColor.COLOR_GRAY).explosionResistance(45f).destroyTime(3f).requiresCorrectToolForDrops()) .addSimpleDescription() @@ -351,6 +359,7 @@ object MBlocks { val LABORATORY_LAMP_LIGHT: Block by registry.register(MNames.LABORATORY_LAMP_LIGHT) { LaboratoryLampLight() } val DANGER_STRIPE_BLOCK: Block by registry.register(MNames.DANGER_STRIPE_BLOCK) { Block(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_GRAY).explosionResistance(6f).destroyTime(1.5f).requiresCorrectToolForDrops()) } val METAL_BEAM: Block by registry.register(MNames.METAL_BEAM) { RotatedPillarBlock(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_GRAY).sound(SoundType.METAL).explosionResistance(14f).destroyTime(2.5f).requiresCorrectToolForDrops()) } + val METAL_BEAM_CENTER: Block by registry.register(MNames.METAL_BEAM_CENTER) { RotatedPillarBlock(BlockBehaviour.Properties.of().mapColor(MapColor.COLOR_GRAY).sound(SoundType.METAL).explosionResistance(14f).destroyTime(2.5f).requiresCorrectToolForDrops()) } val ENGINE: Block by registry.register(MNames.ENGINE) { EngineBlock() } val HOLO_SIGN: Block by registry.register(MNames.HOLO_SIGN) { HoloSignBlock() } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt index 5b4d243b5..3bea5d150 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MCreativeTabs.kt @@ -237,6 +237,10 @@ private fun addMainCreativeTabItems(consumer: CreativeModeTab.Output) { accept(MItems.DILITHIUM_CRYSTAL_BLOCK) accept(MItems.WITHERED_STEEL) + accept(MItems.WITHERED_STEEL_BLOCK) + + accept(MItems.ROFLITE_ALLOY_INGOT) + accept(MItems.ROFLITE_ALLOY_BLOCK) accept(MItems.TRITANIUM_TOOLS) accept(MItems.TRITANIUM_SHIELD) @@ -281,6 +285,7 @@ private fun addMainCreativeTabItems(consumer: CreativeModeTab.Output) { base(MItems.CARGO_CRATE_MINECARTS) accept(MItems.NUTRIENT_PASTE) + accept(MItems.IMPERFECT_BREAD) // exo accept(MItems.EXOPACK_PROBE) @@ -313,6 +318,7 @@ private fun addDecorativeTabItems(consumer: CreativeModeTab.Output) { accept(MItems.DANGER_STRIPE_BLOCK) accept(MItems.METAL_BEAM) + accept(MItems.METAL_BEAM_CENTER) accept(MItems.ENGINE) accept(MItems.TRITANIUM_STRIPED_BLOCK.values) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MEntityTypes.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MEntityTypes.kt index bafdac6cf..434309a70 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MEntityTypes.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MEntityTypes.kt @@ -14,11 +14,9 @@ import net.neoforged.bus.api.IEventBus import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent import ru.dbotthepony.mc.otm.client.render.entity.BreadMonsterRenderer +import ru.dbotthepony.mc.otm.client.render.entity.LoaderRenderer import ru.dbotthepony.mc.otm.client.render.entity.PlasmaProjectileRenderer -import ru.dbotthepony.mc.otm.entity.BreadMonster -import ru.dbotthepony.mc.otm.entity.MinecartCargoCrate -import ru.dbotthepony.mc.otm.entity.PlasmaProjectile -import ru.dbotthepony.mc.otm.entity.RideableDummy +import ru.dbotthepony.mc.otm.entity.* import ru.dbotthepony.mc.otm.registry.MDeferredRegister import ru.dbotthepony.mc.otm.registry.MNames @@ -50,6 +48,15 @@ object MEntityTypes { .build(MNames.BREAD_MONSTER) } + val LOADER: EntityType by registry.register(MNames.LOADER) { + EntityType.Builder.of(::Loader, MobCategory.MONSTER) + .sized(1.2f, 2.5f) + .eyeHeight(2.0f) + .passengerAttachments(2.5f) + .clientTrackingRange(12) + .build(MNames.LOADER) + } + fun register(bus: IEventBus) { registry.register(bus) bus.addListener(this::registerAttributes) @@ -58,6 +65,7 @@ object MEntityTypes { private fun registerAttributes(event: EntityAttributeCreationEvent) { event.put(BREAD_MONSTER, BreadMonster.createAttributes().build()) + event.put(LOADER, Loader.createAttributes().build()) } @Suppress("unchecked_cast") @@ -71,6 +79,7 @@ object MEntityTypes { EntityRenderers.register(RIDEABLE_DUMMY, ::NoopRenderer) EntityRenderers.register(BREAD_MONSTER, ::BreadMonsterRenderer) + EntityRenderers.register(LOADER, ::LoaderRenderer) } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt index 89194c834..82de7fba6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MItems.kt @@ -26,6 +26,7 @@ import net.minecraft.world.item.Tiers import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.level.block.Block import net.neoforged.bus.api.IEventBus +import net.neoforged.neoforge.common.DeferredSpawnEggItem import net.neoforged.neoforge.common.SimpleTier import ru.dbotthepony.mc.otm.block.MatteryBlock import ru.dbotthepony.mc.otm.block.addSimpleDescription @@ -43,16 +44,12 @@ import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.item.BatteryItem import ru.dbotthepony.mc.otm.item.ChestUpgraderItem import ru.dbotthepony.mc.otm.item.CrudeBatteryItem -import ru.dbotthepony.mc.otm.item.consumables.EssenceCapsuleItem import ru.dbotthepony.mc.otm.item.EssenceServoItem import ru.dbotthepony.mc.otm.item.FluidCapsuleItem import ru.dbotthepony.mc.otm.item.block.FluidTankItem import ru.dbotthepony.mc.otm.item.GravitationalDisruptorItem -import ru.dbotthepony.mc.otm.item.consumables.HealPillItem import ru.dbotthepony.mc.otm.item.MatteryItem import ru.dbotthepony.mc.otm.item.MinecartCargoCrateItem -import ru.dbotthepony.mc.otm.item.consumables.PillItem -import ru.dbotthepony.mc.otm.item.consumables.PillType import ru.dbotthepony.mc.otm.item.PortableCondensationDriveItem import ru.dbotthepony.mc.otm.item.ProceduralBatteryItem import ru.dbotthepony.mc.otm.item.QuantumBatteryItem @@ -62,7 +59,7 @@ import ru.dbotthepony.mc.otm.item.addSimpleDescription import ru.dbotthepony.mc.otm.item.armor.PortableGravitationStabilizerItem import ru.dbotthepony.mc.otm.item.armor.TritaniumArmorItem import ru.dbotthepony.mc.otm.item.block.EnergyCableItem -import ru.dbotthepony.mc.otm.item.consumables.NotNormalPill +import ru.dbotthepony.mc.otm.item.consumables.* import ru.dbotthepony.mc.otm.item.exopack.ExopackProbeItem import ru.dbotthepony.mc.otm.item.exopack.ExopackSlotUpgradeItem import ru.dbotthepony.mc.otm.item.exopack.ExopackUpgradeItem @@ -301,6 +298,9 @@ object MItems { val TRITANIUM_NUGGET: Item by registry.register(MNames.TRITANIUM_NUGGET) { Item(DEFAULT_PROPERTIES) } val TRITANIUM_INGOT: Item by registry.register(MNames.TRITANIUM_INGOT) { Item(DEFAULT_PROPERTIES) } val TRITANIUM_INGOT_BLOCK: BlockItem by registry.register(MNames.TRITANIUM_INGOT_BLOCK) { BlockItem(MBlocks.TRITANIUM_INGOT_BLOCK, DEFAULT_PROPERTIES) } + + val WITHERED_STEEL_BLOCK: BlockItem by registry.register(MNames.WITHERED_STEEL_BLOCK) { BlockItem(MBlocks.WITHERED_STEEL_BLOCK, DEFAULT_PROPERTIES) } + val TRITANIUM_BARS: BlockItem by registry.register(MNames.TRITANIUM_BARS) { BlockItem(MBlocks.TRITANIUM_BARS, DEFAULT_PROPERTIES) } val METAL_RAILING: BlockItem by registry.register(MNames.METAL_RAILING) { BlockItem(MBlocks.METAL_RAILING, DEFAULT_PROPERTIES) } @@ -426,6 +426,8 @@ object MItems { val PILL_HEAL: Item by registry.register(MNames.PILL_HEAL) { HealPillItem() } val PILL_NOT_NORMAL: Item by registry.register(MNames.PILL_NOT_NORMAL) { NotNormalPill() } + val IMPERFECT_BREAD: Item by registry.register(MNames.IMPERFECT_BREAD) { ImperfectBread(Item.Properties().food(IMPERFECT_BREAD_FOOD)) } + val PILLS = SupplierList( MItems::PILL_ANDROID, MItems::PILL_HUMANE, @@ -511,6 +513,7 @@ object MItems { val LABORATORY_LAMP_INVERTED: Item by registry.register(MNames.LABORATORY_LAMP_INVERTED) { BlockItem(MBlocks.LABORATORY_LAMP_INVERTED, DEFAULT_PROPERTIES) } val DANGER_STRIPE_BLOCK: Item by registry.register(MNames.DANGER_STRIPE_BLOCK) { BlockItem(MBlocks.DANGER_STRIPE_BLOCK, DEFAULT_PROPERTIES) } val METAL_BEAM: Item by registry.register(MNames.METAL_BEAM) { BlockItem(MBlocks.METAL_BEAM, DEFAULT_PROPERTIES) } + val METAL_BEAM_CENTER: Item by registry.register(MNames.METAL_BEAM_CENTER) { BlockItem(MBlocks.METAL_BEAM_CENTER, DEFAULT_PROPERTIES) } val ENGINE: Item by registry.register(MNames.ENGINE) { BlockItem(MBlocks.ENGINE, DEFAULT_PROPERTIES) } val HOLO_SIGN: Item by registry.register(MNames.HOLO_SIGN) { BlockItem(MBlocks.HOLO_SIGN, DEFAULT_PROPERTIES) } @@ -664,6 +667,10 @@ object MItems { val CHEST_UPGRADER: Item by registry.register(MNames.CHEST_UPGRADER) { ChestUpgraderItem() } val BREAD_MONSTER_SPAWN_EGG: Item by registry.register(MNames.BREAD_MONSTER_SPAWN_EGG){ SpawnEggItem(MEntityTypes.BREAD_MONSTER, 0xFFFFFF, 0xFFFFFF, Item.Properties())} + val LOADER_SPAWN_EGG: Item by registry.register(MNames.LOADER_SPAWN_EGG){ SpawnEggItem(MEntityTypes.LOADER, 0xFFFFFF, 0xFFFFFF, Item.Properties())} + + val ROFLITE_ALLOY_INGOT: Item by registry.register(MNames.ROFLITE_ALLOY_INGOT) { Item(DEFAULT_PROPERTIES) } + val ROFLITE_ALLOY_BLOCK: BlockItem by registry.register(MNames.ROFLITE_ALLOY_BLOCK) { BlockItem(MBlocks.ROFLITE_ALLOY_BLOCK, DEFAULT_PROPERTIES) } init { MRegistry.registerItems(registry) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MSoundEvents.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MSoundEvents.kt index 375b3dd39..04daae5ed 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MSoundEvents.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MSoundEvents.kt @@ -25,6 +25,8 @@ object MSoundEvents { val BLACK_HOLE by make("black_hole", 32F) + val LOADER_AMBIENT by make("loader_ambient") + fun register(bus: IEventBus) { registry.register(bus) } diff --git a/src/main/resources/assets/overdrive_that_matters/loader.java b/src/main/resources/assets/overdrive_that_matters/loader.java new file mode 100644 index 000000000..c040f7a4f --- /dev/null +++ b/src/main/resources/assets/overdrive_that_matters/loader.java @@ -0,0 +1,75 @@ +// Made with Blockbench 4.12.3 +// Exported for Minecraft version 1.17 or later with Mojang mappings +// Paste this class into your mod and generate all required imports + + +public class loader extends EntityModel { + // This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into this model's constructor + public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(new ResourceLocation("modid", "loader"), "main"); + private final ModelPart root; + private final ModelPart Head; + private final ModelPart Body; + private final ModelPart LeftLeg; + private final ModelPart RightLeg; + private final ModelPart LeftArm; + private final ModelPart ElbowL; + private final ModelPart RightArm; + private final ModelPart ElbowR; + + public loader(ModelPart root) { + this.root = root.getChild("root"); + this.Head = this.root.getChild("Head"); + this.Body = this.root.getChild("Body"); + this.LeftLeg = this.root.getChild("LeftLeg"); + this.RightLeg = this.root.getChild("RightLeg"); + this.LeftArm = this.root.getChild("LeftArm"); + this.ElbowL = this.LeftArm.getChild("ElbowL"); + this.RightArm = this.root.getChild("RightArm"); + this.ElbowR = this.RightArm.getChild("ElbowR"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition root = partdefinition.addOrReplaceChild("root", CubeListBuilder.create(), PartPose.offset(0.0F, 24.0F, 0.0F)); + + PartDefinition Head = root.addOrReplaceChild("Head", CubeListBuilder.create().texOffs(48, 23).addBox(-3.0F, -1.0F, -2.0F, 6.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(-4.0F, -32.0F, -5.0F)); + + PartDefinition Body = root.addOrReplaceChild("Body", CubeListBuilder.create().texOffs(0, 0).addBox(-10.0F, -16.0F, -5.0F, 20.0F, 10.0F, 13.0F, new CubeDeformation(0.0F)) + .texOffs(0, 50).addBox(-3.0F, -3.0F, -4.0F, 6.0F, 5.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(112, 52).addBox(10.0F, -13.0F, 0.0F, 2.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(96, 52).addBox(-12.0F, -13.0F, -1.0F, 2.0F, 6.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(53, 0).addBox(-5.0F, -1.0F, 4.0F, 10.0F, 4.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -26.0F, -1.0F)); + + PartDefinition antenna_r1 = Body.addOrReplaceChild("antenna_r1", CubeListBuilder.create().texOffs(76, 6).addBox(0.0F, -7.0F, -1.0F, 0.0F, 14.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(8.0F, -22.0F, 8.0F, -0.2618F, 0.0F, 0.0F)); + + PartDefinition waist_r1 = Body.addOrReplaceChild("waist_r1", CubeListBuilder.create().texOffs(28, 50).addBox(-2.0F, -5.0F, -4.0F, 4.0F, 7.0F, 7.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -3.0F, 2.0F, -0.2618F, 0.0F, 0.0F)); + + PartDefinition LeftLeg = root.addOrReplaceChild("LeftLeg", CubeListBuilder.create().texOffs(106, 24).addBox(0.0F, 10.0F, -2.0F, 4.0F, 16.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(66, 46).addBox(-1.0F, -2.0F, -3.0F, 6.0F, 12.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(4.0F, -26.0F, -1.0F)); + + PartDefinition RightLeg = root.addOrReplaceChild("RightLeg", CubeListBuilder.create().texOffs(84, 24).addBox(-4.0F, 10.0F, -2.0F, 4.0F, 16.0F, 7.0F, new CubeDeformation(0.0F)) + .texOffs(48, 34).addBox(-5.0F, -2.0F, -3.0F, 6.0F, 12.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offset(-4.0F, -26.0F, -1.0F)); + + PartDefinition LeftArm = root.addOrReplaceChild("LeftArm", CubeListBuilder.create().texOffs(104, 0).addBox(-1.0F, -7.0F, -4.0F, 4.0F, 16.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(13.0F, -36.0F, 2.0F)); + + PartDefinition ElbowL = LeftArm.addOrReplaceChild("ElbowL", CubeListBuilder.create().texOffs(24, 23).addBox(-2.0F, -0.2F, -2.0F, 4.0F, 19.0F, 8.0F, new CubeDeformation(-0.1F)), PartPose.offset(1.0F, 9.0F, -1.0F)); + + PartDefinition RightArm = root.addOrReplaceChild("RightArm", CubeListBuilder.create().texOffs(80, 0).addBox(-3.0F, -7.0F, -4.0F, 4.0F, 16.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offset(-13.0F, -36.0F, 1.0F)); + + PartDefinition ElbowR = RightArm.addOrReplaceChild("ElbowR", CubeListBuilder.create().texOffs(0, 23).addBox(-2.0F, -0.2F, -2.0F, 4.0F, 19.0F, 8.0F, new CubeDeformation(-0.1F)), PartPose.offset(-1.0F, 9.0F, -1.0F)); + + return LayerDefinition.create(meshdefinition, 128, 64); + } + + @Override + public void setupAnim(Entity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + + } + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + root.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + } +} \ No newline at end of file diff --git a/src/main/resources/assets/overdrive_that_matters/models/loader.animation.json b/src/main/resources/assets/overdrive_that_matters/models/loader.animation.json new file mode 100644 index 000000000..60ec4497b --- /dev/null +++ b/src/main/resources/assets/overdrive_that_matters/models/loader.animation.json @@ -0,0 +1,166 @@ +{ + "format_version": "1.8.0", + "animations": { + "Idle": { + "loop": true, + "animation_length": 0.16, + "bones": { + "Body": { + "position": { + "0.0": [0, 0, 0], + "0.08": [0, -0.1, 0], + "0.16": [0, 0, 0] + } + }, + "Head": { + "position": { + "0.0": [0, 0, 0], + "0.08": [0, -0.1, 0], + "0.16": [0, 0, 0] + } + }, + "LeftArm": { + "position": { + "0.0": [0, 0.1, 0], + "0.12": [0, -0.2, 0], + "0.16": [0, 0, 0] + } + }, + "RightArm": { + "position": { + "0.0": [0, 0.1, 0], + "0.12": [0, -0.2, 0], + "0.16": [0, 0, 0] + } + } + } + }, + "Move": { + "loop": true, + "animation_length": 0.48, + "bones": { + "Body": { + "position": { + "0.0": [0, 0, 0], + "0.12": [0, 0.3, 0], + "0.24": [0, 0, 0], + "0.36": [0, 0.3, 0], + "0.48": [0, 0, 0] + } + }, + "Head": { + "position": { + "0.0": [0, 0, 0], + "0.12": [0, 0.3, 0], + "0.24": [0, 0, 0], + "0.36": [0, 0.3, 0], + "0.48": [0, 0, 0] + } + }, + "LeftLeg": { + "rotation": { + "0.0": [-22.5, 0, 0], + "0.24": [22.5, 0, 0], + "0.48": [-22.5, 0, 0] + }, + "position": { + "0.0": [0, 0, -2], + "0.12": [0, 0, 0], + "0.24": [0, 1, 1], + "0.36": [0, 2, -2], + "0.48": [0, 0, -2] + } + }, + "RightLeg": { + "rotation": { + "0.0": [22.5, 0, 0], + "0.24": [-22.5, 0, 0], + "0.48": [22.5, 0, 0] + }, + "position": { + "0.0": [0, 0, 2], + "0.12": [0, 2, -2], + "0.24": [0, 0, -2], + "0.36": [0, 0, 0], + "0.48": [0, 0, 2] + } + }, + "LeftArm": { + "rotation": { + "0.0": [6, 0, 0], + "0.24": [-6, 0, 0], + "0.48": [6, 0, 0] + }, + "position": { + "0.0": [0, 0, 0], + "0.12": [0, 0.2, 0], + "0.24": [0, 0, 0], + "0.36": [0, 0.2, 0], + "0.48": [0, 0, 0] + } + }, + "ElbowR": { + "rotation": { + "0.0": [-30, 0, 0], + "0.24": [-19.5, 0, 0], + "0.48": [-30, 0, 0] + } + }, + "RightArm": { + "rotation": { + "0.0": [-6, 0, 0], + "0.24": [6, 0, 0], + "0.48": [-6, 0, 0] + }, + "position": { + "0.0": [0, 0, 0], + "0.12": [0, 0.2, 0], + "0.24": [0, 0, 0], + "0.36": [0, 0.2, 0], + "0.48": [0, 0, 0] + } + }, + "ElbowL": { + "rotation": { + "0.0": [-16.5, 0, 0], + "0.24": [-25.5, 0, 0], + "0.48": [-16.5, 0, 0] + } + } + } + }, + "Atack": { + "animation_length": 0.48, + "bones": { + "LeftArm": { + "rotation": { + "0.0": [0, 0, 0], + "0.2": [-135, 0, 0], + "0.48": [0, 0, 0] + } + }, + "ElbowR": { + "rotation": { + "0.0": [-2, 0, 0], + "0.2": [-24.5, 0, 0], + "0.48": [-2, 0, 0] + } + }, + "RightArm": { + "rotation": { + "0.0": [0, 0, 0], + "0.2": [-135, 0, 0], + "0.48": [0, 0, 0] + } + }, + "ElbowL": { + "rotation": { + "0.0": [-2, 0, 0], + "0.2": [-24.5, 0, 0], + "0.48": [-2, 0, 0] + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/overdrive_that_matters/models/model.animation.json b/src/main/resources/assets/overdrive_that_matters/models/model.animation.json new file mode 100644 index 000000000..49daa0b45 --- /dev/null +++ b/src/main/resources/assets/overdrive_that_matters/models/model.animation.json @@ -0,0 +1,167 @@ +{ + "format_version": "1.8.0", + "animations": { + "Idle": { + "loop": true, + "animation_length": 0.16, + "bones": { + "Body": { + "position": { + "0.0": [0, 0, 0], + "0.08": [0, -0.1, 0], + "0.16": [0, 0, 0] + } + }, + "Head": { + "position": { + "0.0": [0, 0, 0], + "0.08": [0, -0.1, 0], + "0.16": [0, 0, 0] + } + }, + "LeftArm": { + "position": { + "0.0": [0, 0.1, 0], + "0.12": [0, -0.2, 0], + "0.16": [0, 0, 0] + } + }, + "RightArm": { + "position": { + "0.0": [0, 0.1, 0], + "0.12": [0, -0.2, 0], + "0.16": [0, 0, 0] + } + } + } + }, + "Move": { + "loop": true, + "animation_length": 0.48, + "bones": { + "Body": { + "position": { + "0.0": [0, 0, 0], + "0.12": [0, 0.3, 0], + "0.24": [0, 0, 0], + "0.36": [0, 0.3, 0], + "0.48": [0, 0, 0] + } + }, + "Head": { + "position": { + "0.0": [0, 0, 0], + "0.12": [0, 0.3, 0], + "0.24": [0, 0, 0], + "0.36": [0, 0.3, 0], + "0.48": [0, 0, 0] + } + }, + "LeftLeg": { + "rotation": { + "0.0": [-22.5, 0, 0], + "0.24": [22.5, 0, 0], + "0.48": [-22.5, 0, 0] + }, + "position": { + "0.0": [0, 0, -2], + "0.12": [0, 0, 0], + "0.24": [0, 1, 1], + "0.36": [0, 2, -2], + "0.48": [0, 0, -2] + } + }, + "RightLeg": { + "rotation": { + "0.0": [22.5, 0, 0], + "0.24": [-22.5, 0, 0], + "0.48": [22.5, 0, 0] + }, + "position": { + "0.0": [0, 0, 2], + "0.12": [0, 2, -2], + "0.24": [0, 0, -2], + "0.36": [0, 0, 0], + "0.48": [0, 0, 2] + } + }, + "LeftArm": { + "rotation": { + "0.0": [6, 0, 0], + "0.24": [-6, 0, 0], + "0.48": [6, 0, 0] + }, + "position": { + "0.0": [0, 0, 0], + "0.12": [0, 0.2, 0], + "0.24": [0, 0, 0], + "0.36": [0, 0.2, 0], + "0.48": [0, 0, 0] + } + }, + "ElbowR": { + "rotation": { + "0.0": [-30, 0, 0], + "0.24": [-19.5, 0, 0], + "0.48": [-30, 0, 0] + } + }, + "RightArm": { + "rotation": { + "0.0": [-6, 0, 0], + "0.24": [6, 0, 0], + "0.48": [-6, 0, 0] + }, + "position": { + "0.0": [0, 0, 0], + "0.12": [0, 0.2, 0], + "0.24": [0, 0, 0], + "0.36": [0, 0.2, 0], + "0.48": [0, 0, 0] + } + }, + "ElbowL": { + "rotation": { + "0.0": [-16.5, 0, 0], + "0.24": [-25.5, 0, 0], + "0.48": [-16.5, 0, 0] + } + } + } + }, + "Atack": { + "animation_length": 0.48, + "override_previous_animation": true, + "bones": { + "LeftArm": { + "rotation": { + "0.0": [0, 0, 0], + "0.2": [-135, 0, 0], + "0.48": [0, 0, 0] + } + }, + "ElbowR": { + "rotation": { + "0.0": [-2, 0, 0], + "0.2": [-24.5, 0, 0], + "0.48": [-2, 0, 0] + } + }, + "RightArm": { + "rotation": { + "0.0": [0, 0, 0], + "0.2": [-135, 0, 0], + "0.48": [0, 0, 0] + } + }, + "ElbowL": { + "rotation": { + "0.0": [-2, 0, 0], + "0.2": [-24.5, 0, 0], + "0.48": [-2, 0, 0] + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/overdrive_that_matters/sounds/entity/loader/loader_ambient.ogg b/src/main/resources/assets/overdrive_that_matters/sounds/entity/loader/loader_ambient.ogg new file mode 100644 index 000000000..130670948 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/sounds/entity/loader/loader_ambient.ogg differ diff --git a/src/main/resources/assets/overdrive_that_matters/sounds/entity/loader/loader_ambient2.ogg b/src/main/resources/assets/overdrive_that_matters/sounds/entity/loader/loader_ambient2.ogg new file mode 100644 index 000000000..40f9996c7 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/sounds/entity/loader/loader_ambient2.ogg differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/block/resource/withered_steel_block.png b/src/main/resources/assets/overdrive_that_matters/textures/block/resource/withered_steel_block.png new file mode 100644 index 000000000..54b0a6f24 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/block/resource/withered_steel_block.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/entity/loader.png b/src/main/resources/assets/overdrive_that_matters/textures/entity/loader.png new file mode 100644 index 000000000..22ec319cd Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/entity/loader.png differ diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/egg/loader.png b/src/main/resources/assets/overdrive_that_matters/textures/item/egg/loader.png new file mode 100644 index 000000000..e3df83d42 Binary files /dev/null and b/src/main/resources/assets/overdrive_that_matters/textures/item/egg/loader.png differ diff --git a/src/main/resources/overdrive_that_matters.mixins.json b/src/main/resources/overdrive_that_matters.mixins.json index 934ead87e..f317fa83a 100644 --- a/src/main/resources/overdrive_that_matters.mixins.json +++ b/src/main/resources/overdrive_that_matters.mixins.json @@ -18,7 +18,8 @@ "HopperBlockEntityMixin", "DispenserBlockEntityMixin", "GuiGraphicsMixin", - "BlockStateBaseMixin" + "BlockStateBaseMixin", + "LevelMixin" ], "client": [ "MixinGameRenderer",