From d2371b03f6879d5ac39b1e9e27fb3d3e483f6ae9 Mon Sep 17 00:00:00 2001 From: GearShocky Date: Tue, 11 Mar 2025 00:22:14 +0500 Subject: [PATCH] Enforcer WIP --- src/bb/enforcer.bbmodel | 1 + .../mc/otm/datagen/items/ItemModels.kt | 1 + .../mc/otm/datagen/lang/English.kt | 3 + .../mc/otm/datagen/lang/Russian.kt | 3 + .../client/animation/EnforcerAnimation.java | 36 ++++ .../client/model/entity/EnforcerModel.java | 128 ++++++++++++++ .../client/render/entity/EnforcerRenderer.kt | 18 ++ .../ru/dbotthepony/mc/otm/entity/Cleaner.kt | 12 ++ .../ru/dbotthepony/mc/otm/entity/Enforcer.kt | 166 ++++++++++++++++++ .../ru/dbotthepony/mc/otm/registry/MNames.kt | 4 + .../mc/otm/registry/game/MEntityTypes.kt | 13 ++ .../mc/otm/registry/game/MItems.kt | 3 + .../textures/entity/enforcer.png | Bin 0 -> 5963 bytes .../textures/item/egg/cleaner.png | Bin 0 -> 513 bytes .../worldgen/structure/laboratory.json | 9 +- 15 files changed, 396 insertions(+), 1 deletion(-) create mode 100644 src/bb/enforcer.bbmodel create mode 100644 src/main/java/ru/dbotthepony/mc/otm/client/animation/EnforcerAnimation.java create mode 100644 src/main/java/ru/dbotthepony/mc/otm/client/model/entity/EnforcerModel.java create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/EnforcerRenderer.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/entity/Enforcer.kt create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/entity/enforcer.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/item/egg/cleaner.png diff --git a/src/bb/enforcer.bbmodel b/src/bb/enforcer.bbmodel new file mode 100644 index 000000000..3936410cb --- /dev/null +++ b/src/bb/enforcer.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.10","model_format":"modded_entity","box_uv":true},"name":"enforcer","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":256,"height":256},"elements":[{"name":"cube","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-5,10,-10],"to":[5,24,10],"autouv":0,"color":9,"origin":[0,22,0],"uv_offset":[92,33],"faces":{"north":{"uv":[112,53,122,67],"texture":0},"east":{"uv":[92,53,112,67],"texture":0},"south":{"uv":[142,53,152,67],"texture":0},"west":{"uv":[122,53,142,67],"texture":0},"up":{"uv":[122,53,112,33],"texture":0},"down":{"uv":[132,33,122,53],"texture":0}},"type":"cube","uuid":"51db3e3f-941d-a163-138b-940354b747c5"},{"name":"cube","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-8,21,-7],"to":[8,26,7],"autouv":0,"color":2,"origin":[0,36,0],"uv_offset":[140,104],"faces":{"north":{"uv":[154,118,170,123],"texture":0},"east":{"uv":[140,118,154,123],"texture":0},"south":{"uv":[184,118,200,123],"texture":0},"west":{"uv":[170,118,184,123],"texture":0},"up":{"uv":[170,118,154,104],"texture":0},"down":{"uv":[186,104,170,118],"texture":0}},"type":"cube","uuid":"ecbfa3cf-448b-7558-b3df-99c345bbb9e2"},{"name":"leg","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-15,3,-31],"to":[-4,16,-12],"autouv":0,"color":9,"origin":[-6,5,-13],"uv_offset":[80,104],"faces":{"north":{"uv":[99,123,110,136],"texture":0},"east":{"uv":[80,123,99,136],"texture":0},"south":{"uv":[129,123,140,136],"texture":0},"west":{"uv":[110,123,129,136],"texture":0},"up":{"uv":[110,123,99,104],"texture":0},"down":{"uv":[121,104,110,123],"texture":0}},"type":"cube","uuid":"e91e22e6-dd1c-5be1-ff03-b3ca89426ee7"},{"name":"leg","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[4,3,-31],"to":[15,16,-12],"autouv":0,"color":9,"origin":[11,5,-13],"uv_offset":[0,125],"faces":{"north":{"uv":[19,144,30,157],"texture":0},"east":{"uv":[0,144,19,157],"texture":0},"south":{"uv":[49,144,60,157],"texture":0},"west":{"uv":[30,144,49,157],"texture":0},"up":{"uv":[30,144,19,125],"texture":0},"down":{"uv":[41,125,30,144],"texture":0}},"type":"cube","uuid":"2a055131-4940-38a2-e455-93ec71b3f1a9"},{"name":"leg","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-15,3,12],"to":[-4,16,31],"autouv":0,"color":9,"origin":[-6,5,28],"uv_offset":[60,136],"faces":{"north":{"uv":[79,155,90,168],"texture":0},"east":{"uv":[60,155,79,168],"texture":0},"south":{"uv":[109,155,120,168],"texture":0},"west":{"uv":[90,155,109,168],"texture":0},"up":{"uv":[90,155,79,136],"texture":0},"down":{"uv":[101,136,90,155],"texture":0}},"type":"cube","uuid":"976e9083-9210-40cb-ef08-fac284f39296"},{"name":"leg","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[4,3,12],"to":[15,16,31],"autouv":0,"color":9,"origin":[11,5,28],"uv_offset":[120,136],"faces":{"north":{"uv":[139,155,150,168],"texture":0},"east":{"uv":[120,155,139,168],"texture":0},"south":{"uv":[169,155,180,168],"texture":0},"west":{"uv":[150,155,169,168],"texture":0},"up":{"uv":[150,155,139,136],"texture":0},"down":{"uv":[161,136,150,155],"texture":0}},"type":"cube","uuid":"5e050313-2d39-2c10-29b7-71c1a43982de"},{"name":"body","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-12,26,-11],"to":[12,42,11],"autouv":0,"color":9,"origin":[0,41,0],"faces":{"north":{"uv":[22,22,46,38],"texture":0},"east":{"uv":[0,22,22,38],"texture":0},"south":{"uv":[68,22,92,38],"texture":0},"west":{"uv":[46,22,68,38],"texture":0},"up":{"uv":[46,22,22,0],"texture":0},"down":{"uv":[70,0,46,22],"texture":0}},"type":"cube","uuid":"18a0442e-ac0d-2ba5-7278-92865b6326dc"},{"name":"cube","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[1,25,-12],"to":[8,28,-9],"autouv":0,"color":4,"origin":[4,25,-10],"uv_offset":[92,67],"faces":{"north":{"uv":[95,70,102,73],"texture":0},"east":{"uv":[92,70,95,73],"texture":0},"south":{"uv":[105,70,112,73],"texture":0},"west":{"uv":[102,70,105,73],"texture":0},"up":{"uv":[102,70,95,67],"texture":0},"down":{"uv":[109,67,102,70],"texture":0}},"type":"cube","uuid":"5c456e12-bfd4-4a1e-e9c0-18662c0d6eca"},{"name":"joint","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-14,28,-6],"to":[-12,40,6],"autouv":0,"color":6,"origin":[-13,34,0],"uv_offset":[122,168],"faces":{"north":{"uv":[134,180,136,192],"texture":0},"east":{"uv":[122,180,134,192],"texture":0},"south":{"uv":[148,180,150,192],"texture":0},"west":{"uv":[136,180,148,192],"texture":0},"up":{"uv":[136,180,134,168],"texture":0},"down":{"uv":[138,168,136,180],"texture":0}},"type":"cube","uuid":"faa924f5-be91-ab45-6398-19c35f0c6331"},{"name":"joint","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[12,28,-6],"to":[14,40,6],"autouv":0,"color":6,"origin":[13,34,0],"uv_offset":[150,168],"faces":{"north":{"uv":[162,180,164,192],"texture":0},"east":{"uv":[150,180,162,192],"texture":0},"south":{"uv":[176,180,178,192],"texture":0},"west":{"uv":[164,180,176,192],"texture":0},"up":{"uv":[164,180,162,168],"texture":0},"down":{"uv":[166,168,164,180],"texture":0}},"type":"cube","uuid":"ce24f9d6-789b-4ef8-dbd8-f9df3b6a2e6d"},{"name":"cube","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-24,29,-5],"to":[-14,39,5],"autouv":0,"color":2,"origin":[-19,34,0],"uv_offset":[44,168],"faces":{"north":{"uv":[54,178,64,188],"texture":0},"east":{"uv":[44,178,54,188],"texture":0},"south":{"uv":[74,178,84,188],"texture":0},"west":{"uv":[64,178,74,188],"texture":0},"up":{"uv":[64,178,54,168],"texture":0},"down":{"uv":[74,168,64,178],"texture":0}},"type":"cube","uuid":"ab09beae-cb19-1ad3-f574-463eb7a40186"},{"name":"rocket","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[14,24,-14],"to":[26,45,14],"autouv":0,"color":9,"origin":[19,28,10],"uv_offset":[0,76],"faces":{"north":{"uv":[28,104,40,125],"texture":0},"east":{"uv":[0,104,28,125],"texture":0},"south":{"uv":[68,104,80,125],"texture":0},"west":{"uv":[40,104,68,125],"texture":0},"up":{"uv":[40,104,28,76],"texture":0},"down":{"uv":[52,76,40,104],"texture":0}},"type":"cube","uuid":"c796e69b-9886-7252-bb1e-5ccccced1c67"},{"name":"cube","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-26,24,7],"to":[-18,32,22],"autouv":0,"color":3,"rotation":[-30,0,0],"origin":[-22,28,6.5],"uv_offset":[152,33],"faces":{"north":{"uv":[167,48,175,56],"texture":0},"east":{"uv":[152,48,167,56],"texture":0},"south":{"uv":[190,48,198,56],"texture":0},"west":{"uv":[175,48,190,56],"texture":0},"up":{"uv":[175,48,167,33],"texture":0},"down":{"uv":[183,33,175,48],"texture":0}},"type":"cube","uuid":"dcdb7038-230d-4c24-d311-48a5ee0938f3"},{"name":"body","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-11,30,11],"to":[11,44,25],"autouv":0,"color":2,"origin":[0,46,22],"uv_offset":[80,76],"faces":{"north":{"uv":[94,90,116,104],"texture":0},"east":{"uv":[80,90,94,104],"texture":0},"south":{"uv":[130,90,152,104],"texture":0},"west":{"uv":[116,90,130,104],"texture":0},"up":{"uv":[116,90,94,76],"texture":0},"down":{"uv":[138,76,116,90],"texture":0}},"type":"cube","uuid":"38e205f5-7da0-0e07-a1d2-cee48435acf7"},{"name":"leg","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[5,8,3],"to":[14,19,16],"autouv":0,"color":2,"origin":[11,10,17],"uv_offset":[152,56],"faces":{"north":{"uv":[165,69,174,80],"texture":0},"east":{"uv":[152,69,165,80],"texture":0},"south":{"uv":[187,69,196,80],"texture":0},"west":{"uv":[174,69,187,80],"texture":0},"up":{"uv":[174,69,165,56],"texture":0},"down":{"uv":[183,56,174,69],"texture":0}},"type":"cube","uuid":"faa3b117-7d2d-e54e-b77c-8b1d21711a20"},{"name":"leg","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[5,8,-16],"to":[14,19,-3],"autouv":0,"color":2,"origin":[11,10,-4],"uv_offset":[152,80],"faces":{"north":{"uv":[165,93,174,104],"texture":0},"east":{"uv":[152,93,165,104],"texture":0},"south":{"uv":[187,93,196,104],"texture":0},"west":{"uv":[174,93,187,104],"texture":0},"up":{"uv":[174,93,165,80],"texture":0},"down":{"uv":[183,80,174,93],"texture":0}},"type":"cube","uuid":"89827b33-6902-67fa-b09c-4e351bb818fa"},{"name":"leg","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-14,8,3],"to":[-5,19,16],"autouv":0,"color":2,"origin":[-6,10,17],"uv_offset":[0,157],"faces":{"north":{"uv":[13,170,22,181],"texture":0},"east":{"uv":[0,170,13,181],"texture":0},"south":{"uv":[35,170,44,181],"texture":0},"west":{"uv":[22,170,35,181],"texture":0},"up":{"uv":[22,170,13,157],"texture":0},"down":{"uv":[31,157,22,170],"texture":0}},"type":"cube","uuid":"04e9cb1e-65b4-1fa1-b868-a4eed1111aa7"},{"name":"leg","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-14,8,-16],"to":[-5,19,-3],"autouv":0,"color":2,"origin":[-6,10,-4],"uv_offset":[158,0],"faces":{"north":{"uv":[171,13,180,24],"texture":0},"east":{"uv":[158,13,171,24],"texture":0},"south":{"uv":[193,13,202,24],"texture":0},"west":{"uv":[180,13,193,24],"texture":0},"up":{"uv":[180,13,171,0],"texture":0},"down":{"uv":[189,0,180,13],"texture":0}},"type":"cube","uuid":"8d98dbdd-30e3-df6c-6347-f0eaa042ae2f"},{"name":"cube","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-8,41,7],"to":[-8,60,9],"autouv":0,"color":2,"rotation":[10,0,0],"origin":[-8,41.5,8],"uv_offset":[178,168],"faces":{"north":{"uv":[180,170,180,189],"texture":0},"east":{"uv":[178,170,180,189],"texture":0},"south":{"uv":[182,170,182,189],"texture":0},"west":{"uv":[180,170,182,189],"texture":0},"up":{"uv":[180,170,180,168],"texture":0},"down":{"uv":[180,168,180,170],"texture":0}},"type":"cube","uuid":"0dcb1d3c-1ed2-76a9-9e0d-15979e5cc46e"},{"name":"cube","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-27,22,-14],"to":[-17,32,9],"autouv":0,"color":9,"origin":[-22,27,4],"uv_offset":[92,0],"faces":{"north":{"uv":[115,23,125,33],"texture":0},"east":{"uv":[92,23,115,33],"texture":0},"south":{"uv":[148,23,158,33],"texture":0},"west":{"uv":[125,23,148,33],"texture":0},"up":{"uv":[125,23,115,0],"texture":0},"down":{"uv":[135,0,125,23],"texture":0}},"type":"cube","uuid":"d2aeaf8c-33b1-e950-3fd9-01db9be3cc55"},{"name":"cube","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-25,24,-27],"to":[-19,30,-14],"autouv":0,"color":9,"origin":[-22,27,-19],"uv_offset":[84,168],"faces":{"north":{"uv":[97,181,103,187],"texture":0},"east":{"uv":[84,181,97,187],"texture":0},"south":{"uv":[116,181,122,187],"texture":0},"west":{"uv":[103,181,116,187],"texture":0},"up":{"uv":[103,181,97,168],"texture":0},"down":{"uv":[109,168,103,181],"texture":0}},"type":"cube","uuid":"2804b1d0-70d2-f51f-303e-07ea18a5f473"},{"name":"body","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-12,26,-11],"to":[12,42,11],"autouv":0,"color":9,"inflate":0.5,"origin":[0,41,0],"uv_offset":[0,38],"faces":{"north":{"uv":[22,60,46,76],"texture":0},"east":{"uv":[0,60,22,76],"texture":0},"south":{"uv":[68,60,92,76],"texture":0},"west":{"uv":[46,60,68,76],"texture":0},"up":{"uv":[46,60,22,38],"texture":0},"down":{"uv":[70,38,46,60],"texture":0}},"type":"cube","uuid":"7e750d0b-499f-fbda-69b8-d38802f89bfa"},{"name":"leg","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[5,10,20],"to":[14,21,33],"autouv":0,"color":2,"origin":[11,12,34],"uv_offset":[202,0],"faces":{"north":{"uv":[215,13,224,24],"texture":0},"east":{"uv":[202,13,215,24],"texture":0},"south":{"uv":[237,13,246,24],"texture":0},"west":{"uv":[224,13,237,24],"texture":0},"up":{"uv":[224,13,215,0],"texture":0},"down":{"uv":[233,0,224,13],"texture":0}},"type":"cube","uuid":"83ccd667-0450-3e8a-6db3-4ad7761ff4ca"},{"name":"leg","box_uv":true,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-14,10,20],"to":[-5,21,33],"autouv":0,"color":2,"origin":[-6,12,34],"uv_offset":[199,24],"faces":{"north":{"uv":[212,37,221,48],"texture":0},"east":{"uv":[199,37,212,48],"texture":0},"south":{"uv":[234,37,243,48],"texture":0},"west":{"uv":[221,37,234,48],"texture":0},"up":{"uv":[221,37,212,24],"texture":0},"down":{"uv":[230,24,221,37],"texture":0}},"type":"cube","uuid":"b7a8c5da-82bc-c37a-d7be-04e8f8c7f2ba"}],"outliner":[{"name":"root","origin":[0,0,0],"color":0,"uuid":"514b90ff-4605-7406-ef71-75c69305c9d4","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":[{"name":"base","origin":[0,22,0],"color":0,"uuid":"e5b07f56-68f3-ab08-dc53-e954c1a5d4d4","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["ecbfa3cf-448b-7558-b3df-99c345bbb9e2","51db3e3f-941d-a163-138b-940354b747c5",{"name":"Body","origin":[0,26.6,0.1],"color":0,"uuid":"e997d144-259f-c084-afec-71d628f74e44","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":[{"name":"Head","origin":[4,25,-11],"color":0,"uuid":"b1f278a9-008b-1267-0c2c-ae897dc873a8","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["5c456e12-bfd4-4a1e-e9c0-18662c0d6eca"]},"38e205f5-7da0-0e07-a1d2-cee48435acf7","18a0442e-ac0d-2ba5-7278-92865b6326dc","7e750d0b-499f-fbda-69b8-d38802f89bfa","faa924f5-be91-ab45-6398-19c35f0c6331","ce24f9d6-789b-4ef8-dbd8-f9df3b6a2e6d",{"name":"rocket","origin":[14,34.5,0],"color":0,"uuid":"01051101-03aa-b5ec-21e8-cb3be8f9f9c1","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["c796e69b-9886-7252-bb1e-5ccccced1c67"]},{"name":"flamethrower","origin":[-14.25,33.73463,-0.02724],"color":0,"uuid":"cd435f3d-825a-e33a-0fe3-ccaf16bc672a","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["ab09beae-cb19-1ad3-f574-463eb7a40186","d2aeaf8c-33b1-e950-3fd9-01db9be3cc55","2804b1d0-70d2-f51f-303e-07ea18a5f473","dcdb7038-230d-4c24-d311-48a5ee0938f3"]},"0dcb1d3c-1ed2-76a9-9e0d-15979e5cc46e"]}]},{"name":"leg_FL","origin":[-9.5,13.5,-6.5],"rotation":[-9,29,-2],"color":0,"uuid":"3f32d854-7384-3d6a-eca8-d1eb13e387ed","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["8d98dbdd-30e3-df6c-6347-f0eaa042ae2f","e91e22e6-dd1c-5be1-ff03-b3ca89426ee7"]},{"name":"leg_FR","origin":[9.5,13.5,-6.5],"rotation":[-9,-29,2],"color":0,"uuid":"fb1128ec-3b6f-3075-483e-508c13085c24","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["2a055131-4940-38a2-e455-93ec71b3f1a9","89827b33-6902-67fa-b09c-4e351bb818fa"]},{"name":"leg_BL","origin":[-9.5,13.83333,6.83333],"rotation":[9,-29,-2],"color":0,"uuid":"4edb4056-fbbd-3038-f4cb-b27262858b3d","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["976e9083-9210-40cb-ef08-fac284f39296","b7a8c5da-82bc-c37a-d7be-04e8f8c7f2ba","04e9cb1e-65b4-1fa1-b868-a4eed1111aa7"]},{"name":"leg_BR","origin":[9.5,13.83333,6.16667],"rotation":[9,29,2],"color":0,"uuid":"e11d5a6f-8c6b-cbbc-0b01-7e5ac89bcbe6","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["faa3b117-7d2d-e54e-b77c-8b1d21711a20","5e050313-2d39-2c10-29b7-71c1a43982de","83ccd667-0450-3e8a-6db3-4ad7761ff4ca"]}]}],"textures":[{"path":"L:\\overdrive_that_matters\\src\\main\\resources\\assets\\overdrive_that_matters\\textures\\entity\\enforcer.png","name":"enforcer.png","folder":"block","namespace":"","id":"0","group":"","width":256,"height":256,"uv_width":256,"uv_height":256,"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":"09bca0d4-3d23-9475-2877-88d954c83ace","relative_path":"../main/resources/assets/overdrive_that_matters/textures/entity/enforcer.png","source":"data:image/png;base64,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iMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEFACiMNNcykCrUBACaAV3aiNUATiEPg/B32twnWzJU8AAAAASUVORK5CYII="}],"animations":[{"uuid":"4aa48af6-3354-d0cf-0a74-11bfa885c91a","name":"charge","loop":"loop","override":false,"length":0,"snapping":25,"selected":false,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"514b90ff-4605-7406-ef71-75c69305c9d4":{"name":"root","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"-1","z":"0"}],"uuid":"8685d823-bebc-4c99-cd89-2649290b07f1","time":0,"color":-1,"interpolation":"linear","easing":"linear","easingArgs":[]}]},"e997d144-259f-c084-afec-71d628f74e44":{"name":"Body","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"7.5","y":"0","z":"0"}],"uuid":"8f016955-0dbf-2085-d67e-bafce1116644","time":0,"color":-1,"interpolation":"linear","easing":"linear","easingArgs":[]}]},"3f32d854-7384-3d6a-eca8-d1eb13e387ed":{"name":"leg_FL","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"0.3244156496","y":"25.5370570533","z":"-4.9816593783"}],"uuid":"f57e17fa-52fc-bdc7-ae2f-d69a041598c8","time":0,"color":-1,"interpolation":"linear","easing":"linear","easingArgs":[]}]},"fb1128ec-3b6f-3075-483e-508c13085c24":{"name":"leg_FR","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"0.5426163","y":"-23.0465316371","z":"4.9995738111"}],"uuid":"7cf6dcf9-1f7a-fb78-ded0-7e252fe09b0b","time":0,"color":-1,"interpolation":"linear","easing":"linear","easingArgs":[]}]},"e11d5a6f-8c6b-cbbc-0b01-7e5ac89bcbe6":{"name":"leg_BR","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-0.3244156496","y":"25.5370570533","z":"4.9816593783"}],"uuid":"c83d1f7f-0a1f-e430-28e9-b0130ffe9dd6","time":0,"color":-1,"interpolation":"linear","easing":"linear","easingArgs":[]}]},"4edb4056-fbbd-3038-f4cb-b27262858b3d":{"name":"leg_BL","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"-0.3244156496","y":"-25.5370570533","z":"-4.9816593783"}],"uuid":"23970bfb-8236-66e8-c2e4-5c80195cd39a","time":0,"color":-1,"interpolation":"linear","easing":"linear","easingArgs":[]}]}}},{"uuid":"e8ba13f9-538b-5a86-af35-af51b7634ee6","name":"idle","loop":"loop","override":false,"length":0.12,"snapping":25,"selected":true,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"e997d144-259f-c084-afec-71d628f74e44":{"name":"Body","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"-0.2","z":"0"}],"uuid":"f6cb4d65-41ca-cbec-b17b-fc3cd849df17","time":0.12,"color":-1,"interpolation":"linear","easing":"linear","easingArgs":[]},{"channel":"position","data_points":[{"x":"0","y":"0","z":"0"}],"uuid":"f2e49355-efa3-8100-c43d-71cd3e1d535f","time":0,"color":-1,"interpolation":"linear","easing":"linear","easingArgs":[]}]}}}]} \ No newline at end of file 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 45cfb89d4..01f193fb3 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 @@ -127,6 +127,7 @@ fun addItemModels(provider: MatteryItemModelProvider) { provider.generated(MItems.BREAD_MONSTER_SPAWN_EGG, modLocation("item/egg/bread_monster")) provider.generated(MItems.LOADER_SPAWN_EGG, modLocation("item/egg/loader")) + provider.generated(MItems.CLEANER_DRONE_KIT, modLocation("item/egg/cleaner")) provider.generated(MItems.ANDROID_MELEE_SPAWN_EGG, modLocation("item/egg/android_melee")) provider.generatedTiered(MItems.BATTERIES, "battery_tier") 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 bb1c1590f..ad6f7ad5e 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 @@ -952,6 +952,9 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.LOADER_SPAWN_EGG, "Loader Spawn Egg") add(MEntityTypes.LOADER, "Loader") + add(MItems.CLEANER_DRONE_KIT, "Cleaner Drone Kit") + add(MEntityTypes.CLEANER, "Cleaner Drone") + add(MItems.ANDROID_MELEE_SPAWN_EGG, "Melee Android Spawn Egg") add(MEntityTypes.ANDROID_MELEE, "Melee Android") } 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 6d6bdfd21..21cbfbb87 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 @@ -945,6 +945,9 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.LOADER_SPAWN_EGG, "Яйцо призыва погрузчика") add(MEntityTypes.LOADER, "Погрузчик") + add(MItems.CLEANER_DRONE_KIT, "Набор Дрона-уборщика") + add(MEntityTypes.CLEANER, "Дрон-уборщик") + add(MItems.ANDROID_MELEE_SPAWN_EGG, "Яйцо призыва андроида ближнего боя") add(MEntityTypes.ANDROID_MELEE, "Андроид ближнего боя") } diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/animation/EnforcerAnimation.java b/src/main/java/ru/dbotthepony/mc/otm/client/animation/EnforcerAnimation.java new file mode 100644 index 000000000..9a5abd09d --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/client/animation/EnforcerAnimation.java @@ -0,0 +1,36 @@ +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 EnforcerAnimation { + public static final AnimationDefinition CHARGE = AnimationDefinition.Builder.withLength(0.0F).looping() + .addAnimation("root", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, -1.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("Body", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(7.5F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("leg_FL", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.3244F, 25.5371F, -4.9817F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("leg_FR", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(0.5426F, -23.0465F, 4.9996F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("leg_BR", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-0.3244F, 25.5371F, 4.9817F), AnimationChannel.Interpolations.LINEAR) + )) + .addAnimation("leg_BL", new AnimationChannel(AnimationChannel.Targets.ROTATION, + new Keyframe(0.0F, KeyframeAnimations.degreeVec(-0.3244F, -25.5371F, -4.9817F), AnimationChannel.Interpolations.LINEAR) + )) + .build(); + + public static final AnimationDefinition IDLE = AnimationDefinition.Builder.withLength(0.12F).looping() + .addAnimation("Body", new AnimationChannel(AnimationChannel.Targets.POSITION, + new Keyframe(0.0F, KeyframeAnimations.posVec(0.0F, 0.0F, 0.0F), AnimationChannel.Interpolations.LINEAR), + new Keyframe(0.12F, KeyframeAnimations.posVec(0.0F, -0.2F, 0.0F), AnimationChannel.Interpolations.LINEAR) + )) + .build(); +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/model/entity/EnforcerModel.java b/src/main/java/ru/dbotthepony/mc/otm/client/model/entity/EnforcerModel.java new file mode 100644 index 000000000..2f6f589cd --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/client/model/entity/EnforcerModel.java @@ -0,0 +1,128 @@ +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.EnforcerAnimation; +import ru.dbotthepony.mc.otm.client.animation.LoaderAnimation; +import ru.dbotthepony.mc.otm.entity.Enforcer; +import ru.dbotthepony.mc.otm.registry.MNames; + +import static ru.dbotthepony.mc.otm.OverdriveThatMatters.loc; + +public class EnforcerModel { + public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(loc(MNames.ENFORCER), "main"); + + private static HierarchicalModel model; + private static LayerDefinition def; + + public static HierarchicalModel getModel() { + if (def == null) { + def = createBodyLayer(); + } + + if (model == null) { + return model = new EnforcerHierarchicalModel<>(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, 25.0F, 0.0F)); + + PartDefinition cube_r1 = root.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(178, 168).addBox(0.0F, -18.5F, -1.0F, 0.0F, 19.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(8.0F, -41.5F, 8.0F, -0.1745F, 0.0F, 0.0F)); + + PartDefinition base = root.addOrReplaceChild("base", CubeListBuilder.create().texOffs(140, 104).addBox(-8.0F, -4.0F, -7.0F, 16.0F, 5.0F, 14.0F, new CubeDeformation(0.0F)) + .texOffs(92, 33).addBox(-5.0F, -2.0F, -10.0F, 10.0F, 14.0F, 20.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -22.0F, 0.0F)); + + PartDefinition Body = base.addOrReplaceChild("Body", CubeListBuilder.create().texOffs(80, 76).addBox(-11.0F, -17.4F, 10.9F, 22.0F, 14.0F, 14.0F, new CubeDeformation(0.0F)) + .texOffs(0, 0).addBox(-12.0F, -15.4F, -11.1F, 24.0F, 16.0F, 22.0F, new CubeDeformation(0.0F)) + .texOffs(0, 38).addBox(-12.0F, -15.4F, -11.1F, 24.0F, 16.0F, 22.0F, new CubeDeformation(0.5F)) + .texOffs(122, 168).addBox(12.0F, -13.4F, -6.1F, 2.0F, 12.0F, 12.0F, new CubeDeformation(0.0F)) + .texOffs(150, 168).addBox(-14.0F, -13.4F, -6.1F, 2.0F, 12.0F, 12.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -4.6F, 0.1F)); + + PartDefinition Head = Body.addOrReplaceChild("Head", CubeListBuilder.create().texOffs(92, 67).addBox(-4.0F, -3.0F, -1.0F, 7.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(-4.0F, 1.6F, -11.1F)); + + PartDefinition rocket = Body.addOrReplaceChild("rocket", CubeListBuilder.create().texOffs(0, 76).addBox(-12.0F, -10.5F, -14.0F, 12.0F, 21.0F, 28.0F, new CubeDeformation(0.0F)), PartPose.offset(-14.0F, -7.9F, -0.1F)); + + PartDefinition flamethrower = Body.addOrReplaceChild("flamethrower", CubeListBuilder.create().texOffs(44, 168).addBox(-0.25F, -5.2654F, -4.9728F, 10.0F, 10.0F, 10.0F, new CubeDeformation(0.0F)) + .texOffs(92, 0).addBox(2.75F, 1.7346F, -13.9728F, 10.0F, 10.0F, 23.0F, new CubeDeformation(0.0F)) + .texOffs(84, 168).addBox(4.75F, 3.7346F, -26.9728F, 6.0F, 6.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offset(14.25F, -7.1346F, -0.1272F)); + + PartDefinition cube_r2 = flamethrower.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(152, 33).addBox(-4.0F, -4.0F, 0.5F, 8.0F, 8.0F, 15.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(7.75F, 5.7346F, 6.5272F, 0.5236F, 0.0F, 0.0F)); + + PartDefinition leg_FL = root.addOrReplaceChild("leg_FL", CubeListBuilder.create().texOffs(158, 0).addBox(-4.5F, -5.5F, -9.5F, 9.0F, 11.0F, 13.0F, new CubeDeformation(0.0F)) + .texOffs(80, 104).addBox(-5.5F, -2.5F, -24.5F, 11.0F, 13.0F, 19.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(9.5F, -13.5F, -6.5F, 0.1047F, -0.5061F, -0.0349F)); + + PartDefinition leg_FR = root.addOrReplaceChild("leg_FR", CubeListBuilder.create().texOffs(0, 125).addBox(-5.5F, -2.5F, -24.5F, 11.0F, 13.0F, 19.0F, new CubeDeformation(0.0F)) + .texOffs(152, 80).addBox(-4.5F, -5.5F, -9.5F, 9.0F, 11.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-9.5F, -13.5F, -6.5F, 0.1047F, 0.5061F, 0.0349F)); + + PartDefinition leg_BL = root.addOrReplaceChild("leg_BL", CubeListBuilder.create().texOffs(60, 136).addBox(-5.5F, -2.1667F, 5.1667F, 11.0F, 13.0F, 19.0F, new CubeDeformation(0.0F)) + .texOffs(199, 24).addBox(-4.5F, -7.1667F, 13.1667F, 9.0F, 11.0F, 13.0F, new CubeDeformation(0.0F)) + .texOffs(0, 157).addBox(-4.5F, -5.1667F, -3.8333F, 9.0F, 11.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(9.5F, -13.8333F, 6.8333F, -0.1047F, 0.5061F, -0.0349F)); + + PartDefinition leg_BR = root.addOrReplaceChild("leg_BR", CubeListBuilder.create().texOffs(152, 56).addBox(-4.5F, -5.1667F, -3.1667F, 9.0F, 11.0F, 13.0F, new CubeDeformation(0.0F)) + .texOffs(120, 136).addBox(-5.5F, -2.1667F, 5.8333F, 11.0F, 13.0F, 19.0F, new CubeDeformation(0.0F)) + .texOffs(202, 0).addBox(-4.5F, -7.1667F, 13.8333F, 9.0F, 11.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-9.5F, -13.8333F, 6.1667F, -0.1047F, -0.5061F, 0.0349F)); + + model = null; + return def = LayerDefinition.create(meshdefinition, 256, 256); + } + + private static class EnforcerHierarchicalModel extends HierarchicalModel { + private final ModelPart root; + private final ModelPart base; + private final ModelPart Body; + private final ModelPart Head; + private final ModelPart rocket; + private final ModelPart flamethrower; + public EnforcerHierarchicalModel(ModelPart root) { + this.root = root.getChild("root"); + this.base = this.root.getChild("base"); + this.Body = this.base.getChild("Body"); + this.Head = this.Body.getChild("Head"); + this.rocket = this.Body.getChild("rocket"); + this.flamethrower = this.Body.getChild("flamethrower"); + } + + @Override + public void setupAnim(@NotNull T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + this.root().getAllParts().forEach(ModelPart::resetPose); + + this.Body.getChild("Head").xRot = headPitch * ((float) Math.PI / 180F); + this.base.getChild("Body").yRot = netHeadYaw * ((float) Math.PI / 180F); + + this.Body.getChild("rocket").xRot = headPitch * ((float) Math.PI / 180F); + this.Body.getChild("flamethrower").xRot = headPitch * ((float) Math.PI / 180F); + + + //this.animate(entity.getChargeState(), EnforcerAnimation.CHARGE, ageInTicks, 1.0F); + this.animateWalk(EnforcerAnimation.CHARGE, limbSwing, limbSwingAmount, 0.8F, 2.5F); + this.animate(entity.getIdleState(), EnforcerAnimation.IDLE, ageInTicks, 1.0F); + + } + + public ModelPart getHead() { + return this.Body.getChild("Head"); + } + + + @Override + public @NotNull ModelPart root() { + return this.root; + } + } + + public static void register(EntityRenderersEvent.RegisterLayerDefinitions event) { + event.registerLayerDefinition(LAYER_LOCATION, EnforcerModel::createBodyLayer); + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/EnforcerRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/EnforcerRenderer.kt new file mode 100644 index 000000000..6b8457111 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/EnforcerRenderer.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.EnforcerModel +import ru.dbotthepony.mc.otm.entity.Enforcer + +class EnforcerRenderer(context: EntityRendererProvider.Context) + : MobRenderer>(context, EnforcerModel.getModel(), 2.2f) { + override fun getTextureLocation(entity: Enforcer): ResourceLocation = TEXTURE_LOCATION + + companion object { + private val TEXTURE_LOCATION = loc("textures/entity/enforcer.png") + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/entity/Cleaner.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/Cleaner.kt index 73f0e1b69..a077fed83 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/entity/Cleaner.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/Cleaner.kt @@ -1,5 +1,7 @@ package ru.dbotthepony.mc.otm.entity +import net.minecraft.sounds.SoundEvent +import net.minecraft.sounds.SoundEvents import net.minecraft.world.InteractionHand import net.minecraft.world.InteractionResult import net.minecraft.world.entity.AnimationState @@ -7,6 +9,7 @@ import net.minecraft.world.entity.EntityType import net.minecraft.world.entity.LivingEntity import net.minecraft.world.entity.ai.attributes.AttributeSupplier import net.minecraft.world.entity.ai.attributes.Attributes +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal import net.minecraft.world.entity.ai.navigation.GroundPathNavigation import net.minecraft.world.entity.ai.navigation.PathNavigation @@ -21,6 +24,7 @@ class Cleaner(type: EntityType, level: Level) : Monster(type, level) { } override fun registerGoals() { + goalSelector.addGoal(8, RandomLookAroundGoal(this)) goalSelector.addGoal(7, WaterAvoidingRandomStrollGoal(this, 0.8)) } @@ -38,6 +42,14 @@ class Cleaner(type: EntityType, level: Level) : Monster(type, level) { return false } + override fun getHurtSound(damageSource: net.minecraft.world.damagesource.DamageSource): SoundEvent { + return SoundEvents.HEAVY_CORE_BREAK + } + + override fun getDeathSound(): SoundEvent { + return SoundEvents.VAULT_BREAK + } + override fun mobInteract(player: Player, hand: InteractionHand): InteractionResult { if (!this.level().isClientSide) { player.startRiding(this) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/entity/Enforcer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/Enforcer.kt new file mode 100644 index 000000000..ab284b5bf --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/Enforcer.kt @@ -0,0 +1,166 @@ +package ru.dbotthepony.mc.otm.entity + +import net.minecraft.sounds.SoundEvent +import net.minecraft.sounds.SoundEvents +import net.minecraft.sounds.SoundSource +import net.minecraft.util.Mth +import net.minecraft.world.phys.Vec3 +import net.minecraft.world.entity.AnimationState +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.ai.attributes.AttributeSupplier +import net.minecraft.world.entity.ai.attributes.Attributes +import net.minecraft.world.entity.ai.goal.* +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.* +import net.minecraft.world.entity.npc.Villager +import net.minecraft.world.entity.player.Player +import net.minecraft.world.level.Level +import ru.dbotthepony.mc.otm.registry.game.MSoundEvents + +class Enforcer(type: EntityType, level: Level) : Monster(type,level) { + val idleState = AnimationState() + val chargeState = AnimationState() + init { + idleState.start(tickCount) + } + + override fun registerGoals() { + goalSelector.addGoal(7, LookAtPlayerGoal(this, Player::class.java, 8f)) + goalSelector.addGoal(3, NearestAttackableTargetGoal(this, LivingEntity::class.java, 10, true, true) { entity -> + entity is Player || + entity is Villager || + entity is AbstractIllager || + entity is Zombie || + entity is AbstractSkeleton + }) + goalSelector.addGoal(2, RammingGoal(this)) + targetSelector.addGoal(1, HurtByTargetGoal(this)) + } + + override fun createNavigation(level: Level): PathNavigation = GroundPathNavigation(this, level) + + override fun isPushable(): Boolean { + return false + } + + override fun getHurtSound(damageSource: net.minecraft.world.damagesource.DamageSource): SoundEvent { + return SoundEvents.HEAVY_CORE_BREAK + } + + override fun getDeathSound(): SoundEvent { + return SoundEvents.VAULT_BREAK + } + + //charge attack, could possibly leave a smoke trail too idk + class RammingGoal(private val mob: Enforcer) : Goal() { + private var target: LivingEntity? = null + private var chargeTime = 0 + private val windupTime = 20 + private val maxChargeTime = 40 + private var chargeDir: Vec3? = null + private var cooldown = 0 + private val minCooldown = 20 + private val maxCooldown = 60 + private var isCharging = false + + override fun canUse(): Boolean { + if (cooldown > 0) { + cooldown-- + return false + } + + target = mob.target + return target != null + } + + override fun canContinueToUse(): Boolean { + return isCharging && chargeTime < maxChargeTime + } + + override fun start() { + mob.playSound(MSoundEvents.PLASMA_WEAPON_OVERHEAT, 1.0f, 1.0f) + chargeTime = 0 + mob.navigation.stop() + cooldown = minCooldown + mob.random.nextInt(maxCooldown - minCooldown) + isCharging = true + + mob.chargeState.start(mob.tickCount) + } + + override fun tick() { + if (!isCharging) return + + chargeTime++ + val target = mob.target ?: return + + if (chargeTime < windupTime) { + chargeDir = Vec3(target.x - mob.x, 0.0, target.z - mob.z).normalize() + + mob.lookControl.setLookAt(target, 30.0f, 30.0f) + return + } + + if (chargeTime == windupTime) { + if (chargeDir == null || chargeDir!!.length() < 0.1) { + stop() + return + } + mob.playSound(MSoundEvents.ANDROID_JUMP_BOOST, 1.0f, 1.0f) + } + + val dir = chargeDir ?: return + mob.yRot = (-Mth.atan2(dir.x, dir.z) * (180f / Math.PI)).toFloat() + mob.yHeadRot = mob.yRot + + mob.move(net.minecraft.world.entity.MoverType.SELF, dir.scale(1.2)) + + + if (mob.horizontalCollision) { + mob.level().playSound( + null, + mob.x, mob.y, mob.z, + SoundEvents.GENERIC_EXPLODE, + SoundSource.HOSTILE, + 1.0f, + 1.0f + ) + stop() + return + } + + if (mob.boundingBox.intersects(target.boundingBox)) { + val knockbackStrength = 1.5 + val knockback = dir.scale(knockbackStrength) + target.push(knockback.x, 0.5, knockback.z) + + val damageAmount = 6.0f + target.hurt(mob.damageSources().mobAttack(mob), damageAmount) + + stop() + } + } + + override fun stop() { + mob.setDeltaMovement(Vec3.ZERO) + chargeTime = 0 + chargeDir = null + isCharging = false + mob.chargeState.stop() + } + } + + companion object { + fun createAttributes() : AttributeSupplier.Builder { + return createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 300.0) + .add(Attributes.ARMOR, 10.0) + .add(Attributes.MOVEMENT_SPEED, 0.3) + .add(Attributes.STEP_HEIGHT, 1.0) + .add(Attributes.KNOCKBACK_RESISTANCE, 1.0) + } + } +} 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 ccec07410..f0da3cd6f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt @@ -208,6 +208,8 @@ object MNames { const val BREAD_MONSTER_SPAWN_EGG = "bead_monster_spawn_egg" const val LOADER_SPAWN_EGG = "loader_spawn_egg" + const val CLEANER_DRONE_KIT = "cleaner_drone_kit" + const val ANDROID_MELEE_SPAWN_EGG = "android_melee_spawn_egg" // items: crafting components @@ -340,6 +342,8 @@ object MNames { const val ANDROID_RANGED = "android_ranged" const val ANDROID_OVERSEER = "android_overseer" + const val ENFORCER = "enforcer" + const val PHANTOM_ATTRACTOR = "phantom_attractor" const val JUMP_BOOST = "jump_boost" const val ENDER_TELEPORTER = "ender_teleporter" 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 886909307..4317d8d44 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 @@ -16,6 +16,7 @@ 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.CleanerRenderer +import ru.dbotthepony.mc.otm.client.render.entity.EnforcerRenderer import ru.dbotthepony.mc.otm.client.render.entity.PlasmaProjectileRenderer import ru.dbotthepony.mc.otm.client.render.entity.RogueAndroidRenderer import ru.dbotthepony.mc.otm.entity.* @@ -77,6 +78,14 @@ object MEntityTypes { .build(MNames.ANDROID_MELEE) } + val ENFORCER: EntityType by registry.register(MNames.ENFORCER) { + EntityType.Builder.of(::Enforcer, MobCategory.MONSTER) + .sized(2.4f, 2.5f) + .eyeHeight(2.0f) + .passengerAttachments(2.5f) + .clientTrackingRange(12) + .build(MNames.ENFORCER) + } fun register(bus: IEventBus) { registry.register(bus) @@ -90,6 +99,8 @@ object MEntityTypes { event.put(ANDROID_MELEE, AndroidMelee.createAttributes().build()) + event.put(ENFORCER, Enforcer.createAttributes().build()) + event.put(CLEANER, Cleaner.createAttributes().build()) } @@ -108,6 +119,8 @@ object MEntityTypes { EntityRenderers.register(CLEANER, ::CleanerRenderer) + EntityRenderers.register(ENFORCER, ::EnforcerRenderer) + EntityRenderers.register(ANDROID_MELEE) { context -> RogueAndroidRenderer(context, ANDROID_MELEE, "melee",context.modelManager) } 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 20b270d35..72f3165e1 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 @@ -678,6 +678,9 @@ object MItems { 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 CLEANER_DRONE_KIT: Item by registry.register(MNames.CLEANER_DRONE_KIT){ SpawnEggItem(MEntityTypes.CLEANER, 0xFFFFFF, 0xFFFFFF, Item.Properties())} + val ANDROID_MELEE_SPAWN_EGG: Item by registry.register(MNames.ANDROID_MELEE_SPAWN_EGG){ SpawnEggItem(MEntityTypes.ANDROID_MELEE, 0xFFFFFF, 0xFFFFFF, Item.Properties())} val ROFLITE_ALLOY_INGOT: Item by registry.register(MNames.ROFLITE_ALLOY_INGOT) { Item(DEFAULT_PROPERTIES) } diff --git a/src/main/resources/assets/overdrive_that_matters/textures/entity/enforcer.png b/src/main/resources/assets/overdrive_that_matters/textures/entity/enforcer.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2f818d9c8c1aa7f6de83cee45e4899b25abfd3 GIT binary patch literal 5963 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 M>FVdQ&MBb@0Df(XYybcN literal 0 HcmV?d00001 diff --git a/src/main/resources/data/overdrive_that_matters/worldgen/structure/laboratory.json b/src/main/resources/data/overdrive_that_matters/worldgen/structure/laboratory.json index 68417512b..8f921d6ee 100644 --- a/src/main/resources/data/overdrive_that_matters/worldgen/structure/laboratory.json +++ b/src/main/resources/data/overdrive_that_matters/worldgen/structure/laboratory.json @@ -17,7 +17,14 @@ "spawn_overrides": { "ambient": { "bounding_box": "piece", - "spawns": [] + "spawns": [ + { + "type": "overdrive_that_matters:cleaner", + "maxCount": 1, + "minCount": 1, + "weight": 1 + } + ] }, "monster": { "bounding_box": "piece",