From d355c9dfc8006e5a8607d336767d03a5ab262abe Mon Sep 17 00:00:00 2001 From: cheaterpaul Date: Sat, 11 Nov 2023 23:01:18 +0100 Subject: [PATCH] fix hunter hat and hunter npc equipment remove custom hunter equipment layer --- dev_resources/models/hunter_hat_0.bbmodel | 1 + .../models/hunter_hat_0_item.bbmodel | 1 + dev_resources/models/hunter_hat_1.bbmodel | 1 + .../models/hunter_hat_1_item.bbmodel | 1 + .../api/entity/hunter/IAdvancedHunter.java | 18 +- .../entity/hunter/IVampirismCrossbowUser.java | 17 -- .../models/item/hunter_hat_head_0.json | 6 - .../models/item/hunter_hat_head_1.json | 6 - .../client/core/ModEntitiesRender.java | 5 +- .../client/model/BasicHunterModel.java | 42 ++- .../client/model/HunterEquipmentModel.java | 141 --------- .../client/model/HunterMinionModel.java | 41 ++- .../client/model/armor/HunterHatModel.java | 29 +- .../entity/AdvancedHunterRenderer.java | 7 +- .../renderer/entity/BasicHunterRenderer.java | 10 +- .../renderer/entity/DualBipedRenderer.java | 38 +++ .../renderer/entity/HunterMinionRenderer.java | 11 +- .../entity/HunterTaskMasterRenderer.java | 4 - .../entity/HunterTrainerRenderer.java | 7 +- .../entity/layers/HunterEquipmentLayer.java | 61 ---- .../vampirism/data/ItemModelGenerator.java | 2 - .../entity/hunter/AdvancedHunterEntity.java | 79 ++++- .../entity/hunter/BasicHunterEntity.java | 31 +- .../entity/hunter/HunterBaseEntity.java | 72 +++++ .../entity/hunter/HunterTrainerEntity.java | 12 +- .../client/HumanoidArmorLayerAccessor.java | 21 ++ .../models/item/hunter_hat_head_0.json | 274 ++++++++++++++++++ .../models/item/hunter_hat_head_1.json | 274 ++++++++++++++++++ .../vampirism/textures/item/hunter_hat_1.png | Bin 252 -> 0 bytes .../textures/item/hunter_hat_head_0.png | Bin 0 -> 5115 bytes .../textures/item/hunter_hat_head_1.png | Bin 0 -> 5286 bytes .../models/armor/hunter_hat_head_0.png | Bin 6589 -> 4888 bytes .../models/armor/hunter_hat_head_1.png | Bin 7331 -> 5071 bytes src/main/resources/supporters.json | 26 +- src/main/resources/vampirism.mixins.json | 1 + 35 files changed, 908 insertions(+), 331 deletions(-) create mode 100644 dev_resources/models/hunter_hat_0.bbmodel create mode 100644 dev_resources/models/hunter_hat_0_item.bbmodel create mode 100644 dev_resources/models/hunter_hat_1.bbmodel create mode 100644 dev_resources/models/hunter_hat_1_item.bbmodel delete mode 100644 src/generated/resources/assets/vampirism/models/item/hunter_hat_head_0.json delete mode 100644 src/generated/resources/assets/vampirism/models/item/hunter_hat_head_1.json delete mode 100644 src/main/java/de/teamlapen/vampirism/client/model/HunterEquipmentModel.java delete mode 100644 src/main/java/de/teamlapen/vampirism/client/renderer/entity/layers/HunterEquipmentLayer.java create mode 100644 src/main/java/de/teamlapen/vampirism/mixin/client/HumanoidArmorLayerAccessor.java create mode 100644 src/main/resources/assets/vampirism/models/item/hunter_hat_head_0.json create mode 100644 src/main/resources/assets/vampirism/models/item/hunter_hat_head_1.json create mode 100644 src/main/resources/assets/vampirism/textures/item/hunter_hat_head_0.png create mode 100644 src/main/resources/assets/vampirism/textures/item/hunter_hat_head_1.png diff --git a/dev_resources/models/hunter_hat_0.bbmodel b/dev_resources/models/hunter_hat_0.bbmodel new file mode 100644 index 0000000000..25acbc9076 --- /dev/null +++ b/dev_resources/models/hunter_hat_0.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.5","model_format":"modded_entity","box_uv":true},"name":"hunter_hat_0","model_identifier":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"base","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-6,7,-6],"to":[6,8,6],"autouv":0,"color":1,"origin":[0,7,0],"faces":{"north":{"uv":[12,12,24,13],"texture":0},"east":{"uv":[0,12,12,13],"texture":0},"south":{"uv":[36,12,48,13],"texture":0},"west":{"uv":[24,12,36,13],"texture":0},"up":{"uv":[24,12,12,0],"texture":0},"down":{"uv":[36,0,24,12],"texture":0}},"type":"cube","uuid":"a5c5cc8b-f51c-827d-22b3-71211579c36f"},{"name":"top","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-4,8,-4],"to":[4,13,4],"autouv":0,"color":1,"origin":[0,7,0],"uv_offset":[0,13],"faces":{"north":{"uv":[8,21,16,26],"texture":0},"east":{"uv":[0,21,8,26],"texture":0},"south":{"uv":[24,21,32,26],"texture":0},"west":{"uv":[16,21,24,26],"texture":0},"up":{"uv":[16,21,8,13],"texture":0},"down":{"uv":[24,13,16,21],"texture":0}},"type":"cube","uuid":"b939058b-dcac-b765-a176-dcee112ee0c8"}],"outliner":[{"name":"base","origin":[0,0,0],"color":0,"uuid":"a7333056-0cf6-b839-c6d1-ce42a9141e94","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["a5c5cc8b-f51c-827d-22b3-71211579c36f",{"name":"top","origin":[0,0,0],"color":0,"uuid":"39d3e81b-72d5-cca0-1e78-605018656aac","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["b939058b-dcac-b765-a176-dcee112ee0c8"]}]}],"textures":[{"path":"/home/paube/Desktop/hunter_hat_0.png","name":"hunter_hat_0.png","folder":"","namespace":"","id":"1","particle":false,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":false,"uuid":"f0c63af7-c93b-b9f6-525a-ba0f62c150db","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAJ6SURBVHhe7VnBSsNAELWIoaB40IKKUtGDJ///Mzx5qqBYFBXUgyhIPNRM8IXpsNlJXGi70+mlLTOb7HvzdualHWz0fO3tj2a0pCiGG8VWUa8uf8r6nX8vy++5K3fNf397HfTcUlJ675sRATvbuw3oEFCQ8fn1UW+O5z8/Pcxt+PDopCGP8leegGrDtQKu7+6jzF+enc7FiagKXHBNRWqtKHpVBPUuSooEet+MCCAwk8eX6H0vjg8aUDHwuAhIcAJcAYaOAJpf1yNA+dPpbe9judAeMB6fz2jsdWmCfCzK7i83TdOA8rMggMZV1yZIoDAOY1MA3iKLJvjfMUjrJAnU/QE+mzGIqsLdcSdIn+nMc/PTJz8bBUjrG/ouz3nMOiN34QTA23MZdgWDysMOw80RUMQ4CZIAxKSdDnV1unYoL9U6qyMH1peTQp8BUJsGo+Gmeo+UMZa6Vt0cxh6vHq/wWhCAiodIWCsCQuf5anITVaHZIwDUa0MAmiA1P/QAejdPAKYAzj+fAF0cYfZHgAjg4JvZ/fc7YPZNsK3C0szw722xNpVIY8XXL9r5yY49QIVxtnmC9PhtXiAEkB8V3jPk9VeCgFiFsGENPCeQN0pt/dIJoGcB7uF55aTHl/IJxbm8u8RTvXyyFeZ/dMzJU/yxwR+WQg8lIDH2gIMcvn7pBKQymPt69WEod4Da/p0AjSHrcVeA9Qpr+FwBGkPW464A6xXW8LkCNIasx10B1ius4XMFaAxZj7sCrFdYw+cK0BiyHncFWK+whs8VoDFkPe4KsF5hDZ8rQGPIetwVYL3CGj5XgMaQ9bgrwHqFNXyuAI0h63FXgPUKa/h+Ae/zxFCn6/JsAAAAAElFTkSuQmCC","relative_path":"../hunter_hat_0.png"}]} \ No newline at end of file diff --git a/dev_resources/models/hunter_hat_0_item.bbmodel b/dev_resources/models/hunter_hat_0_item.bbmodel new file mode 100644 index 0000000000..cf47ca3e58 --- /dev/null +++ b/dev_resources/models/hunter_hat_0_item.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"hunter_hat_1_item","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"bottom_small","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[2,0,2],"to":[14,1,14],"autouv":0,"color":1,"origin":[0,0,0],"faces":{"north":{"uv":[12,12,24,13],"texture":0},"east":{"uv":[0,12,12,13],"texture":0},"south":{"uv":[24,12,36,13],"texture":0},"west":{"uv":[36,12,48,13],"texture":0},"up":{"uv":[24,12,12,0],"texture":0},"down":{"uv":[36,0,24,12],"texture":0}},"type":"cube","uuid":"168e8025-007d-d132-488e-64e196f8710e"},{"name":"top_high","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[4,1,4],"to":[12,6,12],"autouv":0,"color":1,"origin":[0,0,0],"faces":{"north":{"uv":[8,21,16,26],"texture":0},"east":{"uv":[0,21,8,26],"texture":0},"south":{"uv":[24,21,32,26],"texture":0},"west":{"uv":[16,21,24,26],"texture":0},"up":{"uv":[16,21,8,13],"texture":0},"down":{"uv":[24,13,16,21],"texture":0}},"type":"cube","uuid":"1ed98f79-9839-2b20-5104-425390509ccc"}],"outliner":[{"name":"hunter_hat_0","origin":[0,0,0],"color":0,"uuid":"13b314d6-873a-af96-986f-936509614d7b","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["168e8025-007d-d132-488e-64e196f8710e","1ed98f79-9839-2b20-5104-425390509ccc"]}],"textures":[{"path":"/home/paube/Desktop/hunter_hat_head_0.png","name":"hunter_hat_head_0.png","folder":"","namespace":"","id":"0","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"e4cd367a-2bde-1b90-f496-913c948a39b3","relative_path":"../hunter_hat_head_0.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAJ6SURBVHhe7VnBSsNAELWIoaB40IKKUtGDJ///Mzx5qqBYFBXUgyhIPNRM8IXpsNlJXGi70+mlLTOb7HvzdualHWz0fO3tj2a0pCiGG8VWUa8uf8r6nX8vy++5K3fNf397HfTcUlJ675sRATvbuw3oEFCQ8fn1UW+O5z8/Pcxt+PDopCGP8leegGrDtQKu7+6jzF+enc7FiagKXHBNRWqtKHpVBPUuSooEet+MCCAwk8eX6H0vjg8aUDHwuAhIcAJcAYaOAJpf1yNA+dPpbe9judAeMB6fz2jsdWmCfCzK7i83TdOA8rMggMZV1yZIoDAOY1MA3iKLJvjfMUjrJAnU/QE+mzGIqsLdcSdIn+nMc/PTJz8bBUjrG/ouz3nMOiN34QTA23MZdgWDysMOw80RUMQ4CZIAxKSdDnV1unYoL9U6qyMH1peTQp8BUJsGo+Gmeo+UMZa6Vt0cxh6vHq/wWhCAiodIWCsCQuf5anITVaHZIwDUa0MAmiA1P/QAejdPAKYAzj+fAF0cYfZHgAjg4JvZ/fc7YPZNsK3C0szw722xNpVIY8XXL9r5yY49QIVxtnmC9PhtXiAEkB8V3jPk9VeCgFiFsGENPCeQN0pt/dIJoGcB7uF55aTHl/IJxbm8u8RTvXyyFeZ/dMzJU/yxwR+WQg8lIDH2gIMcvn7pBKQymPt69WEod4Da/p0AjSHrcVeA9Qpr+FwBGkPW464A6xXW8LkCNIasx10B1ius4XMFaAxZj7sCrFdYw+cK0BiyHncFWK+whs8VoDFkPe4KsF5hDZ8rQGPIetwVYL3CGj5XgMaQ9bgrwHqFNXyuAI0h63FXgPUKa/h+Ae/zxFCn6/JsAAAAAElFTkSuQmCC"}],"display":{"thirdperson_righthand":{"translation":[0,4,0],"scale":[0.5,0.5,0.5]},"thirdperson_lefthand":{"translation":[0,4,0],"scale":[0.5,0.5,0.5]},"firstperson_righthand":{"translation":[0,4,0],"scale":[0.75,0.75,0.75]},"firstperson_lefthand":{"translation":[0,4,0],"scale":[0.75,0.75,0.75]},"ground":{"translation":[0,5,0],"scale":[0.75,0.75,0.75]},"gui":{"rotation":[25,-51,0],"translation":[0,4.25,0],"scale":[0.7,0.7,0.7]},"head":{"translation":[0,18.5,0],"scale":[1.6,1.6,1.6]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-7],"scale":[0.75,0.75,0.75]}}} \ No newline at end of file diff --git a/dev_resources/models/hunter_hat_1.bbmodel b/dev_resources/models/hunter_hat_1.bbmodel new file mode 100644 index 0000000000..07e119eed0 --- /dev/null +++ b/dev_resources/models/hunter_hat_1.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.5","model_format":"modded_entity","box_uv":true},"name":"hunter_hat_1","model_identifier":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"base","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-8,7,-8],"to":[8,8,8],"autouv":0,"color":1,"origin":[0,7,0],"faces":{"north":{"uv":[16,16,32,17],"texture":0},"east":{"uv":[0,16,16,17],"texture":0},"south":{"uv":[48,16,64,17],"texture":0},"west":{"uv":[32,16,48,17],"texture":0},"up":{"uv":[32,16,16,0],"texture":0},"down":{"uv":[48,0,32,16],"texture":0}},"type":"cube","uuid":"716315f1-0c93-ce1a-736a-c05e21739eef"},{"name":"top","box_uv":true,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[-4,8,-4],"to":[4,11,4],"autouv":0,"color":1,"origin":[0,7,0],"uv_offset":[0,17],"faces":{"north":{"uv":[8,25,16,28],"texture":0},"east":{"uv":[0,25,8,28],"texture":0},"south":{"uv":[24,25,32,28],"texture":0},"west":{"uv":[16,25,24,28],"texture":0},"up":{"uv":[16,25,8,17],"texture":0},"down":{"uv":[24,17,16,25],"texture":0}},"type":"cube","uuid":"8b55e0c1-0d3b-df85-754b-b702a07f42a5"}],"outliner":[{"name":"base","origin":[0,0,0],"color":0,"uuid":"b0b4848d-0652-aa0a-12e0-772da01bd9fb","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["716315f1-0c93-ce1a-736a-c05e21739eef",{"name":"top","origin":[0,0,0],"color":0,"uuid":"3f8aa1c7-fa84-80ea-fdd5-2327cf4a689b","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["8b55e0c1-0d3b-df85-754b-b702a07f42a5"]}]}],"textures":[{"path":"/home/paube/Desktop/hunter_hat_1.png","name":"hunter_hat_1.png","folder":"block","namespace":"","id":"0","particle":false,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":false,"uuid":"92fbf913-7c64-178c-f12a-9a7de5180e2e","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAMPSURBVHhe7VnBShxBEN1FHASDhyhESVCSQ075/8/wlJOBiIuSBNSDGAiTQzI12Td5W/R0zdDKzJa1l3W3ume7Xr2qetUuF4Wv14dHf/CIqtpr/6x2q/b98efDQr7D5/p33X5f17+Sv6r3Y31u//3d7bLEhaLN8sMCAA4O59gRONGB1ICjgdDrBaDUMwUIBkUAng0AHCX5Ww7Hr1f7B/+i37CAHdTOYg+zpI8ZsmZyAI5P3v1PgXWEchRHFDmaSBsNmqZ2ilnfv10XsbhosxxQAGBnPl9eZVPy0/uzDbuApdkhC5rIbqxrUq37LOvBpMkZcHr6oWOARPDi5kcWgI9v37QO61Tg4qidxwMFBK4N8v3kDOAiKNEcAgA6A0AQQED/PucZhK6gNh1mcgCQAnBgCABtzjeHZ/qPBQD7Z5ECXLzGAgBKo3AOZQBYtFp9LapjRZtZB6D1WQBIEeROgNaIGjAEAGbPLABAFR9aBLkGAAzogXVvTxbSVCeYRQ3g0w5pg8j9MZ0AzjN4s+gCEEIp/c+ylSt+nzzWCpGB7VODkzNA2iCnACKkVV2K9sh73RZ1lHWa8OfJu4AehlISl4cfPeSgJeqJL6um1sZZzAK5cZhpj2rfNyektIEehzFe8zOKGaAdyNGNJWwqQpynnAKpcdfar1mjC2cfQ1Jn4LapU9PUATztdRJ0PfUJWOcXX7JsPdrbMX9jCN2fa415OBl2JBo6R8EUq+1tPQA87gIEVm/uAcC4q3v6i2MAclCng3sG6BQAAHh3XwS11EX+v7gUYP0+5g5w9l0gR/GNYUTdyetUSAGUuwHG+tJhplQfLKHlc9fUUIB6DSRp3z9CcnZcoJRK2ScBgC8ZWQrrh/dNeryfLzb0OJuyTQ5AKYLbvt+UwtvuoHX+AMBCyLs9GOA9wpZ/wQALIe/2YID3CFv+BQMshLzbgwHeI2z5FwywEPJuDwZ4j7DlXzDAQsi7PRjgPcKWf8EACyHv9mCA9whb/gUDLIS824MB3iNs+RcMsBDybg8GeI+w5V8wwELIu/0vwguGl+5p8ToAAAAASUVORK5CYII=","relative_path":"../hunter_hat_1.png"}]} \ No newline at end of file diff --git a/dev_resources/models/hunter_hat_1_item.bbmodel b/dev_resources/models/hunter_hat_1_item.bbmodel new file mode 100644 index 0000000000..45cfc5b150 --- /dev/null +++ b/dev_resources/models/hunter_hat_1_item.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"hunter_hat_1_item","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"bottom_big","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[0,0,0],"to":[16,1,16],"autouv":0,"color":1,"origin":[0,0,0],"faces":{"north":{"uv":[16,16,32,17],"texture":0},"east":{"uv":[0,16,16,17],"texture":0},"south":{"uv":[48,16,64,17],"texture":0},"west":{"uv":[32,16,48,17],"texture":0},"up":{"uv":[32,16,16,0],"texture":0},"down":{"uv":[48,0,32,16],"texture":0}},"type":"cube","uuid":"ef45cd03-4364-32dd-cb30-d3074cb1846e"},{"name":"top_flat","box_uv":false,"rescale":false,"locked":false,"render_order":"default","allow_mirror_modeling":true,"from":[4,1,4],"to":[12,4,12],"autouv":0,"color":1,"origin":[0,0,0],"faces":{"north":{"uv":[8,25,16,28],"texture":0},"east":{"uv":[0,25,8,28],"texture":0},"south":{"uv":[24,25,32,28],"texture":0},"west":{"uv":[16,25,24,28],"texture":0},"up":{"uv":[16,25,8,17],"texture":0},"down":{"uv":[24,17,16,25],"texture":0}},"type":"cube","uuid":"b13156a6-9345-745a-7baa-330ba90113f9"}],"outliner":[{"name":"hunter_hat_1","origin":[0,0,0],"color":0,"uuid":"593ddaed-7548-079c-92b7-b3929ad0444e","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["ef45cd03-4364-32dd-cb30-d3074cb1846e","b13156a6-9345-745a-7baa-330ba90113f9"]}],"textures":[{"path":"/home/paube/Projects/Minecraft/Vampirism/1.20/src/main/resources/assets/vampirism/textures/models/armor/hunter_hat_head_1.png","name":"hunter_hat_head_1.png","folder":"models/armor","namespace":"vampirism","id":"0","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"a9929aea-1461-97ee-dcf6-46d76bd13be4","relative_path":"../../Projects/Minecraft/Vampirism/1.20/src/main/resources/assets/vampirism/textures/models/armor/hunter_hat_head_1.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAAAMOSURBVHhe7Vk9S0RBDPQKD0GxUAsFsfD//yYLEbRQC1GQs9DL8805hrzdlSW+cJdrvI/dfclkkkzWxV7n6+T07BNHLJcHw9vl/nL4+/r2siff4fPqYzV8v1q9m0/V+7G+tP/56XHR40LXZnmwAADD4Rw7Aic2IK3B0UDo9QKQdaYAwaAIwGEA4CjJezGOX0eHx9/RX7OAHdTOYg+zZIoZsmZ2AM4vLn9SYIxQieKIIkcTaaNB09S2mPVwf9fF4q7NYqAAwM7UDGLAkDKaHfL9OrK//F+n2uazrAeTZmfA1dX1hgEtOSk1gx3QuW45D88FBF4v39cArxXIbgZwEWzJSawHa2SPAAL668hrB5gJAsbsACAFyIEiqGibYjycR8ssRZ9ZMNSMcX+IFODiVTNIAwBKo3C2MgD64vb2povFXZtZB6D11QDgomkJnBYAmD0hAEAVby2CiJ5Ucq4FRGuzdlmdIEQNYGtrBgkDkPtaFKEtltoggxeiC6CvW/qfZSucRQtk0DQLGAism1KDNcD/pQ1yCiBCWtVZtIej/Buksdb9zBYGrFZz/gUAFieWxOXhxxI+1sRYMxzghQCgRFPu9YjilHNaG+hxGOM1zxrdAOh5XuejVmwlJzhPOQWscdcCwRp2kBK6cJZAHIQSTaQMrE7Nqg7QwwsORwvr7cMtVPdcUwVAhh04O+TdeKsDZvRWYU/nWs6uAmApNwZi6wHAuKsjv3MMAJ10Omw9A3QKsH4XFmx9EdRSF/m/cynA19t/uQNsqcRzrlmUKG4NLFoHcEpsFOF4O1y6AQagc9eQhb6jYyegmjDBaZ0PSTr1j5DS760XKN7sGABgLc/SVz98atLj/SxdfzFovMODLMVvvVq+F6CqEOp9QPT9CUD0CHnblwzwRjj6+cmA6BHyti8Z4I1w9POTAdEj5G1fMsAb4ejnJwOiR8jbvmSAN8LRz08GRI+Qt33JAG+Eo5+fDIgeIW/7kgHeCEc/PxkQPULe9iUDvBGOfn4yIHqEvO1LBngjHP38ZED0CHnbt/MM+AJAeI6X4stu5AAAAABJRU5ErkJggg=="}],"display":{"thirdperson_righthand":{"translation":[0,4,0],"scale":[0.5,0.5,0.5]},"thirdperson_lefthand":{"translation":[0,4,0],"scale":[0.5,0.5,0.5]},"firstperson_righthand":{"translation":[0,4,0],"scale":[0.75,0.75,0.75]},"firstperson_lefthand":{"translation":[0,4,0],"scale":[0.75,0.75,0.75]},"ground":{"translation":[0,5,0],"scale":[0.75,0.75,0.75]},"gui":{"rotation":[25,-51,0],"translation":[0,4.25,0],"scale":[0.7,0.7,0.7]},"head":{"translation":[0,18.5,0],"scale":[1.6,1.6,1.6]},"fixed":{"rotation":[-90,0,0],"translation":[0,0,-7],"scale":[0.75,0.75,0.75]}}} \ No newline at end of file diff --git a/src/api/java/de/teamlapen/vampirism/api/entity/hunter/IAdvancedHunter.java b/src/api/java/de/teamlapen/vampirism/api/entity/hunter/IAdvancedHunter.java index d80518148f..b624d0cafa 100755 --- a/src/api/java/de/teamlapen/vampirism/api/entity/hunter/IAdvancedHunter.java +++ b/src/api/java/de/teamlapen/vampirism/api/entity/hunter/IAdvancedHunter.java @@ -13,27 +13,17 @@ public interface IAdvancedHunter extends IHunterMob, IAdjustableLevel, IVillageC /** * The type integer declares multiple things about the hunter. This the different values are stored in the different bits of the integer. *
- * - Bits 0-1 are used for the hunter hat
- * - Bits 2-3 are used for the hunter hat
- * - bit 4 defines if the hunter has a cloak
- * - bits 5-13 are used for the hunter body texture
+ * - bit 0 defines if the hunter has a cloak
+ * - bits 1-9 are used for the hunter body texture
*/ int getHunterType(); - default int getHatType() { - return this.getHunterType() & 0b11; - } - - default int getEquipmentType() { - return this.getHunterType() >> 2 & 0b11; - } - default boolean hasCloak() { - return (this.getHunterType() >> 4 & 0b1) == 1; + return (this.getHunterType() & 0b1) == 1; } default int getBodyTexture() { - return this.getHunterType() >> 5 & 0b11111111; + return this.getHunterType() >> 1 & 0b11111111; } @Nullable diff --git a/src/api/java/de/teamlapen/vampirism/api/entity/hunter/IVampirismCrossbowUser.java b/src/api/java/de/teamlapen/vampirism/api/entity/hunter/IVampirismCrossbowUser.java index 38ba568736..e6e5b572c7 100644 --- a/src/api/java/de/teamlapen/vampirism/api/entity/hunter/IVampirismCrossbowUser.java +++ b/src/api/java/de/teamlapen/vampirism/api/entity/hunter/IVampirismCrossbowUser.java @@ -23,23 +23,6 @@ default boolean canUseCrossbow(ItemStack stack){ return true; } - /** - * current crossbow arm pose to use for rendering - */ - default ArmPose getArmPose() { - if (isHoldingCrossbow()) { - if (isChargingCrossbow()) { - return ArmPose.CROSSBOW_CHARGE; - } - InteractionHand hand = ProjectileUtil.getWeaponHoldingHand(((LivingEntity) this), IVampirismCrossbow.class::isInstance); - ItemStack itemstack = ((LivingEntity) this).getItemInHand(hand); - if (itemstack.getItem() instanceof IVampirismCrossbow && CrossbowItem.isCharged(itemstack)) { - return ArmPose.CROSSBOW_HOLD; - } - } - return ArmPose.NEUTRAL; - } - @Override default void performCrossbowAttack(@Nonnull LivingEntity entity, float speed) { InteractionHand hand = ProjectileUtil.getWeaponHoldingHand(entity, IVampirismCrossbow.class::isInstance); diff --git a/src/generated/resources/assets/vampirism/models/item/hunter_hat_head_0.json b/src/generated/resources/assets/vampirism/models/item/hunter_hat_head_0.json deleted file mode 100644 index 5f28e37a93..0000000000 --- a/src/generated/resources/assets/vampirism/models/item/hunter_hat_head_0.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "vampirism:item/hunter_hat_0" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/vampirism/models/item/hunter_hat_head_1.json b/src/generated/resources/assets/vampirism/models/item/hunter_hat_head_1.json deleted file mode 100644 index 36bf44b3e5..0000000000 --- a/src/generated/resources/assets/vampirism/models/item/hunter_hat_head_1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "vampirism:item/hunter_hat_1" - } -} \ No newline at end of file diff --git a/src/main/java/de/teamlapen/vampirism/client/core/ModEntitiesRender.java b/src/main/java/de/teamlapen/vampirism/client/core/ModEntitiesRender.java index f46a58c6fd..c95ed5c1ab 100755 --- a/src/main/java/de/teamlapen/vampirism/client/core/ModEntitiesRender.java +++ b/src/main/java/de/teamlapen/vampirism/client/core/ModEntitiesRender.java @@ -115,9 +115,8 @@ static void onRegisterLayers(EntityRenderersEvent.@NotNull RegisterLayerDefiniti event.registerLayerDefinition(CLOTHING_CROWN, ClothingCrownModel::createLayer); event.registerLayerDefinition(CLOTHING_PANTS, ClothingPantsModel::createLayer); event.registerLayerDefinition(CLOTHING_HAT, VampireHatModel::createLayer); - event.registerLayerDefinition(HUNTER_HAT0, () -> HunterHatModel.createLayer(0, 0)); - event.registerLayerDefinition(HUNTER_HAT1, () -> HunterHatModel.createLayer(0, 1)); - event.registerLayerDefinition(HUNTER_EQUIPMENT, HunterEquipmentModel::createLayer); + event.registerLayerDefinition(HUNTER_HAT0, HunterHatModel::createHat0Layer); + event.registerLayerDefinition(HUNTER_HAT1, HunterHatModel::createHat1Layer); event.registerLayerDefinition(VILLAGER_WITH_ARMS, () -> VillagerWithArmsModel.createLayer(0)); event.registerLayerDefinition(GENERIC_BIPED, () -> LayerDefinition.create(PlayerModel.createMesh(CubeDeformation.NONE, false), 64, 64)); event.registerLayerDefinition(GENERIC_BIPED_SLIM, () -> LayerDefinition.create(PlayerModel.createMesh(CubeDeformation.NONE, true), 64, 64)); diff --git a/src/main/java/de/teamlapen/vampirism/client/model/BasicHunterModel.java b/src/main/java/de/teamlapen/vampirism/client/model/BasicHunterModel.java index 57f61e0bb5..a3382947eb 100644 --- a/src/main/java/de/teamlapen/vampirism/client/model/BasicHunterModel.java +++ b/src/main/java/de/teamlapen/vampirism/client/model/BasicHunterModel.java @@ -1,10 +1,14 @@ package de.teamlapen.vampirism.client.model; -import de.teamlapen.vampirism.api.entity.hunter.IVampirismCrossbowUser; -import net.minecraft.client.model.AnimationUtils; +import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.CrossbowItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.UseAnim; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.jetbrains.annotations.NotNull; @@ -27,15 +31,39 @@ public BasicHunterModel(ModelPart part, boolean smallArms) { super(part, smallArms); } - @Override public void setupAnim(@NotNull T entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { super.setupAnim(entityIn, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); - if (entityIn instanceof IVampirismCrossbowUser) { - switch (((IVampirismCrossbowUser) entityIn).getArmPose()) { - case CROSSBOW_HOLD -> AnimationUtils.animateCrossbowHold(this.rightArm, this.leftArm, this.head, true); - case CROSSBOW_CHARGE -> AnimationUtils.animateCrossbowCharge(this.rightArm, this.leftArm, entityIn, true); + HumanoidModel.ArmPose mainPose = getArmPose(entityIn, InteractionHand.MAIN_HAND); + HumanoidModel.ArmPose offPose = getArmPose(entityIn, InteractionHand.OFF_HAND); + if (entityIn.getMainArm() == HumanoidArm.RIGHT) { + this.rightArmPose = mainPose; + this.leftArmPose = offPose; + } + if (entityIn.getMainArm() == HumanoidArm.LEFT) { + this.rightArmPose = offPose; + this.leftArmPose = mainPose; + } + } + + private static HumanoidModel.ArmPose getArmPose(LivingEntity entity, InteractionHand pHand) { + ItemStack itemstack = entity.getItemInHand(pHand); + if (itemstack.isEmpty()) { + return HumanoidModel.ArmPose.EMPTY; + } else { + if (entity.getUsedItemHand() == pHand && entity.getUseItemRemainingTicks() > 0) { + UseAnim useanim = itemstack.getUseAnimation(); + if (useanim == UseAnim.CROSSBOW && pHand == entity.getUsedItemHand()) { + return HumanoidModel.ArmPose.CROSSBOW_CHARGE; + } + } else if (!entity.swinging && itemstack.getItem() instanceof CrossbowItem && CrossbowItem.isCharged(itemstack)) { + return HumanoidModel.ArmPose.CROSSBOW_HOLD; } + + HumanoidModel.ArmPose forgeArmPose = net.minecraftforge.client.extensions.common.IClientItemExtensions.of(itemstack).getArmPose(entity, pHand, itemstack); + if (forgeArmPose != null) return forgeArmPose; + + return HumanoidModel.ArmPose.ITEM; } } } diff --git a/src/main/java/de/teamlapen/vampirism/client/model/HunterEquipmentModel.java b/src/main/java/de/teamlapen/vampirism/client/model/HunterEquipmentModel.java deleted file mode 100644 index 961256f9b6..0000000000 --- a/src/main/java/de/teamlapen/vampirism/client/model/HunterEquipmentModel.java +++ /dev/null @@ -1,141 +0,0 @@ -package de.teamlapen.vampirism.client.model; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.model.geom.PartPose; -import net.minecraft.client.model.geom.builders.*; -import net.minecraft.world.entity.Mob; -import org.jetbrains.annotations.NotNull; - -public class HunterEquipmentModel extends HumanoidModel { - - private final static String HAT_TOP = "hat_top"; - private final static String HAT_RIM = "hat_rim"; - private final static String AXE_SHAFT = "axe_shaft"; - private final static String AXE_BLADE1 = "axe_blade1"; - private static final String AXE_BLADE2 = "axe_blade2"; - private static final String STAKE_LEFT = "stake_left"; - private static final String STAKE_RIGHT = "stake_right"; - private static final String HAT_TOP2 = "hat_top2"; - private static final String HAT_RIM2 = "hat_rim2"; - private static final String HAT_RIM3 = "hat_rim3"; - - private final @NotNull ModelPart hatTop; - private final @NotNull ModelPart hatRim; - private final @NotNull ModelPart axeShaft; - private final @NotNull ModelPart axeBlade1; - private final @NotNull ModelPart axeBlade2; - private final @NotNull ModelPart stake; - private final @NotNull ModelPart stakeRight; - private final @NotNull ModelPart hatTop2; - private final @NotNull ModelPart hatRim2; - private final @NotNull ModelPart hatRim3; - - public static @NotNull LayerDefinition createLayer() { - float offset = 0f; - PartPose headPose = PartPose.offset(0, offset, 0); - PartPose rightArmPose = PartPose.offset(-5.0F, 2.0F + offset, 0.0F); - PartPose leftArmPose = PartPose.offset(5.0F, 2.0F + offset, 0.0F); - MeshDefinition mesh = HumanoidModel.createMesh(CubeDeformation.NONE, offset); - - PartDefinition part = mesh.getRoot(); - part.addOrReplaceChild(HAT_TOP2, CubeListBuilder.create().texOffs(0, 31).mirror().addBox(-4.5f, -12, -4.5f, 9, 3, 9), headPose); - part.addOrReplaceChild(HAT_RIM2, CubeListBuilder.create().texOffs(0, 31).mirror().addBox(-8F, -9F, -8F, 16, 1, 16), headPose); - part.addOrReplaceChild(HAT_RIM3, CubeListBuilder.create().texOffs(0, 37).mirror().addBox(-5F, -6F, -5F, 10, 1, 10), headPose); - part.addOrReplaceChild(HAT_TOP, CubeListBuilder.create().texOffs(0, 31).mirror().addBox(-4F, -14F, -4F, 8, 5, 8), headPose); - part.addOrReplaceChild(HAT_RIM, CubeListBuilder.create().texOffs(0, 35).mirror().addBox(-6F, -9F, -6F, 12, 1, 12), headPose); - part.addOrReplaceChild(AXE_SHAFT, CubeListBuilder.create().texOffs(16, 48).mirror().addBox(-2F, 8F, -17F, 1, 1, 15), rightArmPose); - part.addOrReplaceChild(AXE_BLADE1, CubeListBuilder.create().texOffs(0, 53).mirror().addBox(-2F, 4F, -16F, 1, 4, 7), rightArmPose); - part.addOrReplaceChild(AXE_BLADE2, CubeListBuilder.create().texOffs(0, 53).mirror().addBox(-2F, 9F, -16F, 1, 4, 7), rightArmPose); - part.addOrReplaceChild(STAKE_LEFT, CubeListBuilder.create().texOffs(16, 48).mirror().addBox(1F, 8F, -8F, 1, 1, 6), leftArmPose); - part.addOrReplaceChild(STAKE_RIGHT, CubeListBuilder.create().texOffs(16, 48).mirror().addBox(-2F, 8F, -8, 1, 1, 6), rightArmPose); - return LayerDefinition.create(mesh, 64, 64); - } - - public HunterEquipmentModel(@NotNull ModelPart part) { - super(part); - hatTop = part.getChild(HAT_TOP); - hatTop2 = part.getChild(HAT_TOP2); - hatRim = part.getChild(HAT_RIM); - hatRim2 = part.getChild(HAT_RIM2); - hatRim3 = part.getChild(HAT_RIM3); - axeShaft = part.getChild(AXE_SHAFT); - axeBlade1 = part.getChild(AXE_BLADE1); - axeBlade2 = part.getChild(AXE_BLADE2); - stake = part.getChild(STAKE_LEFT); - stakeRight = part.getChild(STAKE_RIGHT); - - super.setAllVisible(false); - } - - public void setHat(HatType hatType) { - hatTop.visible = hatRim.visible = hatType == HatType.HAT1; - hatTop2.visible = hatRim2.visible = hatType == HatType.HAT2; - hatRim3.visible = hatType == HatType.RIM_ONLY; - - } - - public void setWeapons(StakeType type) { - stakeRight.visible = type == StakeType.ONLY; - boolean axe = type == StakeType.FULL || type == StakeType.AXE_ONLY; - axeBlade1.visible = axeBlade2.visible = axeShaft.visible = axe; - stake.visible = type == StakeType.FULL; - } - - @Override - public void setupAnim(@NotNull T entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { - super.setupAnim(entityIn, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); - hatRim.copyFrom(this.head); - hatTop.copyFrom(this.head); - hatRim2.copyFrom(this.head); - hatTop2.copyFrom(this.head); - hatRim3.copyFrom(this.head); - - axeShaft.copyFrom(this.rightArm); - axeBlade1.copyFrom(this.rightArm); - axeBlade2.copyFrom(this.rightArm); - stake.copyFrom(this.leftArm); - stakeRight.copyFrom(this.rightArm); - } - - @NotNull - @Override - protected Iterable bodyParts() { - return Iterables.concat(super.bodyParts(), ImmutableList.of(this.axeBlade1, this.axeBlade2, this.axeShaft, this.stake, this.stakeRight)); - } - - @NotNull - @Override - protected Iterable headParts() { - return Iterables.concat(super.headParts(), ImmutableList.of(this.hatRim, this.hatRim2, this.hatRim3, this.hatTop, this.hatTop2)); - } - - - public enum StakeType { - NONE, ONLY, FULL, AXE_ONLY; - - public static @NotNull StakeType from(int id) { - return switch (id) { - case 0 -> ONLY; - case 1 -> FULL; - case 2 -> AXE_ONLY; - default -> NONE; - }; - } - } - - public enum HatType { - NONE, RIM_ONLY /*>=2*/, HAT1 /*-1/0*/, HAT2 /*1*/; - - public static @NotNull HatType from(int id) { - return switch (id) { - case 0 -> HAT1; - case 1 -> HAT2; - case 2 -> RIM_ONLY; - default -> NONE; - }; - } - } -} diff --git a/src/main/java/de/teamlapen/vampirism/client/model/HunterMinionModel.java b/src/main/java/de/teamlapen/vampirism/client/model/HunterMinionModel.java index f8d95a8d4a..fffe6c8e74 100644 --- a/src/main/java/de/teamlapen/vampirism/client/model/HunterMinionModel.java +++ b/src/main/java/de/teamlapen/vampirism/client/model/HunterMinionModel.java @@ -2,8 +2,14 @@ import de.teamlapen.vampirism.client.renderer.entity.layers.PlayerBodyOverlayLayer; import de.teamlapen.vampirism.entity.minion.HunterMinionEntity; -import net.minecraft.client.model.AnimationUtils; +import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.CrossbowItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.UseAnim; public class HunterMinionModel extends PlayerBodyOverlayLayer.VisibilityPlayerModel { @@ -14,9 +20,36 @@ public HunterMinionModel(ModelPart p_170821_, boolean p_170822_) { @Override public void setupAnim(T entity, float p_225597_2_, float p_225597_3_, float p_225597_4_, float p_225597_5_, float p_225597_6_) { super.setupAnim(entity, p_225597_2_, p_225597_3_, p_225597_4_, p_225597_5_, p_225597_6_); - switch (entity.getArmPose()) { - case CROSSBOW_HOLD -> AnimationUtils.animateCrossbowHold(this.rightArm, this.leftArm, this.head, true); - case CROSSBOW_CHARGE -> AnimationUtils.animateCrossbowCharge(this.rightArm, this.leftArm, entity, true); + HumanoidModel.ArmPose mainPose = getArmPose(entity, InteractionHand.MAIN_HAND); + HumanoidModel.ArmPose offPose = getArmPose(entity, InteractionHand.OFF_HAND); + if (entity.getMainArm() == HumanoidArm.RIGHT) { + this.rightArmPose = mainPose; + this.leftArmPose = offPose; + } + if (entity.getMainArm() == HumanoidArm.LEFT) { + this.rightArmPose = offPose; + this.leftArmPose = mainPose; + } + } + + private static HumanoidModel.ArmPose getArmPose(LivingEntity entity, InteractionHand pHand) { + ItemStack itemstack = entity.getItemInHand(pHand); + if (itemstack.isEmpty()) { + return HumanoidModel.ArmPose.EMPTY; + } else { + if (entity.getUsedItemHand() == pHand && entity.getUseItemRemainingTicks() > 0) { + UseAnim useanim = itemstack.getUseAnimation(); + if (useanim == UseAnim.CROSSBOW && pHand == entity.getUsedItemHand()) { + return HumanoidModel.ArmPose.CROSSBOW_CHARGE; + } + } else if (!entity.swinging && itemstack.getItem() instanceof CrossbowItem && CrossbowItem.isCharged(itemstack)) { + return HumanoidModel.ArmPose.CROSSBOW_HOLD; + } + + HumanoidModel.ArmPose forgeArmPose = net.minecraftforge.client.extensions.common.IClientItemExtensions.of(itemstack).getArmPose(entity, pHand, itemstack); + if (forgeArmPose != null) return forgeArmPose; + + return HumanoidModel.ArmPose.ITEM; } } } diff --git a/src/main/java/de/teamlapen/vampirism/client/model/armor/HunterHatModel.java b/src/main/java/de/teamlapen/vampirism/client/model/armor/HunterHatModel.java index 044ecd1f18..f829370371 100644 --- a/src/main/java/de/teamlapen/vampirism/client/model/armor/HunterHatModel.java +++ b/src/main/java/de/teamlapen/vampirism/client/model/armor/HunterHatModel.java @@ -19,25 +19,27 @@ public class HunterHatModel extends VampirismArmorModel { private static final String HAT_TOP = "hat_top"; - private static final String HAT_RIM = "hat_rim"; + private static final String HAT_BASE = "hat_top"; - public static @NotNull LayerDefinition createLayer(float p_170683_, int type) { + public static @NotNull LayerDefinition createHat0Layer() { MeshDefinition mesh = new MeshDefinition(); PartDefinition part = mesh.getRoot(); - if (type == 1) { - part.addOrReplaceChild(HAT_TOP, CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, -14.0F, -4.0F, 8.0F, 5.0F, 8.0F), PartPose.offset(0, p_170683_, 0)); - part.addOrReplaceChild(HAT_RIM, CubeListBuilder.create().texOffs(0, 13).addBox(-6.0F, -9.0F, -6.0F, 12.0F, 1.0F, 12.0F), PartPose.offset(0, p_170683_, 0)); - } else { - part.addOrReplaceChild(HAT_TOP, CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, -12.0F, -4.0F, 8.0F, 3.0F, 8.0F), PartPose.offset(0.0F, p_170683_, 0.0F)); - part.addOrReplaceChild(HAT_RIM, CubeListBuilder.create().texOffs(0, 17).addBox(-8.0F, -9.0F, -8.0F, 16.0F, 1.0F, 16.0F), PartPose.offset(0.0F, p_170683_, 0.0F)); - } + PartDefinition base = part.addOrReplaceChild(HAT_BASE, CubeListBuilder.create().texOffs(0, 0).addBox(-6.0F, -9.0F, -6.0F, 12.0F, 1.0F, 12.0F), PartPose.ZERO); + PartDefinition top = base.addOrReplaceChild(HAT_TOP, CubeListBuilder.create().texOffs(0, 13).addBox(-4.0F, -14.0F, -4.0F, 8.0F, 5.0F, 8.0F), PartPose.ZERO); + return LayerDefinition.create(mesh, 64, 64); + } + + public static @NotNull LayerDefinition createHat1Layer() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition part = mesh.getRoot(); + PartDefinition base = part.addOrReplaceChild(HAT_BASE, CubeListBuilder.create().texOffs(0, 0).addBox(-8.0F, -9.0F, -8.0F, 16.0F, 1.0F, 16.0F), PartPose.ZERO); + PartDefinition top = base.addOrReplaceChild(HAT_TOP, CubeListBuilder.create().texOffs(0, 17).addBox(-4.0F, -12.0F, -4.0F, 8.0F, 3.0F, 8.0F), PartPose.ZERO); return LayerDefinition.create(mesh, 64, 64); } private static HunterHatModel hat0; private static HunterHatModel hat1; - private final @NotNull ModelPart hatTop; - private final @NotNull ModelPart hatRim; + private final @NotNull ModelPart hatBase; public static HunterHatModel getAdjustedInstance0(HumanoidModel wearerModel) { if (hat0 == null) { @@ -58,13 +60,12 @@ public static HunterHatModel getAdjustedInstance1(HumanoidModel wearerModel) public HunterHatModel(@NotNull ModelPart part) { super(); - this.hatTop = part.getChild(HAT_TOP); - this.hatRim = part.getChild(HAT_RIM); + this.hatBase = part.getChild(HAT_BASE); } @Override protected @NotNull Iterable getHeadModels() { - return ImmutableList.of(hatTop, hatRim); + return ImmutableList.of(hatBase); } } diff --git a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/AdvancedHunterRenderer.java b/src/main/java/de/teamlapen/vampirism/client/renderer/entity/AdvancedHunterRenderer.java index e9c8c4f624..45e97bd3d2 100644 --- a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/AdvancedHunterRenderer.java +++ b/src/main/java/de/teamlapen/vampirism/client/renderer/entity/AdvancedHunterRenderer.java @@ -5,12 +5,13 @@ import de.teamlapen.vampirism.api.entity.hunter.IAdvancedHunter; import de.teamlapen.vampirism.client.core.ModEntitiesRender; import de.teamlapen.vampirism.client.model.BasicHunterModel; -import de.teamlapen.vampirism.client.model.HunterEquipmentModel; import de.teamlapen.vampirism.client.renderer.entity.layers.CloakLayer; -import de.teamlapen.vampirism.client.renderer.entity.layers.HunterEquipmentLayer; import de.teamlapen.vampirism.client.renderer.entity.layers.PlayerFaceOverlayLayer; import de.teamlapen.vampirism.config.VampirismConfig; import de.teamlapen.vampirism.entity.hunter.AdvancedHunterEntity; +import net.minecraft.client.model.HumanoidArmorModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.network.chat.Component; @@ -33,8 +34,8 @@ public class AdvancedHunterRenderer extends DualBipedRenderer(context.bakeLayer(ModEntitiesRender.HUNTER), false), new BasicHunterModel<>(context.bakeLayer(ModEntitiesRender.HUNTER), true), 0.5F); - this.addLayer(new HunterEquipmentLayer<>(this, context.getModelSet(), h -> HunterEquipmentModel.StakeType.from(h.getEquipmentType()), e -> HunterEquipmentModel.HatType.from(e.getHatType()), getModel().hat)); this.addLayer(new CloakLayer<>(this, textureCloak, IAdvancedHunter::hasCloak)); + this.addLayer(new ArmorLayer>(this, new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_SLIM_INNER_ARMOR)), new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_INNER_ARMOR)), new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_SLIM_OUTER_ARMOR)), new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_OUTER_ARMOR)), context.getModelManager())); if (VampirismConfig.CLIENT.renderAdvancedMobPlayerFaces.get()) { this.addLayer(new PlayerFaceOverlayLayer<>(this)); this.getModel().head.visible = false; diff --git a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/BasicHunterRenderer.java b/src/main/java/de/teamlapen/vampirism/client/renderer/entity/BasicHunterRenderer.java index 2db924c63a..1382792ff9 100644 --- a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/BasicHunterRenderer.java +++ b/src/main/java/de/teamlapen/vampirism/client/renderer/entity/BasicHunterRenderer.java @@ -3,10 +3,11 @@ import de.teamlapen.vampirism.REFERENCE; import de.teamlapen.vampirism.client.core.ModEntitiesRender; import de.teamlapen.vampirism.client.model.BasicHunterModel; -import de.teamlapen.vampirism.client.model.HunterEquipmentModel; import de.teamlapen.vampirism.client.renderer.entity.layers.CloakLayer; -import de.teamlapen.vampirism.client.renderer.entity.layers.HunterEquipmentLayer; import de.teamlapen.vampirism.entity.hunter.BasicHunterEntity; +import net.minecraft.client.model.HumanoidArmorModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; @@ -14,8 +15,6 @@ import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; -import java.util.Optional; - /** * There are differently looking level 0 hunters. @@ -26,12 +25,11 @@ public class BasicHunterRenderer extends DualBipedRenderer textureDefault = Pair.of(new ResourceLocation(REFERENCE.MODID, "textures/entity/hunter_base1.png"), false); private final Pair @NotNull [] textures; public BasicHunterRenderer(EntityRendererProvider.@NotNull Context context) { super(context, new BasicHunterModel<>(context.bakeLayer(ModEntitiesRender.HUNTER), false), new BasicHunterModel<>(context.bakeLayer(ModEntitiesRender.HUNTER_SLIM), true), 0.5F); - this.addLayer(new HunterEquipmentLayer<>(this, context.getModelSet(), entity -> entity.isHoldingCrossbow() ? HunterEquipmentModel.StakeType.NONE : entity.getEntityLevel() < 2 ? HunterEquipmentModel.StakeType.ONLY : HunterEquipmentModel.StakeType.FULL, entity -> entity.getEntityLevel() == 0 ? HunterEquipmentModel.HatType.from(entity.getEntityTextureType() % 3) : HunterEquipmentModel.HatType.HAT1, () -> Optional.of(this.getModel().hat))); + this.addLayer(new ArmorLayer>(this, new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_SLIM_INNER_ARMOR)), new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_INNER_ARMOR)), new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_SLIM_OUTER_ARMOR)), new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_OUTER_ARMOR)), context.getModelManager())); this.addLayer(new CloakLayer<>(this, textureCloak, entity -> entity.getEntityLevel() > 0)); textures = gatherTextures("textures/entity/hunter", true); } diff --git a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/DualBipedRenderer.java b/src/main/java/de/teamlapen/vampirism/client/renderer/entity/DualBipedRenderer.java index 91da650983..5ab18d7654 100644 --- a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/DualBipedRenderer.java +++ b/src/main/java/de/teamlapen/vampirism/client/renderer/entity/DualBipedRenderer.java @@ -2,14 +2,19 @@ import com.mojang.blaze3d.vertex.PoseStack; import de.teamlapen.vampirism.REFERENCE; +import de.teamlapen.vampirism.mixin.client.HumanoidArmorLayerAccessor; import de.teamlapen.vampirism.util.TextureComparator; import net.minecraft.client.Minecraft; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; import net.minecraft.client.resources.DefaultPlayerSkin; +import net.minecraft.client.resources.model.ModelManager; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.Mob; import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; @@ -85,4 +90,37 @@ protected void renderSelected(@NotNull T entityIn, float entityYaw, float partia protected Comparator> alphaNumericComparator() { return (o1, o2) -> TextureComparator.alphaNumericComparator().compare(o1.getLeft(), o2.getLeft()); } + + protected class ArmorLayer> extends HumanoidArmorLayer { + + private final A pInnerModel; + private final A pInnerModelSlim; + private final A pOuterModel; + private final A pOuterModelSlim; + + public ArmorLayer(RenderLayerParent pRenderer, A pInnerModel, A pInnerModelSlim, A pOuterModel, A pOuterModelSlim, ModelManager pModelManager) { + super(pRenderer, pInnerModel, pOuterModel, pModelManager); + this.pInnerModel = pInnerModel; + this.pInnerModelSlim = pInnerModelSlim; + this.pOuterModel = pOuterModel; + this.pOuterModelSlim = pOuterModelSlim; + } + + @Override + public void render(@NotNull PoseStack pMatrixStack, @NotNull MultiBufferSource pBuffer, int pPackedLight, @NotNull T pLivingEntity, float pLimbSwing, float pLimbSwingAmount, float pPartialTicks, float pAgeInTicks, float pNetHeadYaw, float pHeadPitch) { + Pair b = determineTextureAndModel(pLivingEntity); + + A innerModel = b.getRight() ? pInnerModelSlim : pInnerModel; + A outerModel = b.getRight() ? pOuterModelSlim : pOuterModel; + + ((HumanoidArmorLayerAccessor) this).invoke_renderArmorPiece(pMatrixStack, pBuffer, pLivingEntity, EquipmentSlot.CHEST, pPackedLight, this.getArmorModel(EquipmentSlot.CHEST, innerModel, outerModel)); + ((HumanoidArmorLayerAccessor) this).invoke_renderArmorPiece(pMatrixStack, pBuffer, pLivingEntity, EquipmentSlot.LEGS, pPackedLight, this.getArmorModel(EquipmentSlot.LEGS, innerModel, outerModel)); + ((HumanoidArmorLayerAccessor) this).invoke_renderArmorPiece(pMatrixStack, pBuffer, pLivingEntity, EquipmentSlot.FEET, pPackedLight, this.getArmorModel(EquipmentSlot.FEET, innerModel, outerModel)); + ((HumanoidArmorLayerAccessor) this).invoke_renderArmorPiece(pMatrixStack, pBuffer, pLivingEntity, EquipmentSlot.HEAD, pPackedLight, this.getArmorModel(EquipmentSlot.HEAD, innerModel, outerModel)); + } + + private A getArmorModel(EquipmentSlot slot, A innerModel, A outerModel) { + return ((HumanoidArmorLayerAccessor) this).invoke_usesInnerModel(slot) ? innerModel : outerModel; + } + } } diff --git a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/HunterMinionRenderer.java b/src/main/java/de/teamlapen/vampirism/client/renderer/entity/HunterMinionRenderer.java index 9868b10813..d5b2e7b53d 100644 --- a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/HunterMinionRenderer.java +++ b/src/main/java/de/teamlapen/vampirism/client/renderer/entity/HunterMinionRenderer.java @@ -2,25 +2,21 @@ import com.mojang.blaze3d.vertex.PoseStack; import de.teamlapen.vampirism.client.core.ModEntitiesRender; -import de.teamlapen.vampirism.client.model.HunterEquipmentModel; import de.teamlapen.vampirism.client.model.HunterMinionModel; -import de.teamlapen.vampirism.client.renderer.entity.layers.HunterEquipmentLayer; import de.teamlapen.vampirism.client.renderer.entity.layers.PlayerBodyOverlayLayer; import de.teamlapen.vampirism.entity.minion.HunterMinionEntity; +import net.minecraft.client.model.HumanoidArmorModel; import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EquipmentSlot; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; -import java.util.Optional; - /** * There are differently looking level 0 hunters. * Hunter as of level 1 look all the same, but have different weapons @@ -36,8 +32,7 @@ public HunterMinionRenderer(EntityRendererProvider.@NotNull Context context) { textures = gatherTextures("textures/entity/hunter", true); minionSpecificTextures = gatherTextures("textures/entity/minion/hunter", false); this.addLayer(new PlayerBodyOverlayLayer<>(this)); - this.addLayer(new HunterEquipmentLayer<>(this, context.getModelSet(), minion -> minion.getItemBySlot(EquipmentSlot.MAINHAND).isEmpty() ? minion.getItemBySlot(EquipmentSlot.OFFHAND).isEmpty() ? HunterEquipmentModel.StakeType.FULL : HunterEquipmentModel.StakeType.AXE_ONLY : HunterEquipmentModel.StakeType.NONE, e -> HunterEquipmentModel.HatType.from(e.getHatType()), () -> Optional.of(this.getModel().hat))); - this.addLayer(new HumanoidArmorLayer<>(this, new HumanoidModel<>(context.bakeLayer(ModEntitiesRender.GENERIC_BIPED_ARMOR_INNER)), new HumanoidModel<>(context.bakeLayer(ModEntitiesRender.GENERIC_BIPED_ARMOR_OUTER)), context.getModelManager())); + this.addLayer(new ArmorLayer>(this, new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_SLIM_INNER_ARMOR)), new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_INNER_ARMOR)), new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_SLIM_OUTER_ARMOR)), new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_OUTER_ARMOR)), context.getModelManager())); } public int getHunterTextureCount() { diff --git a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/HunterTaskMasterRenderer.java b/src/main/java/de/teamlapen/vampirism/client/renderer/entity/HunterTaskMasterRenderer.java index 31e3dbc03b..6d2458984d 100644 --- a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/HunterTaskMasterRenderer.java +++ b/src/main/java/de/teamlapen/vampirism/client/renderer/entity/HunterTaskMasterRenderer.java @@ -3,11 +3,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import de.teamlapen.vampirism.REFERENCE; import de.teamlapen.vampirism.client.core.ModEntitiesRender; -import de.teamlapen.vampirism.client.model.HunterEquipmentModel; -import de.teamlapen.vampirism.client.renderer.entity.layers.HunterEquipmentLayer; import de.teamlapen.vampirism.client.renderer.entity.layers.TaskMasterTypeLayer; import de.teamlapen.vampirism.entity.hunter.HunterTaskMasterEntity; -import de.teamlapen.vampirism.mixin.client.VillagerModelAccessor; import net.minecraft.client.model.VillagerModel; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; @@ -30,7 +27,6 @@ public HunterTaskMasterRenderer(EntityRendererProvider.@NotNull Context context) super(context, new VillagerModel<>(context.bakeLayer(ModEntitiesRender.TASK_MASTER)), 0.5F); // this.addLayer(new HeldItemLayer<>(this)); this.addLayer(new TaskMasterTypeLayer<>(this, overlay)); - this.addLayer(new HunterEquipmentLayer<>(this, context.getModelSet(), h -> HunterEquipmentModel.StakeType.NONE, h -> HunterEquipmentModel.HatType.HAT2, ((VillagerModelAccessor) getModel()).getHat())); } @NotNull diff --git a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/HunterTrainerRenderer.java b/src/main/java/de/teamlapen/vampirism/client/renderer/entity/HunterTrainerRenderer.java index 9e21281926..7f0d338866 100644 --- a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/HunterTrainerRenderer.java +++ b/src/main/java/de/teamlapen/vampirism/client/renderer/entity/HunterTrainerRenderer.java @@ -3,12 +3,13 @@ import com.mojang.blaze3d.vertex.PoseStack; import de.teamlapen.vampirism.REFERENCE; import de.teamlapen.vampirism.client.core.ModEntitiesRender; -import de.teamlapen.vampirism.client.model.HunterEquipmentModel; -import de.teamlapen.vampirism.client.renderer.entity.layers.HunterEquipmentLayer; +import net.minecraft.client.model.HumanoidArmorModel; import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.HumanoidMobRenderer; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Mob; @@ -24,7 +25,7 @@ public class HunterTrainerRenderer extends HumanoidMobRenderer(context.bakeLayer(ModEntitiesRender.GENERIC_BIPED), false), 0.5F); if (renderEquipment) { - this.addLayer(new HunterEquipmentLayer<>(this, context.getModelSet(), h -> HunterEquipmentModel.StakeType.ONLY, entityModel -> HunterEquipmentModel.HatType.HAT2, getModel().hat)); + this.addLayer(new HumanoidArmorLayer<>(this, new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_INNER_ARMOR)), new HumanoidArmorModel<>(context.bakeLayer(ModelLayers.PLAYER_OUTER_ARMOR)), context.getModelManager())); } //this.addLayer(new CloakLayer<>(this, textureCloak, Predicates.alwaysTrue())); } diff --git a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/layers/HunterEquipmentLayer.java b/src/main/java/de/teamlapen/vampirism/client/renderer/entity/layers/HunterEquipmentLayer.java deleted file mode 100644 index 44acace2bd..0000000000 --- a/src/main/java/de/teamlapen/vampirism/client/renderer/entity/layers/HunterEquipmentLayer.java +++ /dev/null @@ -1,61 +0,0 @@ -package de.teamlapen.vampirism.client.renderer.entity.layers; - -import com.google.common.base.Suppliers; -import com.mojang.blaze3d.vertex.PoseStack; -import de.teamlapen.vampirism.REFERENCE; -import de.teamlapen.vampirism.client.core.ModEntitiesRender; -import de.teamlapen.vampirism.client.model.HunterEquipmentModel; -import net.minecraft.client.model.EntityModel; -import net.minecraft.client.model.geom.EntityModelSet; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.RenderLayerParent; -import net.minecraft.client.renderer.entity.layers.RenderLayer; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Mob; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; -import java.util.function.Function; -import java.util.function.Supplier; - -/** - * Render weapons for hunter entities - */ -@OnlyIn(Dist.CLIENT) -public class HunterEquipmentLayer> extends RenderLayer { - - private final @NotNull HunterEquipmentModel equipmentModel; - private final ResourceLocation textureExtra = new ResourceLocation(REFERENCE.MODID, "textures/entity/hunter_extra.png"); - private final Function predicateStake; - private final Function functionHat; - private final @NotNull Supplier> hatPart; - - /** - * @param predicateStake entity -> Type of equipment that should be rendered - */ - public HunterEquipmentLayer(@NotNull RenderLayerParent entityRendererIn, @NotNull EntityModelSet modelSet, Function predicateStake, Function functionHat, @NotNull Supplier<@NotNull Optional> hatPart) { - super(entityRendererIn); - this.equipmentModel = new HunterEquipmentModel<>(modelSet.bakeLayer(ModEntitiesRender.HUNTER_EQUIPMENT)); - this.predicateStake = predicateStake; - this.functionHat = functionHat; - this.hatPart = hatPart; - } - - public HunterEquipmentLayer(@NotNull RenderLayerParent entityRendererIn, @NotNull EntityModelSet modelSet, Function predicateStake, Function functionHat, @Nullable ModelPart hatPart) { - this(entityRendererIn, modelSet, predicateStake, functionHat, Suppliers.memoize(() -> Optional.ofNullable(hatPart))); - } - - @Override - public void render(@NotNull PoseStack matrixStackIn, @NotNull MultiBufferSource bufferIn, int packedLightIn, @NotNull T entityIn, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { - if (!entityIn.isInvisible()) { - equipmentModel.setHat(this.hatPart.get().map(a -> a.visible).orElse(true) ? functionHat.apply(entityIn) : HunterEquipmentModel.HatType.NONE); - equipmentModel.setWeapons(predicateStake.apply(entityIn)); - - coloredCutoutModelCopyLayerRender(this.getParentModel(), this.equipmentModel, textureExtra, matrixStackIn, bufferIn, packedLightIn, entityIn, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, partialTicks, 1, 1, 1); - } - } -} diff --git a/src/main/java/de/teamlapen/vampirism/data/ItemModelGenerator.java b/src/main/java/de/teamlapen/vampirism/data/ItemModelGenerator.java index 46d38afe5d..1a9b2015f5 100644 --- a/src/main/java/de/teamlapen/vampirism/data/ItemModelGenerator.java +++ b/src/main/java/de/teamlapen/vampirism/data/ItemModelGenerator.java @@ -171,8 +171,6 @@ protected void registerModels() { put(ModItems.HOLY_WATER_SPLASH_BOTTLE_ENHANCED.get(), modLoc("item/holy_water_splash_enhanced")); put(ModItems.HOLY_WATER_SPLASH_BOTTLE_ULTIMATE.get(), modLoc("item/holy_water_splash_ultimate")); put(ModItems.GARLIC_BREAD.get(), modLoc("item/garlic_bread")); - put(ModItems.HUNTER_HAT_HEAD_0.get(), modLoc("item/hunter_hat_0")); - put(ModItems.HUNTER_HAT_HEAD_1.get(), modLoc("item/hunter_hat_1")); put(ModItems.ITEM_ALCHEMICAL_FIRE.get(), modLoc("item/alchemical_fire")); put(ModItems.ITEM_GARLIC.get(), modLoc("item/garlic")); put(ModBlocks.MED_CHAIR.get().asItem(), modLoc("item/med_chair")); diff --git a/src/main/java/de/teamlapen/vampirism/entity/hunter/AdvancedHunterEntity.java b/src/main/java/de/teamlapen/vampirism/entity/hunter/AdvancedHunterEntity.java index eb989add6e..64905764fc 100644 --- a/src/main/java/de/teamlapen/vampirism/entity/hunter/AdvancedHunterEntity.java +++ b/src/main/java/de/teamlapen/vampirism/entity/hunter/AdvancedHunterEntity.java @@ -9,12 +9,16 @@ import de.teamlapen.vampirism.api.entity.actions.EntityActionTier; import de.teamlapen.vampirism.api.entity.actions.IEntityActionUser; import de.teamlapen.vampirism.api.entity.hunter.IAdvancedHunter; +import de.teamlapen.vampirism.api.entity.hunter.IVampirismCrossbowUser; +import de.teamlapen.vampirism.api.items.IVampirismCrossbow; import de.teamlapen.vampirism.api.settings.Supporter; import de.teamlapen.vampirism.api.world.ICaptureAttributes; import de.teamlapen.vampirism.config.BalanceMobProps; import de.teamlapen.vampirism.core.ModEntities; +import de.teamlapen.vampirism.core.ModItems; import de.teamlapen.vampirism.entity.VampirismEntity; import de.teamlapen.vampirism.entity.action.ActionHandlerEntity; +import de.teamlapen.vampirism.entity.ai.goals.AttackRangedCrossbowGoal; import de.teamlapen.vampirism.entity.ai.goals.AttackVillageGoal; import de.teamlapen.vampirism.entity.ai.goals.DefendVillageGoal; import de.teamlapen.vampirism.entity.vampire.VampireBaseEntity; @@ -43,6 +47,8 @@ import net.minecraft.world.entity.monster.PatrollingMonster; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.phys.AABB; @@ -53,17 +59,20 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.annotation.Nonnull; import java.util.Map; import java.util.Optional; /** * Advanced hunter. Is strong. Represents supporters */ -public class AdvancedHunterEntity extends HunterBaseEntity implements IAdvancedHunter, IPlayerOverlay, IEntityActionUser, VampireBookLootProvider { +public class AdvancedHunterEntity extends HunterBaseEntity implements IAdvancedHunter, IPlayerOverlay, IEntityActionUser, VampireBookLootProvider, IVampirismCrossbowUser { private static final EntityDataAccessor LEVEL = SynchedEntityData.defineId(AdvancedHunterEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor TYPE = SynchedEntityData.defineId(AdvancedHunterEntity.class, EntityDataSerializers.INT); private static final EntityDataAccessor NAME = SynchedEntityData.defineId(AdvancedHunterEntity.class, EntityDataSerializers.STRING); private static final EntityDataAccessor TEXTURE = SynchedEntityData.defineId(AdvancedHunterEntity.class, EntityDataSerializers.STRING); + private static final EntityDataAccessor IS_CHARGING_CROSSBOW = SynchedEntityData.defineId(AdvancedHunterEntity.class, EntityDataSerializers.BOOLEAN); + private static final int MAX_LEVEL = 1; private static final int MOVE_TO_RESTRICT_PRIO = 3; @@ -315,6 +324,7 @@ protected void defineSynchedData() { this.getEntityData().define(TYPE, 0); this.getEntityData().define(NAME, "none"); this.getEntityData().define(TEXTURE, "none"); + this.getEntityData().define(IS_CHARGING_CROSSBOW, false); } @Nullable @@ -325,16 +335,33 @@ public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstan this.getEntityData().set(NAME, supporter.name()); this.getEntityData().set(TEXTURE, supporter.texture()); this.lootBookId = supporter.bookId(); + applyCustomisationItems(supporter); return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); } + private void applyCustomisationItems(Supporter supporter) { + Map appearance = supporter.appearance(); + EquipmentType equipment = Optional.ofNullable(appearance.get("equipment")).map(EquipmentType::get).orElseGet(() -> { + EquipmentType[] types = EquipmentType.values(); + return types[random.nextInt(types.length)]; + }); + this.setLeftHanded(false); + this.setItemSlot(EquipmentSlot.MAINHAND, equipment.getMainHand()); + this.setItemSlot(EquipmentSlot.OFFHAND, equipment.getOffHand()); + + HatType hat = Optional.ofNullable(appearance.get("hat")).map(HatType::get).orElseGet(() -> { + HatType[] types = HatType.values(); + return types[random.nextInt(types.length)]; + }); + this.setItemSlot(EquipmentSlot.HEAD, hat.getHeadItem()); + this.setDontDropEquipment(); + } + private static int createCustomisationFlag(Supporter supporter) { Map appearance = supporter.appearance(); int type = 0; - type |= (Integer.parseInt(appearance.getOrDefault("hat", "1")) & 0b11); - type |= (Integer.parseInt(appearance.getOrDefault("equipment", "1")) & 0b11) << 2; - type |= (Boolean.parseBoolean(appearance.getOrDefault("hasCloak", "true")) ? 1 : 0) << 4; - type |= (Integer.parseInt(appearance.getOrDefault("body", "13")) & 0b11111111) << 5; + type |= (Boolean.parseBoolean(appearance.getOrDefault("hasCloak", "true")) ? 1 : 0) & 0b1; + type |= (Integer.parseInt(appearance.getOrDefault("body", "13")) & 0b11111111) << 1; return type; } @@ -355,12 +382,22 @@ protected InteractionResult mobInteract(@NotNull Player player, @NotNull Interac return super.mobInteract(player, hand); } + @Nonnull + @Override + public ItemStack getProjectile(ItemStack stack) { + if (stack.getItem() instanceof IVampirismCrossbow) { + return net.minecraftforge.common.ForgeHooks.getProjectile(this, stack, ModItems.CROSSBOW_ARROW_NORMAL.get().getDefaultInstance()); + } + return super.getProjectile(stack); + } + @Override protected void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(1, new OpenDoorGoal(this, true)); - this.goalSelector.addGoal(2, new MeleeAttackGoal(this, 1.0, false)); + this.goalSelector.addGoal(2, new AttackRangedCrossbowGoal<>(this, 0.8, 100)); + this.goalSelector.addGoal(3, new MeleeAttackGoal(this, 1.0, false)); this.goalSelector.addGoal(6, new RandomStrollGoal(this, 0.7, 50)); this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 13F)); @@ -382,6 +419,36 @@ protected void updateEntityAttributes() { this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(BalanceMobProps.mobProps.ADVANCED_HUNTER_ATTACK_DAMAGE + BalanceMobProps.mobProps.ADVANCED_HUNTER_ATTACK_DAMAGE_PL * l); } + @Override + public boolean isHoldingCrossbow() { + return this.isHolding(stack -> stack.getItem() instanceof IVampirismCrossbow); + } + + @Override + public boolean isChargingCrossbow() { + return this.getEntityData().get(IS_CHARGING_CROSSBOW); + } + + @Override + public void setChargingCrossbow(boolean pChargingCrossbow) { + this.getEntityData().set(IS_CHARGING_CROSSBOW, pChargingCrossbow); + } + + @Override + public void shootCrossbowProjectile(@NotNull LivingEntity pTarget, @NotNull ItemStack pCrossbowStack, @NotNull Projectile pProjectile, float pProjectileAngle) { + this.shootCrossbowProjectile(this, pTarget, pProjectile, pProjectileAngle, 1.6f); + } + + @Override + public void onCrossbowAttackPerformed() { + this.noActionTime = 0; + } + + @Override + public void performRangedAttack(@NotNull LivingEntity pTarget, float pVelocity) { + this.performCrossbowAttack(this, 1.6f); + } + public static class IMob extends AdvancedHunterEntity implements net.minecraft.world.entity.monster.Enemy { public IMob(EntityType type, Level world) { diff --git a/src/main/java/de/teamlapen/vampirism/entity/hunter/BasicHunterEntity.java b/src/main/java/de/teamlapen/vampirism/entity/hunter/BasicHunterEntity.java index ec69086d35..a26e776673 100644 --- a/src/main/java/de/teamlapen/vampirism/entity/hunter/BasicHunterEntity.java +++ b/src/main/java/de/teamlapen/vampirism/entity/hunter/BasicHunterEntity.java @@ -57,7 +57,6 @@ import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.Projectile; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; @@ -257,19 +256,25 @@ public SpawnGroupData finalizeSpawn(@NotNull ServerLevelAccessor worldIn, @NotNu this.setItemSlot(EquipmentSlot.HEAD, HunterVillage.createBanner()); } getEntityData().set(TYPE, this.getRandom().nextInt(TYPES)); + randomEquipments(); - SpawnGroupData livingData = super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); - - if (this.getRandom().nextInt(4) == 0) { - this.setLeftHanded(true); - Item crossBow = getEntityLevel() > 1 ? ModItems.ENHANCED_CROSSBOW.get() : ModItems.BASIC_CROSSBOW.get(); - this.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(crossBow)); + return super.finalizeSpawn(worldIn, difficultyIn, reason, spawnDataIn, dataTag); + } - } else { - this.setLeftHanded(false); - } + protected void randomEquipments() { + HatType[] hatTypes = HatType.values(); + HatType hat = hatTypes[this.getRandom().nextInt(hatTypes.length)]; + this.setItemSlot(EquipmentSlot.HEAD, hat.getHeadItem()); - return livingData; + EquipmentType equipment = switch (random.nextInt(4)) { + case 1 -> EquipmentType.STAKE; + case 2 -> EquipmentType.AXE; + case 3 -> EquipmentType.CROSSBOW; + default -> EquipmentType.NONE; + }; + this.setItemSlot(EquipmentSlot.MAINHAND, equipment.getMainHand()); + this.setItemSlot(EquipmentSlot.OFFHAND, equipment.getOffHand()); + this.setDontDropEquipment(); } @Override @@ -489,9 +494,9 @@ public boolean isChargingCrossbow() { @Override public ItemStack getProjectile(ItemStack stack) { if (stack.getItem() instanceof IVampirismCrossbow) { - return ModItems.CROSSBOW_ARROW_NORMAL.get().getDefaultInstance(); + return net.minecraftforge.common.ForgeHooks.getProjectile(this, stack, ModItems.CROSSBOW_ARROW_NORMAL.get().getDefaultInstance()); } - return ItemStack.EMPTY; + return super.getProjectile(stack); } @Override diff --git a/src/main/java/de/teamlapen/vampirism/entity/hunter/HunterBaseEntity.java b/src/main/java/de/teamlapen/vampirism/entity/hunter/HunterBaseEntity.java index eeddd734f0..74c62e1211 100644 --- a/src/main/java/de/teamlapen/vampirism/entity/hunter/HunterBaseEntity.java +++ b/src/main/java/de/teamlapen/vampirism/entity/hunter/HunterBaseEntity.java @@ -4,6 +4,7 @@ import de.teamlapen.vampirism.api.entity.hunter.IHunterMob; import de.teamlapen.vampirism.core.ModAdvancements; import de.teamlapen.vampirism.core.ModEffects; +import de.teamlapen.vampirism.core.ModItems; import de.teamlapen.vampirism.entity.VampirismEntity; import de.teamlapen.vampirism.util.Helper; import net.minecraft.core.BlockPos; @@ -16,11 +17,16 @@ import net.minecraft.world.entity.ai.goal.FloatGoal; import net.minecraft.world.entity.npc.Npc; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.AABB; import org.jetbrains.annotations.NotNull; +import java.util.Locale; +import java.util.function.Supplier; + /** * Base class for all vampire hunter */ @@ -83,4 +89,70 @@ protected boolean tryCureSanguinare(@NotNull Player entity) { } return false; } + + public enum EquipmentType { + NONE(null, null), + STAKE(ModItems.STAKE, null), + AXE(ModItems.HUNTER_AXE_NORMAL, null), + AXE_STAKE(ModItems.HUNTER_AXE_NORMAL, ModItems.STAKE), + CROSSBOW(ModItems.BASIC_CROSSBOW, null), + DOUBLE_AXE(ModItems.HUNTER_AXE_NORMAL, ModItems.HUNTER_AXE_NORMAL); + + private final Supplier mainHand; + private final Supplier offHand; + + EquipmentType(Supplier mainHand, Supplier offHand) { + this.mainHand = mainHand; + this.offHand = offHand; + } + + public ItemStack getMainHand() { + if (this.mainHand == null) { + return ItemStack.EMPTY; + } + return this.mainHand.get().getDefaultInstance(); + } + + public ItemStack getOffHand() { + if (this.offHand == null) { + return ItemStack.EMPTY; + } + return this.offHand.get().getDefaultInstance(); + } + + public static @NotNull EquipmentType get(String value) { + try { + return EquipmentType.valueOf(value.toUpperCase(Locale.ROOT)); + } catch (IllegalArgumentException e) { + return NONE; + } + } + } + + public enum HatType { + NONE(null), + HAT_0(ModItems.HUNTER_HAT_HEAD_0), + HAT_1(ModItems.HUNTER_HAT_HEAD_1); + + private final Supplier headItem; + + HatType(Supplier headItem) { + this.headItem = headItem; + } + + public ItemStack getHeadItem() { + if (this.headItem == null) { + return ItemStack.EMPTY; + } + return this.headItem.get().getDefaultInstance(); + } + + public static @NotNull HatType get(String value) { + try { + return HatType.valueOf(value.toUpperCase(Locale.ROOT)); + } catch (IllegalArgumentException e) { + return NONE; + } + } + } } diff --git a/src/main/java/de/teamlapen/vampirism/entity/hunter/HunterTrainerEntity.java b/src/main/java/de/teamlapen/vampirism/entity/hunter/HunterTrainerEntity.java index 3bce87400a..e3fb6bf1de 100644 --- a/src/main/java/de/teamlapen/vampirism/entity/hunter/HunterTrainerEntity.java +++ b/src/main/java/de/teamlapen/vampirism/entity/hunter/HunterTrainerEntity.java @@ -11,12 +11,12 @@ import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.world.DifficultyInstance; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.SimpleMenuProvider; import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.*; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.goal.*; @@ -27,6 +27,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.SpawnEggItem; import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.phys.AABB; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -98,6 +99,13 @@ public void readAdditionalSaveData(@NotNull CompoundTag nbt) { } } + @Nullable + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor pLevel, DifficultyInstance pDifficulty, MobSpawnType pReason, @Nullable SpawnGroupData pSpawnData, @Nullable CompoundTag pDataTag) { + this.setItemSlot(EquipmentSlot.HEAD, HatType.HAT_0.getHeadItem()); + return super.finalizeSpawn(pLevel, pDifficulty, pReason, pSpawnData, pDataTag); + } + @Override public boolean removeWhenFarAway(double distanceToClosestPlayer) { return super.removeWhenFarAway(distanceToClosestPlayer) && getHome() == null; diff --git a/src/main/java/de/teamlapen/vampirism/mixin/client/HumanoidArmorLayerAccessor.java b/src/main/java/de/teamlapen/vampirism/mixin/client/HumanoidArmorLayerAccessor.java new file mode 100644 index 0000000000..4e7b8be2f0 --- /dev/null +++ b/src/main/java/de/teamlapen/vampirism/mixin/client/HumanoidArmorLayerAccessor.java @@ -0,0 +1,21 @@ +package de.teamlapen.vampirism.mixin.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(HumanoidArmorLayer.class) +public interface HumanoidArmorLayerAccessor, A extends HumanoidModel> { + + @Invoker("usesInnerModel") + boolean invoke_usesInnerModel(EquipmentSlot slot); + + @Invoker("renderArmorPiece") + void invoke_renderArmorPiece(PoseStack pPoseStack, MultiBufferSource pBuffer, T pLivingEntity, EquipmentSlot pSlot, int pPackedLight, A pModel); + +} diff --git a/src/main/resources/assets/vampirism/models/item/hunter_hat_head_0.json b/src/main/resources/assets/vampirism/models/item/hunter_hat_head_0.json new file mode 100644 index 0000000000..637190580e --- /dev/null +++ b/src/main/resources/assets/vampirism/models/item/hunter_hat_head_0.json @@ -0,0 +1,274 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [ + 64, + 64 + ], + "textures": { + "0": "vampirism:item/hunter_hat_head_0", + "particle": "vampirism:item/hunter_hat_head_0" + }, + "elements": [ + { + "name": "bottom_small", + "from": [ + 2, + 0, + 2 + ], + "to": [ + 14, + 1, + 14 + ], + "faces": { + "north": { + "uv": [ + 3, + 3, + 6, + 3.25 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 3, + 3, + 3.25 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 6, + 3, + 9, + 3.25 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 9, + 3, + 12, + 3.25 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 6, + 3, + 3, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 9, + 0, + 6, + 3 + ], + "texture": "#0" + } + } + }, + { + "name": "top_high", + "from": [ + 4, + 1, + 4 + ], + "to": [ + 12, + 6, + 12 + ], + "faces": { + "north": { + "uv": [ + 2, + 5.25, + 4, + 6.5 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 5.25, + 2, + 6.5 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 6, + 5.25, + 8, + 6.5 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 5.25, + 6, + 6.5 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 5.25, + 2, + 3.25 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 6, + 3.25, + 4, + 5.25 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [ + 0, + 4, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "thirdperson_lefthand": { + "translation": [ + 0, + 4, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "firstperson_righthand": { + "translation": [ + 0, + 4, + 0 + ], + "scale": [ + 0.75, + 0.75, + 0.75 + ] + }, + "firstperson_lefthand": { + "translation": [ + 0, + 4, + 0 + ], + "scale": [ + 0.75, + 0.75, + 0.75 + ] + }, + "ground": { + "translation": [ + 0, + 5, + 0 + ], + "scale": [ + 0.75, + 0.75, + 0.75 + ] + }, + "gui": { + "rotation": [ + 25, + -51, + 0 + ], + "translation": [ + 0, + 4.25, + 0 + ], + "scale": [ + 0.7, + 0.7, + 0.7 + ] + }, + "head": { + "translation": [ + 0, + 18.5, + 0 + ], + "scale": [ + 1.6, + 1.6, + 1.6 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -7 + ], + "scale": [ + 0.75, + 0.75, + 0.75 + ] + } + }, + "groups": [ + { + "name": "hunter_hat_0", + "origin": [ + 0, + 0, + 0 + ], + "color": 0, + "children": [ + 0, + 1 + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/vampirism/models/item/hunter_hat_head_1.json b/src/main/resources/assets/vampirism/models/item/hunter_hat_head_1.json new file mode 100644 index 0000000000..b71e4f2c0c --- /dev/null +++ b/src/main/resources/assets/vampirism/models/item/hunter_hat_head_1.json @@ -0,0 +1,274 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [ + 64, + 64 + ], + "textures": { + "0": "vampirism:item/hunter_hat_head_1", + "particle": "vampirism:item/hunter_hat_head_1" + }, + "elements": [ + { + "name": "bottom_big", + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 1, + 16 + ], + "faces": { + "north": { + "uv": [ + 4, + 4, + 8, + 4.25 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 4, + 4, + 4.25 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 12, + 4, + 16, + 4.25 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 8, + 4, + 12, + 4.25 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 8, + 4, + 4, + 0 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 12, + 0, + 8, + 4 + ], + "texture": "#0" + } + } + }, + { + "name": "top_flat", + "from": [ + 4, + 1, + 4 + ], + "to": [ + 12, + 4, + 12 + ], + "faces": { + "north": { + "uv": [ + 2, + 6.25, + 4, + 7 + ], + "texture": "#0" + }, + "east": { + "uv": [ + 0, + 6.25, + 2, + 7 + ], + "texture": "#0" + }, + "south": { + "uv": [ + 6, + 6.25, + 8, + 7 + ], + "texture": "#0" + }, + "west": { + "uv": [ + 4, + 6.25, + 6, + 7 + ], + "texture": "#0" + }, + "up": { + "uv": [ + 4, + 6.25, + 2, + 4.25 + ], + "texture": "#0" + }, + "down": { + "uv": [ + 6, + 4.25, + 4, + 6.25 + ], + "texture": "#0" + } + } + } + ], + "display": { + "thirdperson_righthand": { + "translation": [ + 0, + 4, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "thirdperson_lefthand": { + "translation": [ + 0, + 4, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + }, + "firstperson_righthand": { + "translation": [ + 0, + 4, + 0 + ], + "scale": [ + 0.75, + 0.75, + 0.75 + ] + }, + "firstperson_lefthand": { + "translation": [ + 0, + 4, + 0 + ], + "scale": [ + 0.75, + 0.75, + 0.75 + ] + }, + "ground": { + "translation": [ + 0, + 5, + 0 + ], + "scale": [ + 0.75, + 0.75, + 0.75 + ] + }, + "gui": { + "rotation": [ + 25, + -51, + 0 + ], + "translation": [ + 0, + 4.25, + 0 + ], + "scale": [ + 0.7, + 0.7, + 0.7 + ] + }, + "head": { + "translation": [ + 0, + 18.5, + 0 + ], + "scale": [ + 1.6, + 1.6, + 1.6 + ] + }, + "fixed": { + "rotation": [ + -90, + 0, + 0 + ], + "translation": [ + 0, + 0, + -7 + ], + "scale": [ + 0.75, + 0.75, + 0.75 + ] + } + }, + "groups": [ + { + "name": "hunter_hat_1", + "origin": [ + 0, + 0, + 0 + ], + "color": 0, + "children": [ + 0, + 1 + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/vampirism/textures/item/hunter_hat_1.png b/src/main/resources/assets/vampirism/textures/item/hunter_hat_1.png index ac217626758828b99591073b48d91bc0d5b1fbca..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 252 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 UZzfil*~nE##i{ns_~66;06INIyZ`_I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/vampirism/textures/models/armor/hunter_hat_head_0.png b/src/main/resources/assets/vampirism/textures/models/armor/hunter_hat_head_0.png index 013b839f39424b175c10f13219ac0e9d5b6ec10c..22ced8d9b08c785c78e13e90105d761380d00693 100644 GIT binary patch delta 1545 zcmZvc2~ZPP7{@mdrl27OVG!k<5I|uTcQ?C9HmHQdY8;M$2na;Xu`59dH&PggViBqZ zl;9LGiY*`&oT@{kB2rKR4^*feQ@IBeL_qE6fQVoht5av%xBKn)f8T!Zx8Hm7-ZpSb zoQ^uEfes=}M2bW%fFS??%K(5z2WXTMQbzki>(TT9eJXZ{vK5qG%2~42G=q=+2TEIg z(#4cs^C@R(3{2Alj47|B4573+<*O-E=F-(42melWmYU(mi>C*CO!@3Li~Pj)h#L&K zaZm~XAshh=3t+?^#snO$0OeB*+L?b#S|UXlvZ?vd4l2F9#UgKS`}o8-Qn{A^fHZC9 zu?<^p39VbAwp9kzsF|rI33tS&rhaA>gy*n=4Ru~MOs5~SJT-^dEiHlZAph;9u$1_O zp6(mlP3RuNNQu^5QqlauF~7E^Bec4$`MMW( zqb%=Ey0%4D;n{49OLQZad6)Pb1MbLg&nv>VbY|VW?J@PvF>&n^mxIUTwC&MHB_40> z-oNN^@%2v=9aGag7Do7X<-+Kd(LFZf^M59kItyQ|y85VZF-E^+j@>ZWBir26#EnlF z=qcVXocNVxI-=N?T50e1lNcCme|9plX&5xw`8s{i^ynMf9dYP6tKnf2OV^;8Ywh(J zf{giD-@1|m`}B1IrlhC?`OnZ3PzT5Pf+#9Q zK&g~RJxG#I@?cm>6`_$aBA7VN!*M=@bNDEV^E7RYRWwxdlo4q5X;TJ&-juEotPvSo z{cn7qaW0$WbNL7^BR~Ry2@vIyFo@&Sw+R_WpcsrIQVvJMVs5hJfG|wm!3ZLNIRcbR zfdvr6TBp$(%h-qJPupUcB3N^LrG zk0IUUqRV^DgaxD?U(R5%VX^zIO6uTrihMkS(|V^*+)&+w7>5R8!j5yN0c)X`^~_>n z4n6m#w3ltpe0s5Nt6A=M{-|WG(M;@KJ>9kFz5JSHPWITu6b^0XII&nsu#eBFm#td& ztaCF}a!JSj>u(a$GcrHaDV@dghs}{XZq!iO=>=({dh)z3JZ}Abp!5E^BB3fIMmLBS zF+^PxVHv5p3k73Gi29k1;!JJ-v`wv%!8&b0%A?Y9QB$!{&$jMr^4#XfJ4-u|Cj{W71wi;T)bn3`s>^Hw>vaJxZN7 zRqO0B^(v}+Ur*l~*f`@Ily`aG73oy#)L~J;MXR#0mEoMqDk!viAgY}iINqJ!8Eq!a z&J&HOFX*$M^+#Zn<{hgg%s+}6jIMQ;d9AqD)%0!a;OML1-Lwly0TnBY&mHLNj=McX zFFM*!ubP>z>||D}^p=PT8j(#FeKJ+`|VpXJ$zdpV2wduHE#y}+U`{Q&>l bnm7ptQLf?5S1{r3rMIF@{yx8Y?aKZe*=#aa delta 3356 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 delta 3945 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 diff --git a/src/main/resources/supporters.json b/src/main/resources/supporters.json index 85ccd87dca..8d8b0659b4 100755 --- a/src/main/resources/supporters.json +++ b/src/main/resources/supporters.json @@ -7,7 +7,7 @@ "status": "Temporary", "bookId": null, "appearance": { - "hat": "1" + "hat": "hat_1" } }, { @@ -18,7 +18,7 @@ "status": "Dev", "bookId": null, "appearance": { - "hat": "0" + "hat": "hat_0" } }, { @@ -29,7 +29,7 @@ "status": "Temporary", "bookId": null, "appearance": { - "hat": "1" + "hat": "hat_1" } }, { @@ -40,7 +40,7 @@ "status": "Temporary", "bookId": null, "appearance": { - "hat": "1" + "hat": "hat_1" } }, { @@ -51,7 +51,7 @@ "status": "Contributor", "bookId": null, "appearance": { - "hat": "2" + "hat": "none" } }, { @@ -62,7 +62,7 @@ "status": "Temporary", "bookId": null, "appearance": { - "hat": "1" + "hat": "hat_1" } }, { @@ -73,7 +73,8 @@ "status": "Dev", "bookId": null, "appearance": { - "hat": "1" + "hat": "hat_0", + "equipment": "axe_stake" } }, { @@ -84,7 +85,7 @@ "status": "Contributor", "bookId": "pyropik", "appearance": { - "hat": "0" + "hat": "hat_0" } }, { @@ -95,7 +96,7 @@ "status": "Temporary", "bookId": null, "appearance": { - "hat": "0" + "hat": "hat_0" } }, { @@ -106,7 +107,7 @@ "status": "Temporary", "bookId": null, "appearance": { - "hat": "1" + "hat": "hat_1" } }, { @@ -238,7 +239,10 @@ "status": "Contributor", "bookId": null, "appearance": { - "hat": "1" + "hat": "hat_1", + "hasCloak": "true", + "body": "12", + "equipment": "double_axe" } } ] \ No newline at end of file diff --git a/src/main/resources/vampirism.mixins.json b/src/main/resources/vampirism.mixins.json index ceabc017c8..a41d9203cd 100644 --- a/src/main/resources/vampirism.mixins.json +++ b/src/main/resources/vampirism.mixins.json @@ -46,6 +46,7 @@ "client.AgeableModelAccessor", "client.BossHealthOverlayAccessor", "client.BossOverlayGuiAccessor", + "client.HumanoidArmorLayerAccessor", "client.HumanoidArmorLayerMixin", "client.LevelRendererMixin", "client.LivingEntityRendererAccessor",