From c8f1d2271a0ba3f42b6410277d79fa20ec166179 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Thu, 27 Mar 2025 16:31:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E5=86=8C=E6=89=80=E6=9C=89=E6=9E=AA?= =?UTF-8?q?=E6=A2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/ChargingStationBlockEntity.java | 2 +- .../block/entity/FuMO25BlockEntity.java | 2 +- .../superbwarfare/client/TooltipTool.java | 44 +++ .../client/layer/gun/AK12Layer.java | 28 ++ .../client/layer/gun/AK47Layer.java | 28 ++ .../client/layer/gun/Aa12Layer.java | 28 ++ .../client/layer/gun/BocekLayer.java | 27 ++ .../client/layer/gun/DevotionLayer.java | 27 ++ .../client/layer/gun/Glock17Layer.java | 27 ++ .../client/layer/gun/Glock17LightLayer.java | 28 ++ .../client/layer/gun/Glock18Layer.java | 27 ++ .../client/layer/gun/Glock18LightLayer.java | 28 ++ .../client/layer/gun/Hk416Layer.java | 27 ++ .../layer/gun/HomemadeShotgunLayer.java | 28 ++ .../client/layer/gun/HuntingRifleLayer.java | 27 ++ .../client/layer/gun/K98Layer.java | 27 ++ .../client/layer/gun/M1911Layer.java | 27 ++ .../client/layer/gun/M4Layer.java | 27 ++ .../client/layer/gun/M60Layer.java | 27 ++ .../client/layer/gun/M79Layer.java | 27 ++ .../client/layer/gun/M870Layer.java | 27 ++ .../client/layer/gun/M98bLayer.java | 27 ++ .../client/layer/gun/MarlinLayer.java | 27 ++ .../client/layer/gun/MinigunHeatLayer.java | 41 +++ .../client/layer/gun/MinigunLayer.java | 27 ++ .../client/layer/gun/Mk14Layer.java | 27 ++ .../client/layer/gun/MosinNagantLayer.java | 27 ++ .../client/layer/gun/Mp443Layer.java | 27 ++ .../client/layer/gun/Mp443LightLayer.java | 28 ++ .../client/layer/gun/Ntw20Layer.java | 27 ++ .../client/layer/gun/Qbz95Layer.java | 27 ++ .../client/layer/gun/RpkLayer.java | 27 ++ .../gun/SecondaryCataclysmLightLayer.java | 28 ++ .../client/layer/gun/SentinelLayer.java | 27 ++ .../client/layer/gun/SentinelLightLayer.java | 28 ++ .../client/layer/gun/SksLayer.java | 27 ++ .../client/layer/gun/SvdLayer.java | 27 ++ .../client/layer/gun/TracheliumLayer.java | 27 ++ .../layer/gun/TracheliumLightLayer.java | 28 ++ .../client/layer/{ => gun}/VectorLayer.java | 2 +- .../client/model/item/AK12ItemModel.java | 176 +++++++++ .../client/model/item/AK47ItemModel.java | 180 ++++++++++ .../client/model/item/Aa12ItemModel.java | 103 ++++++ .../client/model/item/BocekItemModel.java | 129 +++++++ .../client/model/item/DevotionItemModel.java | 119 +++++++ .../client/model/item/Glock17ItemModel.java | 143 ++++++++ .../client/model/item/Glock18ItemModel.java | 153 ++++++++ .../client/model/item/Hk416ItemModel.java | 176 +++++++++ .../model/item/HomemadeShotgunItemModel.java | 96 +++++ .../model/item/HuntingRifleItemModel.java | 105 ++++++ .../client/model/item/JavelinItemModel.java | 91 +++++ .../client/model/item/K98ItemModel.java | 130 +++++++ .../client/model/item/M1911ItemModel.java | 142 ++++++++ .../client/model/item/M4ItemModel.java | 204 +++++++++++ .../client/model/item/M60ItemModel.java | 174 +++++++++ .../client/model/item/M79ItemModel.java | 103 ++++++ .../client/model/item/M870ItemModel.java | 115 ++++++ .../client/model/item/M98bItemModel.java | 128 +++++++ .../client/model/item/MarlinItemModel.java | 117 ++++++ .../client/model/item/MinigunItemModel.java | 84 +++++ .../client/model/item/Mk14ItemModel.java | 180 ++++++++++ .../model/item/MosinNagantItemModel.java | 144 ++++++++ .../client/model/item/Mp443ItemModel.java | 139 ++++++++ .../client/model/item/Ntw20Model.java | 177 ++++++++++ .../client/model/item/Qbz95ItemModel.java | 217 ++++++++++++ .../client/model/item/RocketItemModel.java | 24 ++ .../client/model/item/RpgItemModel.java | 107 ++++++ .../client/model/item/RpkItemModel.java | 114 ++++++ .../model/item/SecondaryCataclysmModel.java | 116 ++++++ .../client/model/item/SentinelItemModel.java | 130 +++++++ .../client/model/item/SksItemModel.java | 122 +++++++ .../client/model/item/SvdItemModel.java | 176 +++++++++ .../client/model/item/TaserItemModel.java | 100 ++++++ .../model/item/TracheliumItemModel.java | 207 +++++++++++ .../client/overlay/CrossHairOverlay.java | 201 +++++++++++ .../renderer/item/AK12ItemRenderer.java | 173 +++++++++ .../renderer/item/AK47ItemRenderer.java | 192 ++++++++++ .../renderer/item/Aa12ItemRenderer.java | 141 ++++++++ .../renderer/item/BocekItemRenderer.java | 140 ++++++++ .../renderer/item/DevotionItemRenderer.java | 142 ++++++++ .../renderer/item/Glock17ItemRenderer.java | 138 ++++++++ .../renderer/item/Glock18ItemRenderer.java | 138 ++++++++ .../renderer/item/Hk416ItemRenderer.java | 169 +++++++++ .../item/HomemadeShotgunItemRenderer.java | 138 ++++++++ .../item/HuntingRifleItemRenderer.java | 137 +++++++ .../renderer/item/JavelinItemRenderer.java | 25 ++ .../client/renderer/item/K98ItemRenderer.java | 136 +++++++ .../renderer/item/M1911ItemRenderer.java | 136 +++++++ .../client/renderer/item/M4ItemRenderer.java | 180 ++++++++++ .../client/renderer/item/M60ItemRenderer.java | 136 +++++++ .../client/renderer/item/M79ItemRenderer.java | 136 +++++++ .../renderer/item/M870ItemRenderer.java | 136 +++++++ .../renderer/item/M98bItemRenderer.java | 145 ++++++++ .../renderer/item/MarlinItemRenderer.java | 136 +++++++ .../renderer/item/MinigunItemRenderer.java | 138 ++++++++ .../renderer/item/Mk14ItemRenderer.java | 173 +++++++++ .../item/MosinNagantItemRenderer.java | 145 ++++++++ .../renderer/item/Mp443ItemRenderer.java | 138 ++++++++ .../client/renderer/item/Ntw20Renderer.java | 173 +++++++++ .../renderer/item/Qbz95ItemRenderer.java | 181 ++++++++++ .../renderer/item/RocketItemRenderer.java | 18 + .../client/renderer/item/RpgItemRenderer.java | 139 ++++++++ .../client/renderer/item/RpkItemRenderer.java | 141 ++++++++ .../item/SecondaryCataclysmRenderer.java | 136 +++++++ .../renderer/item/SentinelItemRenderer.java | 151 ++++++++ .../client/renderer/item/SksItemRenderer.java | 141 ++++++++ .../client/renderer/item/SvdItemRenderer.java | 166 +++++++++ .../renderer/item/TaserItemRenderer.java | 123 +++++++ .../renderer/item/TracheliumItemRenderer.java | 183 ++++++++++ .../renderer/item/VectorItemRenderer.java | 4 +- .../client/screens/FuMO25Screen.java | 3 +- .../client/screens/ReforgingTableScreen.java | 6 - .../entity/projectile/ProjectileEntity.java | 4 +- .../event/ClientEventHandler.java | 6 +- .../superbwarfare/init/ModItems.java | 89 +++-- .../atsuishio/superbwarfare/init/ModTabs.java | 49 +-- .../superbwarfare/item/BeamTest.java | 4 +- .../superbwarfare/item/PerkItem.java | 1 - .../item/common/ammo/Rocket.java | 68 ++-- .../item/gun/SpecialFireWeapon.java | 29 ++ .../item/gun/handgun/Glock17Item.java | 150 ++++++++ .../item/gun/handgun/Glock18Item.java | 157 ++++++++ .../item/gun/handgun/M1911Item.java | 153 ++++++++ .../item/gun/handgun/Mp443Item.java | 150 ++++++++ .../item/gun/handgun/Trachelium.java | 332 +++++++++++++++++ .../item/gun/heavy/Ntw20Item.java | 213 +++++++++++ .../item/gun/launcher/JavelinItem.java | 331 +++++++++++++++++ .../item/gun/launcher/M79Item.java | 216 +++++++++++ .../item/gun/launcher/RpgItem.java | 237 +++++++++++++ .../item/gun/launcher/SecondaryCataclysm.java | 334 ++++++++++++++++++ .../item/gun/machinegun/DevotionItem.java | 140 ++++++++ .../item/gun/machinegun/M60Item.java | 166 +++++++++ .../item/gun/machinegun/MinigunItem.java | 188 ++++++++++ .../item/gun/machinegun/RpkItem.java | 140 ++++++++ .../item/gun/rifle/AK12Item.java | 242 +++++++++++++ .../item/gun/rifle/AK47Item.java | 252 +++++++++++++ .../item/gun/rifle/Hk416Item.java | 252 +++++++++++++ .../superbwarfare/item/gun/rifle/M4Item.java | 251 +++++++++++++ .../item/gun/rifle/MarlinItem.java | 156 ++++++++ .../item/gun/rifle/Mk14Item.java | 250 +++++++++++++ .../item/gun/rifle/Qbz95Item.java | 249 +++++++++++++ .../superbwarfare/item/gun/rifle/SksItem.java | 151 ++++++++ .../item/gun/shotgun/Aa12Item.java | 173 +++++++++ .../item/gun/shotgun/HomemadeShotgunItem.java | 134 +++++++ .../item/gun/shotgun/M870Item.java | 163 +++++++++ .../item/gun/sniper/HuntingRifleItem.java | 115 ++++++ .../item/gun/sniper/K98Item.java | 165 +++++++++ .../item/gun/sniper/M98bItem.java | 147 ++++++++ .../item/gun/sniper/MosinNagantItem.java | 160 +++++++++ .../item/gun/sniper/SentinelItem.java | 216 +++++++++++ .../item/gun/sniper/SvdItem.java | 204 +++++++++++ .../item/gun/special/BocekItem.java | 222 ++++++++++++ .../item/gun/special/TaserItem.java | 279 +++++++++++++++ .../network/message/ShakeClientMessage.java | 2 +- .../procedures/WelcomeProcedure.java | 2 +- 155 files changed, 17518 insertions(+), 125 deletions(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/TooltipTool.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/AK12Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/AK47Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Aa12Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/BocekLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/DevotionLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock17Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock17LightLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock18Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock18LightLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Hk416Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/HomemadeShotgunLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/HuntingRifleLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/K98Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M1911Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M4Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M60Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M79Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M870Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M98bLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MarlinLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MinigunHeatLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MinigunLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Mk14Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MosinNagantLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Mp443Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Mp443LightLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Ntw20Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Qbz95Layer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/RpkLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SecondaryCataclysmLightLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SentinelLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SentinelLightLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SksLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SvdLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/TracheliumLayer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/layer/gun/TracheliumLightLayer.java rename src/main/java/com/atsuishio/superbwarfare/client/layer/{ => gun}/VectorLayer.java (96%) create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/AK12ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/AK47ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/Aa12ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/BocekItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/DevotionItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/Glock17ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/Glock18ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/Hk416ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/HomemadeShotgunItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/HuntingRifleItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/JavelinItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/K98ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/M1911ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/M4ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/M60ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/M79ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/M870ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/M98bItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/MarlinItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/MinigunItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/Mk14ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/MosinNagantItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/Mp443ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/Ntw20Model.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/Qbz95ItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/RocketItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/RpkItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/SecondaryCataclysmModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/SentinelItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/SksItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/SvdItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/TaserItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/model/item/TracheliumItemModel.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/AK12ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/AK47ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Aa12ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/BocekItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/DevotionItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Glock17ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Glock18ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Hk416ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/HomemadeShotgunItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/HuntingRifleItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/JavelinItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/K98ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M1911ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M4ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M60ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M79ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M870ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M98bItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/MarlinItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/MinigunItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Mk14ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/MosinNagantItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Mp443ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Ntw20Renderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Qbz95ItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RocketItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RpgItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RpkItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SecondaryCataclysmRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SentinelItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SksItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SvdItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/TaserItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/client/renderer/item/TracheliumItemRenderer.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/SpecialFireWeapon.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock17Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock18Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/M1911Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Mp443Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Trachelium.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/heavy/Ntw20Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/DevotionItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/MinigunItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/RpkItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK12Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK47Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Hk416Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/M4Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/MarlinItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Mk14Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Qbz95Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/SksItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/Aa12Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/M870Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/HuntingRifleItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/K98Item.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/M98bItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/MosinNagantItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SvdItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java diff --git a/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java b/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java index 494713b3f..8051d1d37 100644 --- a/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/block/entity/ChargingStationBlockEntity.java @@ -114,7 +114,7 @@ public class ChargingStationBlockEntity extends BlockEntity implements WorldlyCo var cap = level.getCapability(Capabilities.EnergyStorage.BLOCK, ChargingStationBlockEntity.this.getBlockPos(), null); if (cap == null) return; - cap.receiveEnergy((int) pValue, false); + cap.receiveEnergy(pValue, false); break; case 3: ChargingStationBlockEntity.this.showRange = pValue == 1; diff --git a/src/main/java/com/atsuishio/superbwarfare/block/entity/FuMO25BlockEntity.java b/src/main/java/com/atsuishio/superbwarfare/block/entity/FuMO25BlockEntity.java index e5c5c7f2b..90288fc54 100644 --- a/src/main/java/com/atsuishio/superbwarfare/block/entity/FuMO25BlockEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/block/entity/FuMO25BlockEntity.java @@ -76,7 +76,7 @@ public class FuMO25BlockEntity extends BlockEntity implements MenuProvider, GeoB case 0 -> { } // FuMO25BlockEntity.this.energyHandler.ifPresent(handler -> handler.receiveEnergy((int) pValue, false)); - case 1 -> FuMO25BlockEntity.this.type = FuncType.values()[(int) pValue]; + case 1 -> FuMO25BlockEntity.this.type = FuncType.values()[pValue]; case 2 -> FuMO25BlockEntity.this.time = pValue; case 3 -> FuMO25BlockEntity.this.powered = pValue == 1; case 4 -> FuMO25BlockEntity.this.tick = pValue; diff --git a/src/main/java/com/atsuishio/superbwarfare/client/TooltipTool.java b/src/main/java/com/atsuishio/superbwarfare/client/TooltipTool.java new file mode 100644 index 000000000..160522c11 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/TooltipTool.java @@ -0,0 +1,44 @@ +package com.atsuishio.superbwarfare.client; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +public class TooltipTool { + + public static void addHideText(List tooltip, Component text) { + if (Screen.hasShiftDown()) { + tooltip.add(text); + } + } + + public static void addDevelopingText(List tooltip) { + tooltip.add(Component.translatable("des.superbwarfare.developing").withStyle(ChatFormatting.LIGHT_PURPLE).withStyle(ChatFormatting.BOLD)); + } + + // TODO perk + public static double perkDamage(ItemStack stack) { +// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); +// if (perk instanceof AmmoPerk ammoPerk) { +// return ammoPerk.damageRate; +// } + return 1; + } + + public static boolean heBullet(ItemStack stack) { +// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); +// return perk == ModPerks.HE_BULLET.get(); + return false; + } + + public static int heBulletLevel(ItemStack stack) { +// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); +// if (perk == ModPerks.HE_BULLET.get()) { +// return PerkHelper.getItemPerkLevel(perk, stack); +// } + return 0; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/AK12Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/AK12Layer.java new file mode 100644 index 000000000..668b31f87 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/AK12Layer.java @@ -0,0 +1,28 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.rifle.AK12Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class AK12Layer extends GeoRenderLayer { + + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/ak12_e.png"); + + public AK12Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, AK12Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/AK47Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/AK47Layer.java new file mode 100644 index 000000000..76ae8390f --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/AK47Layer.java @@ -0,0 +1,28 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.rifle.AK47Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class AK47Layer extends GeoRenderLayer { + + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/ak47_e.png"); + + public AK47Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, AK47Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Aa12Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Aa12Layer.java new file mode 100644 index 000000000..0860bd905 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Aa12Layer.java @@ -0,0 +1,28 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.shotgun.Aa12Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class Aa12Layer extends GeoRenderLayer { + + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/aa12_e.png"); + + public Aa12Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, Aa12Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/BocekLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/BocekLayer.java new file mode 100644 index 000000000..c3add013e --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/BocekLayer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.special.BocekItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class BocekLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/bocek_e.png"); + + public BocekLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, BocekItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/DevotionLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/DevotionLayer.java new file mode 100644 index 000000000..4febab4e6 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/DevotionLayer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.machinegun.DevotionItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class DevotionLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/devotion_e.png"); + + public DevotionLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, DevotionItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock17Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock17Layer.java new file mode 100644 index 000000000..3334357cf --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock17Layer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.handgun.Glock17Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class Glock17Layer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/glock17_e.png"); + + public Glock17Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, Glock17Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock17LightLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock17LightLayer.java new file mode 100644 index 000000000..93fefbcd1 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock17LightLayer.java @@ -0,0 +1,28 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.ModRenderTypes; +import com.atsuishio.superbwarfare.item.gun.handgun.Glock17Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class Glock17LightLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/glock17_e.png"); + + public Glock17LightLayer(GeoRenderer itemGeoRenderer) { + super(itemGeoRenderer); + } + + @Override + public void render(PoseStack poseStack, Glock17Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = ModRenderTypes.ILLUMINATED.apply(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock18Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock18Layer.java new file mode 100644 index 000000000..543b34bd9 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock18Layer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.handgun.Glock18Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class Glock18Layer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/glock17_e.png"); + + public Glock18Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, Glock18Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock18LightLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock18LightLayer.java new file mode 100644 index 000000000..818db10f6 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Glock18LightLayer.java @@ -0,0 +1,28 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.ModRenderTypes; +import com.atsuishio.superbwarfare.item.gun.handgun.Glock18Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class Glock18LightLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/glock17_e.png"); + + public Glock18LightLayer(GeoRenderer itemGeoRenderer) { + super(itemGeoRenderer); + } + + @Override + public void render(PoseStack poseStack, Glock18Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = ModRenderTypes.ILLUMINATED.apply(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Hk416Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Hk416Layer.java new file mode 100644 index 000000000..f804b7f39 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Hk416Layer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.rifle.Hk416Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class Hk416Layer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/hk416_e.png"); + + public Hk416Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, Hk416Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/HomemadeShotgunLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/HomemadeShotgunLayer.java new file mode 100644 index 000000000..12d147acb --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/HomemadeShotgunLayer.java @@ -0,0 +1,28 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.shotgun.HomemadeShotgunItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class HomemadeShotgunLayer extends GeoRenderLayer { + + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/homemade_shotgun_e.png"); + + public HomemadeShotgunLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, HomemadeShotgunItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/HuntingRifleLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/HuntingRifleLayer.java new file mode 100644 index 000000000..08acc2ff1 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/HuntingRifleLayer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.sniper.HuntingRifleItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class HuntingRifleLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/hunting_rifle_e.png"); + + public HuntingRifleLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, HuntingRifleItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/K98Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/K98Layer.java new file mode 100644 index 000000000..82460b22f --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/K98Layer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.sniper.K98Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class K98Layer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/k98_e.png"); + + public K98Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, K98Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M1911Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M1911Layer.java new file mode 100644 index 000000000..029b4e55c --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M1911Layer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.handgun.M1911Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class M1911Layer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/m1911_e.png"); + + public M1911Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, M1911Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M4Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M4Layer.java new file mode 100644 index 000000000..1a4a97bf1 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M4Layer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.rifle.M4Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class M4Layer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/m4_e.png"); + + public M4Layer(GeoRenderer itemGeoRenderer) { + super(itemGeoRenderer); + } + + @Override + public void render(PoseStack poseStack, M4Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M60Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M60Layer.java new file mode 100644 index 000000000..43cd83218 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M60Layer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.machinegun.M60Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class M60Layer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/m60_e.png"); + + public M60Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, M60Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M79Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M79Layer.java new file mode 100644 index 000000000..23b0dd214 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M79Layer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.launcher.M79Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class M79Layer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/m79_e.png"); + + public M79Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, M79Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M870Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M870Layer.java new file mode 100644 index 000000000..f25535ab1 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M870Layer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.shotgun.M870Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class M870Layer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/m870_e.png"); + + public M870Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, M870Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M98bLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M98bLayer.java new file mode 100644 index 000000000..0edb9ce16 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/M98bLayer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.sniper.M98bItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class M98bLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/m98b_e.png"); + + public M98bLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, M98bItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MarlinLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MarlinLayer.java new file mode 100644 index 000000000..d6538776d --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MarlinLayer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.rifle.MarlinItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class MarlinLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/marlin_e.png"); + + public MarlinLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, MarlinItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MinigunHeatLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MinigunHeatLayer.java new file mode 100644 index 000000000..613b1422a --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MinigunHeatLayer.java @@ -0,0 +1,41 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.ModRenderTypes; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.machinegun.MinigunItem; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.FastColor; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class MinigunHeatLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/minigun_heat_e.png"); + + public MinigunHeatLayer(GeoRenderer itemGeoRenderer) { + super(itemGeoRenderer); + } + + @Override + public void render(PoseStack poseStack, MinigunItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = ModRenderTypes.ILLUMINATED.apply(LAYER); + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + float heat = (float) NBTTool.getOrCreateTag(stack).getDouble("heat"); + var color = FastColor.ARGB32.color(1, (int) (heat / 55 * 255), (int) (heat / 55 * 255), (int) (heat / 55 * 255)); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, color); + } +} + diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MinigunLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MinigunLayer.java new file mode 100644 index 000000000..1958151b9 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MinigunLayer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.machinegun.MinigunItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class MinigunLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/minigun_e.png"); + + public MinigunLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, MinigunItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Mk14Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Mk14Layer.java new file mode 100644 index 000000000..0511fa799 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Mk14Layer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.rifle.Mk14Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class Mk14Layer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/mk14_e.png"); + + public Mk14Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, Mk14Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MosinNagantLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MosinNagantLayer.java new file mode 100644 index 000000000..bc20ed07a --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/MosinNagantLayer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.sniper.MosinNagantItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class MosinNagantLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/mosin_nagant_e.png"); + + public MosinNagantLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, MosinNagantItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Mp443Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Mp443Layer.java new file mode 100644 index 000000000..a0e65e5df --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Mp443Layer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.handgun.Mp443Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class Mp443Layer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/mp443_e.png"); + + public Mp443Layer(GeoRenderer itemGeoRenderer) { + super(itemGeoRenderer); + } + + @Override + public void render(PoseStack poseStack, Mp443Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Mp443LightLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Mp443LightLayer.java new file mode 100644 index 000000000..b3fabb09b --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Mp443LightLayer.java @@ -0,0 +1,28 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.ModRenderTypes; +import com.atsuishio.superbwarfare.item.gun.handgun.Mp443Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class Mp443LightLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/mp443_e.png"); + + public Mp443LightLayer(GeoRenderer itemGeoRenderer) { + super(itemGeoRenderer); + } + + @Override + public void render(PoseStack poseStack, Mp443Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = ModRenderTypes.ILLUMINATED.apply(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Ntw20Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Ntw20Layer.java new file mode 100644 index 000000000..eca176393 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Ntw20Layer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.heavy.Ntw20Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class Ntw20Layer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/ntw_20_e.png"); + + public Ntw20Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, Ntw20Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Qbz95Layer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Qbz95Layer.java new file mode 100644 index 000000000..e49e77223 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/Qbz95Layer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.rifle.Qbz95Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class Qbz95Layer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/qbz95_e.png"); + + public Qbz95Layer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, Qbz95Item animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/RpkLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/RpkLayer.java new file mode 100644 index 000000000..4f7f8e206 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/RpkLayer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.machinegun.RpkItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class RpkLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/rpk_e.png"); + + public RpkLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, RpkItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SecondaryCataclysmLightLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SecondaryCataclysmLightLayer.java new file mode 100644 index 000000000..2716e1217 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SecondaryCataclysmLightLayer.java @@ -0,0 +1,28 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.ModRenderTypes; +import com.atsuishio.superbwarfare.item.gun.launcher.SecondaryCataclysm; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class SecondaryCataclysmLightLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/secondary_cataclysm_e.png"); + + public SecondaryCataclysmLightLayer(GeoRenderer itemGeoRenderer) { + super(itemGeoRenderer); + } + + @Override + public void render(PoseStack poseStack, SecondaryCataclysm animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = ModRenderTypes.ILLUMINATED.apply(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SentinelLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SentinelLayer.java new file mode 100644 index 000000000..f4e85fcb6 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SentinelLayer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.sniper.SentinelItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class SentinelLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/sentinel_e.png"); + + public SentinelLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, SentinelItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SentinelLightLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SentinelLightLayer.java new file mode 100644 index 000000000..c7daafffd --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SentinelLightLayer.java @@ -0,0 +1,28 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.ModRenderTypes; +import com.atsuishio.superbwarfare.item.gun.sniper.SentinelItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class SentinelLightLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/sentinel_e.png"); + + public SentinelLightLayer(GeoRenderer itemGeoRenderer) { + super(itemGeoRenderer); + } + + @Override + public void render(PoseStack poseStack, SentinelItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = ModRenderTypes.ILLUMINATED.apply(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SksLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SksLayer.java new file mode 100644 index 000000000..034431eb4 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SksLayer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.rifle.SksItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class SksLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/sks_e.png"); + + public SksLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, SksItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SvdLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SvdLayer.java new file mode 100644 index 000000000..bdc0051ae --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/SvdLayer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.sniper.SvdItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class SvdLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/ak12_e.png"); + + public SvdLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, SvdItem animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/TracheliumLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/TracheliumLayer.java new file mode 100644 index 000000000..687c1a885 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/TracheliumLayer.java @@ -0,0 +1,27 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.gun.handgun.Trachelium; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class TracheliumLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/trachelium_texture_e.png"); + + public TracheliumLayer(GeoRenderer entityRenderer) { + super(entityRenderer); + } + + @Override + public void render(PoseStack poseStack, Trachelium animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = RenderType.eyes(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/TracheliumLightLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/TracheliumLightLayer.java new file mode 100644 index 000000000..da3960719 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/TracheliumLightLayer.java @@ -0,0 +1,28 @@ +package com.atsuishio.superbwarfare.client.layer.gun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.ModRenderTypes; +import com.atsuishio.superbwarfare.item.gun.handgun.Trachelium; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.layer.GeoRenderLayer; + +public class TracheliumLightLayer extends GeoRenderLayer { + private static final ResourceLocation LAYER = ModUtils.loc("textures/item/trachelium_texture_e.png"); + + public TracheliumLightLayer(GeoRenderer itemGeoRenderer) { + super(itemGeoRenderer); + } + + @Override + public void render(PoseStack poseStack, Trachelium animatable, BakedGeoModel bakedModel, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { + RenderType glowRenderType = ModRenderTypes.ILLUMINATED.apply(LAYER); + getRenderer().reRender(getDefaultBakedModel(animatable), poseStack, bufferSource, animatable, glowRenderType, bufferSource.getBuffer(glowRenderType), partialTick, packedLight, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/layer/VectorLayer.java b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/VectorLayer.java similarity index 96% rename from src/main/java/com/atsuishio/superbwarfare/client/layer/VectorLayer.java rename to src/main/java/com/atsuishio/superbwarfare/client/layer/gun/VectorLayer.java index c59b9f0a5..9a8f60052 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/layer/VectorLayer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/layer/gun/VectorLayer.java @@ -1,4 +1,4 @@ -package com.atsuishio.superbwarfare.client.layer; +package com.atsuishio.superbwarfare.client.layer.gun; import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.item.gun.smg.VectorItem; diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/AK12ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/AK12ItemModel.java new file mode 100644 index 000000000..63ea02aba --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/AK12ItemModel.java @@ -0,0 +1,176 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.AK12Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +import static com.atsuishio.superbwarfare.event.ClientEventHandler.isProne; + +public class AK12ItemModel extends GeoModel { + + public static float fireRotY = 0f; + public static float fireRotZ = 0f; + public static float rotXBipod = 0f; + + @Override + public ResourceLocation getAnimationResource(AK12Item animatable) { + return ModUtils.loc("animations/ak12.animation.json"); + } + + @Override + public ResourceLocation getModelResource(AK12Item animatable) { + return ModUtils.loc("geo/ak12.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(AK12Item animatable) { + return ModUtils.loc("textures/item/ak12.png"); + } + + @Override + public void setCustomAnimations(AK12Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone scope1 = getAnimationProcessor().getBone("Scope1"); + GeoBone scope2 = getAnimationProcessor().getBone("Scope2"); + GeoBone scope3 = getAnimationProcessor().getBone("Scope3"); + GeoBone cross3 = getAnimationProcessor().getBone("Cross3"); + GeoBone frontSight = getAnimationProcessor().getBone("qianjimiao"); + GeoBone shuan = getAnimationProcessor().getBone("shuan"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + + float posY = switch (type) { + case 0 -> 0.781f; + case 1 -> 0.371f; + case 2 -> -0.021f; + case 3 -> -0.01f; + default -> 0f; + }; + float scaleZ = switch (type) { + case 0 -> 0.52f; + case 1 -> 0.6f; + case 2 -> 0.77f; + case 3 -> 0.78f; + default -> 0f; + }; + float posZ = switch (type) { + case 0 -> 3f; + case 1 -> 3.4f; + case 2 -> 4.1f; + case 3 -> 4.5f; + default -> 0f; + }; + + if (type == 2) { + frontSight.setPosY(-0.4f * (float) zp); + } + + gun.setPosX(1.96f * (float) zp); + + gun.setPosY(posY * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(posZ * (float) zp + (float) (0.5f * zpz)); + gun.setScaleZ(1f - (scaleZ * (float) zp)); + scope1.setScaleZ(1f - (0.4f * (float) zp)); + scope2.setScaleZ(1f - (0.3f * (float) zp)); + scope3.setScaleZ(1f - (0.7f * (float) zp)); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", !(gun.getPosX() > 1.85)); + + GeoBone shen; + if (zt < 0.5) { + shen = getAnimationProcessor().getBone("fireRootNormal"); + } else { + shen = switch (type) { + case 0 -> getAnimationProcessor().getBone("fireRoot0"); + case 1 -> getAnimationProcessor().getBone("fireRoot1"); + case 2 -> getAnimationProcessor().getBone("fireRoot2"); + case 3 -> getAnimationProcessor().getBone("fireRoot3"); + default -> getAnimationProcessor().getBone("fireRootNormal"); + }; + } + + fireRotY = (float) Mth.lerp(0.3f * times, fireRotY, 0.2f * ClientEventHandler.recoilHorizon * fpz); + fireRotZ = (float) Mth.lerp(2f * times, fireRotZ, (0.3f + 0.38 * fpz) * ClientEventHandler.recoilHorizon); + + shen.setPosX(-0.4f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread))); + shen.setPosY((float) (0.15f * fp + 0.18f * fr)); + shen.setPosZ((float) (0.245 * fp + 0.29f * fr + 0.55 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.08f * fr + 0.01f * fpz)); + shen.setRotY(fireRotY); + shen.setRotZ(fireRotZ); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.9 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.85 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + shuan.setPosZ(2.4f * (float) fp); + + cross3.setRotZ(0.01f * (float) (ClientEventHandler.recoilHorizon * fp)); + cross3.setPosY(-0.23f * (float) (fp + 2.3 * fr)); + + GeoBone l = getAnimationProcessor().getBone("l"); + GeoBone r = getAnimationProcessor().getBone("r"); + rotXBipod = Mth.lerp(1.5f * times, rotXBipod, isProne(player) ? -90 : 0); + l.setRotX(rotXBipod * Mth.DEG_TO_RAD); + r.setRotX(rotXBipod * Mth.DEG_TO_RAD); + + GeoBone root = getAnimationProcessor().getBone("root"); + + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.94 * zt); + float numP = (float) (1 - 0.8 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 1f, 0.35f); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/AK47ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/AK47ItemModel.java new file mode 100644 index 000000000..468d5eb94 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/AK47ItemModel.java @@ -0,0 +1,180 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.AK47Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +import static com.atsuishio.superbwarfare.event.ClientEventHandler.isProne; + +public class AK47ItemModel extends GeoModel { + + public static float fireRotY = 0f; + public static float fireRotZ = 0f; + public static float rotXBipod = 0f; + + @Override + public ResourceLocation getAnimationResource(AK47Item animatable) { + return ModUtils.loc("animations/ak.animation.json"); + } + + @Override + public ResourceLocation getModelResource(AK47Item animatable) { + return ModUtils.loc("geo/ak.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(AK47Item animatable) { + return ModUtils.loc("textures/item/ak47.png"); + } + + @Override + public void setCustomAnimations(AK47Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone scope = getAnimationProcessor().getBone("Scope1"); + GeoBone scope2 = getAnimationProcessor().getBone("Scope2"); + GeoBone scope3 = getAnimationProcessor().getBone("Scope3"); + GeoBone cross3 = getAnimationProcessor().getBone("Cross3"); + GeoBone shuan = getAnimationProcessor().getBone("shuan"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + + float posYAlt = switch (type) { + case 2 -> 0.45f; + case 3 -> 0.5f; + default -> 0f; + }; + + float posX = switch (type) { + case 0, 1, 3 -> 1.962f; + case 2 -> 1.852f; + default -> 0f; + }; + float posY = switch (type) { + case 0 -> 1.071f; + case 1 -> 0.261f; + case 2 -> 0.162f + posYAlt; + case 3 -> 0.099f + posYAlt; + default -> 0f; + }; + float scaleZ = switch (type) { + case 0 -> 0.55f; + case 1 -> 0.2f; + case 2 -> 0.87f; + case 3 -> 0.78f; + default -> 0f; + }; + float posZ = switch (type) { + case 0, 1 -> 2.8f; + case 2 -> 4.74f; + case 3 -> 3.9f; + default -> 0f; + }; + + gun.setPosX(posX * (float) zp); + gun.setPosY((posY) * (float) zp - (float) (0.2f * zpz) - posYAlt); + gun.setPosZ(posZ * (float) zp + (float) (0.5f * zpz)); + gun.setScaleZ(1f - (scaleZ * (float) zp)); + scope.setScaleZ(1f - (0.4f * (float) zp)); + scope2.setScaleZ(1f - (0.3f * (float) zp)); + scope3.setScaleZ(1f - (0.7f * (float) zp)); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", !(gun.getPosX() > 1.8)); + + GeoBone shen; + if (zt < 0.5) { + shen = getAnimationProcessor().getBone("fireRootNormal"); + } else { + shen = switch (type) { + case 0 -> getAnimationProcessor().getBone("fireRoot0"); + case 1 -> getAnimationProcessor().getBone("fireRoot1"); + case 2 -> getAnimationProcessor().getBone("fireRoot2"); + case 3 -> getAnimationProcessor().getBone("fireRoot3"); + default -> getAnimationProcessor().getBone("fireRootNormal"); + }; + } + + fireRotY = (float) Mth.lerp(0.3f * times, fireRotY, 0.2f * ClientEventHandler.recoilHorizon * fpz); + fireRotZ = (float) Mth.lerp(2f * times, fireRotZ, (0.4f + 0.5 * fpz) * ClientEventHandler.recoilHorizon); + + shen.setPosX(-0.4f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread))); + shen.setPosY((float) (0.15f * fp + 0.18f * fr)); + shen.setPosZ((float) (0.375 * fp + 0.44f * fr + 0.75 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.08f * fr + 0.01f * fpz)); + shen.setRotY(fireRotY); + shen.setRotZ(fireRotZ); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.9 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.85 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + shuan.setPosZ(2.4f * (float) fp); + + cross3.setRotZ(0.01f * (float) (ClientEventHandler.recoilHorizon * fp)); + cross3.setPosY(-0.23f * (float) (fp + 2.3 * fr)); + + GeoBone l = getAnimationProcessor().getBone("l"); + GeoBone r = getAnimationProcessor().getBone("r"); + rotXBipod = Mth.lerp(1.5f * times, rotXBipod, isProne(player) ? -90 : 0); + l.setRotX(rotXBipod * Mth.DEG_TO_RAD); + r.setRotX(rotXBipod * Mth.DEG_TO_RAD); + + GeoBone root = getAnimationProcessor().getBone("root"); + + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.98 * zt); + float numP = (float) (1 - 0.92 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 1f, 0.35f); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/Aa12ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Aa12ItemModel.java new file mode 100644 index 000000000..e9543fd1d --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Aa12ItemModel.java @@ -0,0 +1,103 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.shotgun.Aa12Item; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class Aa12ItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(Aa12Item animatable) { + return ModUtils.loc("animations/aa12.animation.json"); + } + + @Override + public ResourceLocation getModelResource(Aa12Item animatable) { + return ModUtils.loc("geo/aa12.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(Aa12Item animatable) { + return ModUtils.loc("textures/item/aa12_new.png"); + } + + @Override + public void setCustomAnimations(Aa12Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(2.105f * (float) zp); + gun.setPosY(0.17f * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(0.1f * (float) zp + (float) (0.3f * zpz)); + gun.setRotZ((float) (0.02f * zpz)); + gun.setScaleZ(1f - (0.4f * (float) zp)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.4f * fp + 0.44f * fr)); + shen.setPosZ((float) (5.825 * fp + 0.34f * fr + 2.35 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.15f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.7 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.87 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + shen.setPosX(0.2f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread))); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + float numR = (float) (1 - 0.82 * zt); + float numP = (float) (1 - 0.68 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 1f, 0.55f); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/BocekItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/BocekItemModel.java new file mode 100644 index 000000000..34fe29ec7 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/BocekItemModel.java @@ -0,0 +1,129 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.special.BocekItem; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class BocekItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(BocekItem animatable) { + return ModUtils.loc("animations/bocek.animation.json"); + } + + @Override + public ResourceLocation getModelResource(BocekItem animatable) { + return ModUtils.loc("geo/bocek.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(BocekItem animatable) { + return ModUtils.loc("textures/item/bocek.png"); + } + + @Override + public void setCustomAnimations(BocekItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone arrow = getAnimationProcessor().getBone("arrow"); + GeoBone rh = getAnimationProcessor().getBone("ys"); + GeoBone lun = getAnimationProcessor().getBone("hualun1"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone shen_pos = getAnimationProcessor().getBone("shen_pos"); + GeoBone xian = getAnimationProcessor().getBone("xian1"); + GeoBone xian2 = getAnimationProcessor().getBone("xian2"); + GeoBone fire = getAnimationProcessor().getBone("fire"); + GeoBone deng = getAnimationProcessor().getBone("deng"); + GeoBone deng2 = getAnimationProcessor().getBone("deng2"); + GeoBone deng3 = getAnimationProcessor().getBone("deng3"); + GeoBone lh = getAnimationProcessor().getBone("lh"); + GeoBone r = getAnimationProcessor().getBone("r"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + double pp = ClientEventHandler.pullPos; + double bp = ClientEventHandler.bowPos; + double hp = ClientEventHandler.handPos; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + + arrow.setPosZ(9f * (float) bp); + rh.setPosZ(9f * (float) hp); + rh.setRotZ((float) (160 * Mth.DEG_TO_RAD + 45 * Mth.DEG_TO_RAD * ClientEventHandler.handTimer)); + lun.setRotX(1.6f * (float) bp); + + xian.setRotX(0.56f * (float) bp); + xian2.setRotX(-0.56f * (float) bp); + xian.setScaleY(1f + (0.25f * (float) bp)); + xian2.setScaleY(1f + (0.25f * (float) bp)); + xian.setPosZ(9f * (float) bp); + xian2.setPosZ(9f * (float) bp); + + gun.setScaleZ(1f - (0.2f * (float) pp)); + gun.setRotZ((float) (-0.1 + 0.2f * pp + 0.07142857142857143f * ClientEventHandler.pullTimer)); + gun.setRotX(0.01f * (float) pp); + gun.setPosZ((float) (3 + -3f * pp - 2.142857142857143 * ClientEventHandler.pullTimer)); + gun.setPosY(0.1f * (float) pp); + r.setScaleZ(1f - (0.2f * (float) pp)); + deng2.setRotX(1.6f * (float) bp); + deng2.setPosZ(0.05f * (float) bp); + deng3.setRotX(-1.6f * (float) bp); + deng3.setPosZ(0.05f * (float) bp); + deng.setScaleZ(1f + (0.07f * (float) bp)); + + lh.setRotX(0.2f * (float) zp); + shen_pos.setPosX(-3.64f * (float) zp); + shen_pos.setPosY(6.46f * (float) zp - (float) (0.2f * zpz)); + shen_pos.setPosZ(6.4f * (float) zp + (float) (0.3f * zpz)); + r.setScaleZ(1f - (0.31f * (float) zp)); + shen.setRotZ(60 * Mth.DEG_TO_RAD * (float) zp + (float) (0.05f * zpz) - 0.2f); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", !((shen_pos.getPosX() < -0.6 && gun.getPosZ() < -2))); + + fire.setPosX((float) (0.75f * ClientEventHandler.recoilHorizon * fpz * fp)); + fire.setPosY((float) (-0.03f * fp - 0.06f * fr)); + fire.setPosZ((float) (0.625 * fp + 0.34f * fr + 0.95 * fpz)); + fire.setRotX((float) (0.001f * fp + 0.001f * fr + 0.001f * fpz)); + fire.setRotY((float) (0.01f * ClientEventHandler.recoilHorizon * fpz)); + fire.setRotZ((float) ((0.02f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + CrossHairOverlay.gunRot = fire.getRotZ(); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/DevotionItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/DevotionItemModel.java new file mode 100644 index 000000000..267767a27 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/DevotionItemModel.java @@ -0,0 +1,119 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.machinegun.DevotionItem; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +import static com.atsuishio.superbwarfare.event.ClientEventHandler.isProne; + +public class DevotionItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(DevotionItem animatable) { + return ModUtils.loc("animations/devotion.animation.json"); + } + + @Override + public ResourceLocation getModelResource(DevotionItem animatable) { + return ModUtils.loc("geo/devotion.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(DevotionItem animatable) { + return ModUtils.loc("textures/item/devotion.png"); + } + + @Override + public void setCustomAnimations(DevotionItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone l = getAnimationProcessor().getBone("l"); + GeoBone r = getAnimationProcessor().getBone("r"); + GeoBone bolt = getAnimationProcessor().getBone("bolt2"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(2.17f * (float) zp); + gun.setPosY(0.17f * (float) zp - (float) (0.5f * zpz)); + gun.setPosZ(8.8f * (float) zp + (float) (0.6f * zpz)); + gun.setRotZ((float) (0.05f * zpz)); + gun.setScaleZ(1f - (0.7f * (float) zp)); + + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone holo = getAnimationProcessor().getBone("holo"); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", !(gun.getPosX() > 1.8)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.15f * fp + 0.18f * fr)); + shen.setPosZ((float) (0.315 * fp + 0.34f * fr + 0.65 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.05f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.04f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.5 * zt))); + shen.setPosY((float) (shen.getPosY() * (-1 + 0.9 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.3 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.9 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.9 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.9 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + bolt.setPosZ(-2f * (float) fp); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + if (isProne(player)) { + l.setRotX(1.5f); + r.setRotX(1.5f); + } + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.82 * zt); + float numP = (float) (1 - 0.78 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 1f, 0.55f); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/Glock17ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Glock17ItemModel.java new file mode 100644 index 000000000..9599aa158 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Glock17ItemModel.java @@ -0,0 +1,143 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.handgun.Glock17Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class Glock17ItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(Glock17Item animatable) { + return ModUtils.loc("animations/glock17.animation.json"); + } + + @Override + public ResourceLocation getModelResource(Glock17Item animatable) { + return ModUtils.loc("geo/glock17.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(Glock17Item animatable) { + return ModUtils.loc("textures/item/glock17.png"); + } + + @Override + public void setCustomAnimations(Glock17Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone slide = getAnimationProcessor().getBone("huatao"); + GeoBone bullet = getAnimationProcessor().getBone("bullet"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 20 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(1.23f * (float) zp); + + gun.setPosY(1.43f * (float) zp - (float) (0.2f * zpz)); + + gun.setPosZ(7f * (float) zp + (float) (0.3f * zpz)); + + gun.setScaleZ(1f - (0.55f * (float) zp)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.25f * fp + 0.28f * fr)); + shen.setPosZ((float) (2.375 * fp + 0.44f * fr + 0.75 * fpz)); + shen.setRotX((float) (0.1f * fp + 0.15f * fr + 0.15f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.3 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.8 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + slide.setPosZ(1.5f * (float) fp); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.12 * zt); + float numP = (float) (1 - 0.68 * zt); + + if (GunsTool.getGunIntTag(stack, "ReloadTime") > 0) { + main.setRotX(numR * main.getRotX()); + main.setRotY(numR * main.getRotY()); + main.setRotZ(numR * main.getRotZ()); + main.setPosX(numP * main.getPosX()); + main.setPosY(numP * main.getPosY()); + main.setPosZ(numP * main.getPosZ()); + camera.setRotX(numR * camera.getRotX()); + camera.setRotY(numR * camera.getRotY()); + camera.setRotZ(numR * camera.getRotZ()); + } + + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 0.7f, 1f); + + GeoBone shell = getAnimationProcessor().getBone("shell"); + GeoBone barrel = getAnimationProcessor().getBone("guan"); + if (GunsTool.getGunBooleanTag(stack, "HoldOpen")) { + slide.setPosZ(1.5f); + barrel.setRotX(4 * Mth.DEG_TO_RAD); + bullet.setScaleX(0); + bullet.setScaleY(0); + bullet.setScaleZ(0); + + shell.setScaleX(0); + shell.setScaleY(0); + shell.setScaleZ(0); + } else { + barrel.setRotX(0); + bullet.setScaleX(1); + bullet.setScaleY(1); + bullet.setScaleZ(1); + + shell.setScaleX(1); + shell.setScaleY(1); + shell.setScaleZ(1); + } + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/Glock18ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Glock18ItemModel.java new file mode 100644 index 000000000..eea3b0640 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Glock18ItemModel.java @@ -0,0 +1,153 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.handgun.Glock18Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class Glock18ItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(Glock18Item animatable) { + return ModUtils.loc("animations/glock17.animation.json"); + } + + @Override + public ResourceLocation getModelResource(Glock18Item animatable) { + return ModUtils.loc("geo/glock18.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(Glock18Item animatable) { + return ModUtils.loc("textures/item/glock17.png"); + } + + @Override + public void setCustomAnimations(Glock18Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone slide = getAnimationProcessor().getBone("huatao"); + GeoBone bullet = getAnimationProcessor().getBone("bullet"); + GeoBone switch_ = getAnimationProcessor().getBone("kuaimanji"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + int mode = GunsTool.getGunIntTag(stack, "FireMode"); + if (mode == 0) { + switch_.setRotX(35 * Mth.DEG_TO_RAD); + } + if (mode == 2) { + switch_.setRotX(0); + } + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 20 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(1.23f * (float) zp); + + gun.setPosY(1.43f * (float) zp - (float) (0.2f * zpz)); + + gun.setPosZ(7f * (float) zp + (float) (0.3f * zpz)); + + gun.setScaleZ(1f - (0.55f * (float) zp)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.25f * fp + 0.28f * fr)); + shen.setPosZ((float) (2.375 * fp + 0.44f * fr + 0.75 * fpz)); + shen.setRotX((float) (0.1f * fp + 0.15f * fr + 0.15f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.3 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.8 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + slide.setPosZ(1.5f * (float) fp); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + + float numR = (float) (1 - 0.12 * zt); + float numP = (float) (1 - 0.68 * zt); + + if (GunsTool.getGunIntTag(stack, "ReloadTime") > 0) { + main.setRotX(numR * main.getRotX()); + main.setRotY(numR * main.getRotY()); + main.setRotZ(numR * main.getRotZ()); + main.setPosX(numP * main.getPosX()); + main.setPosY(numP * main.getPosY()); + main.setPosZ(numP * main.getPosZ()); + camera.setRotX(numR * camera.getRotX()); + camera.setRotY(numR * camera.getRotY()); + camera.setRotZ(numR * camera.getRotZ()); + } + + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 0.7f, 1f); + + GeoBone shell = getAnimationProcessor().getBone("shell"); + GeoBone barrel = getAnimationProcessor().getBone("guan"); + if (GunsTool.getGunBooleanTag(stack, "HoldOpen")) { + slide.setPosZ(1.5f); + barrel.setRotX(4 * Mth.DEG_TO_RAD); + bullet.setScaleX(0); + bullet.setScaleY(0); + bullet.setScaleZ(0); + + shell.setScaleX(0); + shell.setScaleY(0); + shell.setScaleZ(0); + } else { + barrel.setRotX(0); + bullet.setScaleX(1); + bullet.setScaleY(1); + bullet.setScaleZ(1); + + shell.setScaleX(1); + shell.setScaleY(1); + shell.setScaleZ(1); + } + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/Hk416ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Hk416ItemModel.java new file mode 100644 index 000000000..d87afc323 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Hk416ItemModel.java @@ -0,0 +1,176 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.Hk416Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +import static com.atsuishio.superbwarfare.event.ClientEventHandler.isProne; + +public class Hk416ItemModel extends GeoModel { + + public static float fireRotY = 0f; + public static float fireRotZ = 0f; + public static float rotXBipod = 0f; + + @Override + public ResourceLocation getAnimationResource(Hk416Item animatable) { + return ModUtils.loc("animations/m4.animation.json"); + } + + @Override + public ResourceLocation getModelResource(Hk416Item animatable) { + return ModUtils.loc("geo/hk416.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(Hk416Item animatable) { + return ModUtils.loc("textures/item/hk416.png"); + } + + @Override + public void setCustomAnimations(Hk416Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone scope = getAnimationProcessor().getBone("Scope1"); + GeoBone scope2 = getAnimationProcessor().getBone("Scope2"); + GeoBone scope3 = getAnimationProcessor().getBone("Scope3"); + GeoBone cross1 = getAnimationProcessor().getBone("Cross1"); + GeoBone cross2 = getAnimationProcessor().getBone("Cross2"); + GeoBone cross3 = getAnimationProcessor().getBone("Cross3"); + GeoBone kuaimanji = getAnimationProcessor().getBone("kuaimanji"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 17 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + + float posY = switch (type) { + case 0 -> 1.04f; + case 1 -> 0.52f; + case 2 -> 0.385f; + case 3 -> 0.46f; + default -> 0f; + }; + float scaleZ = switch (type) { + case 0 -> 0.2f; + case 1 -> 0.4f; + case 2 -> 0.8f; + case 3 -> 0.78f; + default -> 0f; + }; + float posZ = switch (type) { + case 0 -> 3f; + case 1 -> 3.5f; + case 2 -> 7.4f; + case 3 -> 6.8f; + default -> 0f; + }; + + gun.setPosX(3.3055f * (float) zp); + gun.setPosY(posY * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(posZ * (float) zp + (float) (0.3f * zpz)); + gun.setRotZ((float) (0.05f * zpz)); + gun.setScaleZ(1f - (scaleZ * (float) zp)); + scope.setScaleZ(1f - (0.6f * (float) zp)); + scope2.setScaleZ(1f - (0.8f * (float) zp)); + scope3.setScaleZ(1f - (0.5f * (float) zp)); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", !(gun.getPosX() > 3.1)); + + GeoBone shen; + if (zt < 0.5) { + shen = getAnimationProcessor().getBone("fireRootNormal"); + } else { + shen = switch (type) { + case 0 -> getAnimationProcessor().getBone("fireRoot0"); + case 1 -> getAnimationProcessor().getBone("fireRoot1"); + case 2 -> getAnimationProcessor().getBone("fireRoot2"); + case 3 -> getAnimationProcessor().getBone("fireRoot3"); + default -> getAnimationProcessor().getBone("fireRootNormal"); + }; + } + + fireRotY = (float) Mth.lerp(0.5f * times, fireRotY, 0.2f * ClientEventHandler.recoilHorizon * fpz); + fireRotZ = (float) Mth.lerp(2f * times, fireRotZ, (0.2f + 0.3 * fpz) * ClientEventHandler.recoilHorizon); + + shen.setPosX(-0.4f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread))); + shen.setPosY((float) (0.15f * fp + 0.18f * fr)); + shen.setPosZ((float) (0.375 * fp + 0.44f * fr + 0.75 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.05f * fr + 0.01f * fpz)); + shen.setRotY(fireRotY); + shen.setRotZ(fireRotZ); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.1 * zt))); + shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.1 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - (type == 3 ? 0.96 : type == 1 ? 0.8 : 0.9) * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - (type == 3 ? 0.95 : 0.9) * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + cross1.setPosY(-0.75f * (float) fpz); + cross2.setPosY(-0.7f * (float) fpz); + cross3.setPosY(-0.2f * (float) fpz); + + GeoBone l = getAnimationProcessor().getBone("l"); + GeoBone r = getAnimationProcessor().getBone("r"); + rotXBipod = Mth.lerp(1.5f * times, rotXBipod, isProne(player) ? -90 : 0); + l.setRotX(rotXBipod * Mth.DEG_TO_RAD); + r.setRotX(rotXBipod * Mth.DEG_TO_RAD); + + int mode = GunsTool.getGunIntTag(stack, "FireMode"); + + kuaimanji.setRotX(mode == 2 ? 90 * Mth.DEG_TO_RAD : 0); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.985 * zt); + float numP = (float) (1 - 0.92 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 1f, 0.55f); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/HomemadeShotgunItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/HomemadeShotgunItemModel.java new file mode 100644 index 000000000..e8ba20b55 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/HomemadeShotgunItemModel.java @@ -0,0 +1,96 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.shotgun.HomemadeShotgunItem; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class HomemadeShotgunItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(HomemadeShotgunItem animatable) { + return ModUtils.loc("animations/homemade_shotgun.animation.json"); + } + + @Override + public ResourceLocation getModelResource(HomemadeShotgunItem animatable) { + return ModUtils.loc("geo/homemade_shotgun.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(HomemadeShotgunItem animatable) { + return ModUtils.loc("textures/item/homemade_shotgun.png"); + } + + @Override + public void setCustomAnimations(HomemadeShotgunItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 7 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(2.45f * (float) zp); + + gun.setPosY(1.7f * (float) zp - (float) (0.4f * zpz)); + + gun.setPosZ(2f * (float) zp + (float) (0.3f * zpz)); + + gun.setRotZ((float) (0.05f * zpz)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.4f * fp + 0.44f * fr)); + shen.setPosZ((float) (5.825 * fp + 0.34f * fr + 2.35 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.15f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.42 * zt); + float numP = (float) (1 - 0.48 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/HuntingRifleItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/HuntingRifleItemModel.java new file mode 100644 index 000000000..c258ef836 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/HuntingRifleItemModel.java @@ -0,0 +1,105 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.sniper.HuntingRifleItem; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class HuntingRifleItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(HuntingRifleItem animatable) { + return ModUtils.loc("animations/hunting_rifle.animation.json"); + } + + @Override + public ResourceLocation getModelResource(HuntingRifleItem animatable) { + return ModUtils.loc("geo/hunting_rifle.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(HuntingRifleItem animatable) { + return ModUtils.loc("textures/item/hunting_rifle.png"); + } + + @Override + public void setCustomAnimations(HuntingRifleItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("lieqiang"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 7 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(1.95f * (float) zp); + + gun.setPosY(1.32f * (float) zp - (float) (0.2f * zpz)); + + gun.setPosZ(3f * (float) zp + (float) (0.5f * zpz)); + + gun.setRotZ((float) (0.05f * zpz)); + + gun.setScaleZ(1f - (0.5f * (float) zp)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.4f * fp + 0.44f * fr)); + shen.setPosZ((float) (2.825 * fp + 0.17f * fr + 1.175 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.2f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.7 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.87 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.82 * zt); + float numP = (float) (1 - 0.78 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/JavelinItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/JavelinItemModel.java new file mode 100644 index 000000000..29e61790f --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/JavelinItemModel.java @@ -0,0 +1,91 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.launcher.JavelinItem; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class JavelinItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(JavelinItem animatable) { + return ModUtils.loc("animations/javelin.animation.json"); + } + + @Override + public ResourceLocation getModelResource(JavelinItem animatable) { + return ModUtils.loc("geo/javelin.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(JavelinItem animatable) { + return ModUtils.loc("textures/item/javelin.png"); + } + + @Override + public void setCustomAnimations(JavelinItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone javelin = getAnimationProcessor().getBone("javelin"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(1.66f * (float) zp + (float) (0.2f * zpz)); + gun.setPosY(5.5f * (float) zp + (float) (0.8f * zpz)); + gun.setPosZ(15.9f * (float) zp); + gun.setScaleZ(1f - (0.8f * (float) zp)); + gun.setRotZ(-4.75f * Mth.DEG_TO_RAD * (float) zp + (float) (0.02f * zpz)); + + javelin.setHidden(gun.getPosZ() > 15.85); + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", !(gun.getPosZ() > 15.85)); + + shen.setPosX((float) (0.75f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (-0.03f * fp - 0.06f * fr)); + shen.setPosZ((float) (0.725 * fp + 0.34f * fr + 0.95 * fpz)); + shen.setRotX((float) (0.03f * fp + 0.02f * fr + 0.02f * fpz)); + shen.setRotY((float) (0.07f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/K98ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/K98ItemModel.java new file mode 100644 index 000000000..d00a34cd7 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/K98ItemModel.java @@ -0,0 +1,130 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.sniper.K98Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class K98ItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(K98Item animatable) { + return ModUtils.loc("animations/k98.animation.json"); + } + + @Override + public ResourceLocation getModelResource(K98Item animatable) { + return ModUtils.loc("geo/kar98k.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(K98Item animatable) { + return ModUtils.loc("textures/item/k98.png"); + } + + @Override + public void setCustomAnimations(K98Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone clip = getAnimationProcessor().getBone("mag"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + + if (NBTTool.getOrCreateTag(stack).getDouble("prepare") > 11 && GunsTool.getGunIntTag(stack, "Ammo", 0) == 1) { + clip.setScaleX(0); + clip.setScaleY(0); + clip.setScaleZ(0); + } else { + clip.setScaleX(1); + clip.setScaleY(1); + clip.setScaleZ(1); + } + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 8 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(2.11f * (float) zp); + gun.setPosY(1.52f * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(10f * (float) zp + (float) (0.3f * zpz)); + gun.setScaleZ(1f - (0.7f * (float) zp)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.4f * fp + 0.44f * fr)); + shen.setPosZ((float) (2.825 * fp + 0.17f * fr + 1.175 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.15f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.7 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.87 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + GeoBone body = getAnimationProcessor().getBone("roll"); + + float numR = (float) (1 - 0.52 * zt); + float numP = (float) (1 - 0.58 * zt); + + if (GunsTool.getGunIntTag(stack, "ReloadTime") > 0 || GunsTool.getGunBooleanTag(stack, "Reloading")) { + main.setRotX(numR * main.getRotX()); + main.setRotY(numR * main.getRotY()); + main.setRotZ(numR * main.getRotZ()); + main.setPosX(numP * main.getPosX()); + main.setPosY(numP * main.getPosY()); + main.setPosZ(numP * main.getPosZ()); + body.setRotX(numR * body.getRotX()); + body.setRotY(numR * body.getRotY()); + body.setRotZ(numR * body.getRotZ()); + body.setPosX(numP * body.getPosX()); + body.setPosY(numP * body.getPosY()); + body.setPosZ(numP * body.getPosZ()); + camera.setRotX(numR * camera.getRotX()); + camera.setRotY(numR * camera.getRotY()); + camera.setRotZ(numR * camera.getRotZ()); + } + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/M1911ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M1911ItemModel.java new file mode 100644 index 000000000..a9e955eef --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M1911ItemModel.java @@ -0,0 +1,142 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.handgun.M1911Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class M1911ItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(M1911Item animatable) { + return ModUtils.loc("animations/glock17.animation.json"); + } + + @Override + public ResourceLocation getModelResource(M1911Item animatable) { + return ModUtils.loc("geo/m1911.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(M1911Item animatable) { + return ModUtils.loc("textures/item/m1911.png"); + } + + @Override + public void setCustomAnimations(M1911Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone slide = getAnimationProcessor().getBone("huatao"); + GeoBone bullet = getAnimationProcessor().getBone("bullet"); + GeoBone hammer = getAnimationProcessor().getBone("hammer"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 7 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(1.23f * (float) zp); + + gun.setPosY(1.53f * (float) zp - (float) (0.2f * zpz)); + + gun.setPosZ(7f * (float) zp + (float) (0.3f * zpz)); + + gun.setScaleZ(1f - (0.55f * (float) zp)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.25f * fp + 0.28f * fr)); + shen.setPosZ((float) (2.375 * fp + 0.44f * fr + 0.75 * fpz)); + shen.setRotX((float) (0.15f * fp + 0.3f * fr + 0.3f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.3 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.5 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + slide.setPosZ(2.75f * (float) fp); + hammer.setRotX(60 * Mth.DEG_TO_RAD + (120 * Mth.DEG_TO_RAD * (float) fp)); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.12 * zt); + float numP = (float) (1 - 0.68 * zt); + + if (GunsTool.getGunIntTag(stack, "ReloadTime") > 0) { + main.setRotX(numR * main.getRotX()); + main.setRotY(numR * main.getRotY()); + main.setRotZ(numR * main.getRotZ()); + main.setPosX(numP * main.getPosX()); + main.setPosY(numP * main.getPosY()); + main.setPosZ(numP * main.getPosZ()); + camera.setRotX(numR * camera.getRotX()); + camera.setRotY(numR * camera.getRotY()); + camera.setRotZ(numR * camera.getRotZ()); + } + + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 0.7f, 1f); + GeoBone shell = getAnimationProcessor().getBone("shell"); + + if (GunsTool.getGunBooleanTag(stack, "HoldOpen")) { + slide.setPosZ(1.5f); + bullet.setScaleX(0); + bullet.setScaleY(0); + bullet.setScaleZ(0); + + shell.setScaleX(0); + shell.setScaleY(0); + shell.setScaleZ(0); + } else { + bullet.setScaleX(1); + bullet.setScaleY(1); + bullet.setScaleZ(1); + + shell.setScaleX(1); + shell.setScaleY(1); + shell.setScaleZ(1); + } + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/M4ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M4ItemModel.java new file mode 100644 index 000000000..4aa8c2455 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M4ItemModel.java @@ -0,0 +1,204 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.M4Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +import static com.atsuishio.superbwarfare.event.ClientEventHandler.isProne; + +public class M4ItemModel extends GeoModel { + + public static float posYAlt = 0.5625f; + public static float scaleZAlt = 0.88f; + public static float posZAlt = 7.6f; + public static float rotXSight = 0f; + public static float rotXBipod = 0f; + public static float fireRotY = 0f; + public static float fireRotZ = 0f; + + @Override + public ResourceLocation getAnimationResource(M4Item animatable) { + return ModUtils.loc("animations/m4.animation.json"); + } + + @Override + public ResourceLocation getModelResource(M4Item animatable) { + return ModUtils.loc("geo/m4.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(M4Item animatable) { + return ModUtils.loc("textures/item/m4.png"); + } + + @Override + public void setCustomAnimations(M4Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone scope = getAnimationProcessor().getBone("Scope1"); + GeoBone scope2 = getAnimationProcessor().getBone("Scope2"); + GeoBone scope3 = getAnimationProcessor().getBone("Scope3"); + GeoBone cross1 = getAnimationProcessor().getBone("Cross1"); + GeoBone cross2 = getAnimationProcessor().getBone("Cross2"); + GeoBone cross3 = getAnimationProcessor().getBone("Cross3"); + GeoBone lh = getAnimationProcessor().getBone("Lefthand"); + GeoBone crossAlt = getAnimationProcessor().getBone("CrossAlt"); + GeoBone sight1fold = getAnimationProcessor().getBone("sight1fold"); + GeoBone sight2fold = getAnimationProcessor().getBone("sight2fold"); + GeoBone button = getAnimationProcessor().getBone("button"); + GeoBone button6 = getAnimationProcessor().getBone("button6"); + GeoBone button7 = getAnimationProcessor().getBone("button7"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 17 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + + posYAlt = Mth.lerp(times, posYAlt, NBTTool.getOrCreateTag(stack).getBoolean("ScopeAlt") ? -0.6875f : 0.5625f); + scaleZAlt = Mth.lerp(times, scaleZAlt, NBTTool.getOrCreateTag(stack).getBoolean("ScopeAlt") ? 0.4f : 0.88f); + posZAlt = Mth.lerp(times, posZAlt, NBTTool.getOrCreateTag(stack).getBoolean("ScopeAlt") ? 5.5f : 7.6f); + rotXSight = Mth.lerp(1.5f * times, rotXSight, type == 0 ? 0 : 90); + + float posY = switch (type) { + case 0 -> 0.65f; + case 1 -> 0.2225f; + case 2 -> posYAlt; + case 3 -> 0.6525f; + default -> 0f; + }; + float scaleZ = switch (type) { + case 0 -> 0.2f; + case 1 -> 0.4f; + case 2 -> scaleZAlt; + case 3 -> 0.94f; + default -> 0f; + }; + float posZ = switch (type) { + case 0 -> 3f; + case 1 -> 3.5f; + case 2 -> posZAlt; + case 3 -> 8.4f; + default -> 0f; + }; + + sight1fold.setRotX(rotXSight * Mth.DEG_TO_RAD); + sight2fold.setRotX(rotXSight * Mth.DEG_TO_RAD); + + gun.setPosX(2.935f * (float) zp); + gun.setPosY(posY * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(posZ * (float) zp + (float) (0.2f * zpz)); + gun.setScaleZ(1f - (scaleZ * (float) zp)); + gun.setRotZ((float) (0.05f * zpz)); + scope.setScaleZ(1f - (0.4f * (float) zp)); + scope2.setScaleZ(1f - (0.4f * (float) zp)); + scope3.setScaleZ(1f + (0.2f * (float) zp)); + + button.setScaleY(1f - (0.85f * (float) zp)); + button6.setScaleX(1f - (0.5f * (float) zp)); + button7.setScaleX(1f - (0.5f * (float) zp)); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", !(gun.getPosX() > 2.385)); + + if (type == 3 && zt > 0.5) { + lh.setPosY((float) (-zt * 4)); + } + GeoBone shen; + if (zt < 0.5) { + shen = getAnimationProcessor().getBone("fireRootNormal"); + } else { + shen = switch (type) { + case 0 -> getAnimationProcessor().getBone("fireRoot0"); + case 1 -> getAnimationProcessor().getBone("fireRoot1"); + case 2 -> getAnimationProcessor().getBone("fireRoot2"); + case 3 -> getAnimationProcessor().getBone("fireRoot3"); + default -> getAnimationProcessor().getBone("fireRootNormal"); + }; + } + + fireRotY = (float) Mth.lerp(0.5f * times, fireRotY, 0.2f * ClientEventHandler.recoilHorizon * fpz); + fireRotZ = (float) Mth.lerp(2f * times, fireRotZ, (0.2f + 0.3 * fpz) * ClientEventHandler.recoilHorizon); + + shen.setPosX(-0.4f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread))); + shen.setPosY((float) (0.15f * fp + 0.18f * fr)); + shen.setPosZ((float) (0.375 * fp + 0.44f * fr + 0.75 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.05f * fr + 0.01f * fpz)); + shen.setRotY(fireRotY); + shen.setRotZ(fireRotZ); + + cross1.setPosY(-0.25f * (float) fpz); + cross2.setPosY(-0.1f * (float) fpz); + crossAlt.setPosY(-0.2f * (float) fpz); + cross3.setPosY(-0.2f * (float) fpz); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.1 * zt))); + shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.1 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - (type == 3 ? 0.96 : type == 1 ? 0.8 : 0.9) * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - (type == 3 ? 0.95 : 0.9) * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + GeoBone flare = getAnimationProcessor().getBone("flare"); + int BarrelType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.BARREL); + + if (BarrelType == 1) { + flare.setPosZ(-2); + } + + GeoBone l = getAnimationProcessor().getBone("l"); + GeoBone r = getAnimationProcessor().getBone("r"); + rotXBipod = Mth.lerp(1.5f * times, rotXBipod, isProne(player) ? -90 : 0); + l.setRotX(rotXBipod * Mth.DEG_TO_RAD); + r.setRotX(rotXBipod * Mth.DEG_TO_RAD); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.985 * zt); + float numP = (float) (1 - 0.92 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 1f, 0.55f); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/M60ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M60ItemModel.java new file mode 100644 index 000000000..ca9232521 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M60ItemModel.java @@ -0,0 +1,174 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.machinegun.M60Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +import static com.atsuishio.superbwarfare.event.ClientEventHandler.isProne; + +public class M60ItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(M60Item animatable) { + return ModUtils.loc("animations/m60.animation.json"); + } + + @Override + public ResourceLocation getModelResource(M60Item animatable) { + return ModUtils.loc("geo/m60.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(M60Item animatable) { + return ModUtils.loc("textures/item/m60.png"); + } + + @Override + public void setCustomAnimations(M60Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone tiba = getAnimationProcessor().getBone("tiba"); + GeoBone b1 = getAnimationProcessor().getBone("b1"); + GeoBone b2 = getAnimationProcessor().getBone("b2"); + GeoBone b3 = getAnimationProcessor().getBone("b3"); + GeoBone b4 = getAnimationProcessor().getBone("b4"); + GeoBone b5 = getAnimationProcessor().getBone("b5"); + GeoBone l = getAnimationProcessor().getBone("l"); + GeoBone r = getAnimationProcessor().getBone("r"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + if (isProne(player)) { + l.setRotX(1.5f); + r.setRotX(1.5f); + } + + int ammo = GunsTool.getGunIntTag(stack, "Ammo", 0); + boolean flag = GunsTool.getGunBooleanTag(stack, "HideBulletChain"); + + if (ammo < 5 && flag) { + b5.setScaleX(0); + b5.setScaleY(0); + b5.setScaleZ(0); + } + + if (ammo < 4 && flag) { + b4.setScaleX(0); + b4.setScaleY(0); + b4.setScaleZ(0); + } + + if (ammo < 3 && flag) { + b3.setScaleX(0); + b3.setScaleY(0); + b3.setScaleZ(0); + } + + if (ammo < 2 && flag) { + b2.setScaleX(0); + b2.setScaleY(0); + b2.setScaleZ(0); + } + + if (ammo < 1 && flag) { + b1.setScaleX(0); + b1.setScaleY(0); + b1.setScaleZ(0); + } + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(3.74f * (float) zp); + + gun.setPosY(-0.1f * (float) zp - (float) (0.1f * zpz)); + + gun.setPosZ(3.24f * (float) zp + (float) (0.3f * zpz)); + + gun.setRotZ(-0.087f * (float) zp + (float) (0.05f * zpz)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.15f * fp + 0.18f * fr)); + shen.setPosZ((float) (0.325 * fp + 0.34f * fr + 0.75 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.05f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.04f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.5 * zt))); + shen.setPosY((float) (shen.getPosY() * (-1 + 0.4 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.9 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.9 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.9 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + tiba.setRotZ((float) (-0.25f * fp + 0.4 * fr)); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.88 * zt); + float numP = (float) (1 - 0.28 * zt); + + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 1f, 0.45f); + GeoBone shell = getAnimationProcessor().getBone("shell"); + + if (GunsTool.getGunIntTag(stack, "ReloadTime") > 0) { + main.setRotX(numR * main.getRotX()); + main.setRotY(numR * main.getRotY()); + main.setRotZ(numR * main.getRotZ()); + main.setPosX(numP * main.getPosX()); + main.setPosY(numP * main.getPosY()); + main.setPosZ(numP * main.getPosZ()); + camera.setRotX(numR * camera.getRotX()); + camera.setRotY(numR * camera.getRotY()); + camera.setRotZ(numR * camera.getRotZ()); + shell.setScaleX(0); + shell.setScaleY(0); + shell.setScaleZ(0); + } else { + shell.setScaleX(1); + shell.setScaleY(1); + shell.setScaleZ(1); + } + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/M79ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M79ItemModel.java new file mode 100644 index 000000000..cea6207bb --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M79ItemModel.java @@ -0,0 +1,103 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.launcher.M79Item; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class M79ItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(M79Item animatable) { + return ModUtils.loc("animations/m79.animation.json"); + } + + @Override + public ResourceLocation getModelResource(M79Item animatable) { + return ModUtils.loc("geo/m79.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(M79Item animatable) { + return ModUtils.loc("textures/item/m79.png"); + } + + @Override + public void setCustomAnimations(M79Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("gun"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(2.2f * (float) zp); + + gun.setPosY(0.8f * (float) zp - (float) (0.7f * zpz)); + + gun.setPosZ((float) zp + (float) (0.6f * zpz)); + + gun.setRotZ((float) (0.05f * zpz)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.4f * fp + 0.44f * fr)); + shen.setPosZ((float) (5.825 * fp + 0.34f * fr + 2.35 * fpz)); + shen.setRotX((float) (0.02f * fp + 0.25f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.7 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.87 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.58 * zt); + float numP = (float) (1 - 0.58 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/M870ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M870ItemModel.java new file mode 100644 index 000000000..8a51ef4a0 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M870ItemModel.java @@ -0,0 +1,115 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.shotgun.M870Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class M870ItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(M870Item animatable) { + return ModUtils.loc("animations/m870.animation.json"); + } + + @Override + public ResourceLocation getModelResource(M870Item animatable) { + return ModUtils.loc("geo/m870.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(M870Item animatable) { + return ModUtils.loc("textures/item/m870.png"); + } + + @Override + public void setCustomAnimations(M870Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 7 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(1.7f * (float) zp); + + gun.setPosY(1.12f * (float) zp - (float) (0.2f * zpz)); + + gun.setPosZ(1.5f * (float) zp + (float) (0.9f * zpz)); + + gun.setRotZ((float) (0.02f * zpz)); + + gun.setScaleZ(1f - (0.2f * (float) zp)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.4f * fp + 0.44f * fr)); + shen.setPosZ((float) (5.825 * fp + 0.34f * fr + 2.35 * fpz)); + shen.setRotX((float) (0.02f * fp + 0.25f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.77 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.87 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("main"); + + float numR = (float) (1 - 0.72 * zt); + float numP = (float) (1 - 0.82 * zt); + + if (GunsTool.getGunBooleanTag(stack, "Reloading")) { + main.setRotX(numR * main.getRotX()); + main.setRotY(numR * main.getRotY()); + main.setRotZ(numR * main.getRotZ()); + main.setPosX(numP * main.getPosX()); + main.setPosY(numP * main.getPosY()); + main.setPosZ(numP * main.getPosZ()); + camera.setRotX(numR * camera.getRotX()); + camera.setRotY(numR * camera.getRotY()); + camera.setRotZ(numR * camera.getRotZ()); + } + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/M98bItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M98bItemModel.java new file mode 100644 index 000000000..f94bae431 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/M98bItemModel.java @@ -0,0 +1,128 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.sniper.M98bItem; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class M98bItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(M98bItem animatable) { + return ModUtils.loc("animations/m98b.animation.json"); + } + + @Override + public ResourceLocation getModelResource(M98bItem animatable) { + return ModUtils.loc("geo/m98b.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(M98bItem animatable) { + return ModUtils.loc("textures/item/m98b.png"); + } + + @Override + public void setCustomAnimations(M98bItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + GeoBone scope = getAnimationProcessor().getBone("scope2"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 7 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.4f * fp + 0.44f * fr)); + shen.setPosZ((float) (3.325 * fp + 0.34f * fr + 2.35 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.15f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.87 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + scope.setPosZ(75.2f * (float) (fp + 0.54f * fr)); + shen.setPosX(0.2f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread))); + + gun.setPosX(2.245f * (float) zp); + gun.setPosY(0.3f * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(4.2f * (float) zp + (float) (0.3f * zpz)); + gun.setRotZ((float) (0.02f * zpz)); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", !(gun.getPosX() > 1.8)); + + GeoBone root = getAnimationProcessor().getBone("root"); + GeoBone zhunxing = getAnimationProcessor().getBone("shi"); + + zhunxing.setPosX(75 * movePosX); + zhunxing.setPosY(75 * movePosY); + + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + float numR = (float) (1 - 0.88 * zt); + float numP = (float) (1 - 0.68 * zt); + + if (GunsTool.getGunIntTag(stack, "ReloadTime") > 0) { + main.setRotX(numR * main.getRotX()); + main.setRotY(numR * main.getRotY()); + main.setRotZ(numR * main.getRotZ()); + main.setPosX(numP * main.getPosX()); + main.setPosY(numP * main.getPosY()); + main.setPosZ(numP * main.getPosZ()); + camera.setRotX(numR * camera.getRotX()); + camera.setRotY(numR * camera.getRotY()); + camera.setRotZ(numR * camera.getRotZ()); + + scope.setRotX(numR * scope.getRotX()); + scope.setRotY(numR * scope.getRotY()); + scope.setRotZ(numR * scope.getRotZ()); + scope.setPosX(numP * scope.getPosX()); + scope.setPosY(numP * scope.getPosY()); + scope.setPosZ(numP * scope.getPosZ()); + } + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/MarlinItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/MarlinItemModel.java new file mode 100644 index 000000000..d5afa740e --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/MarlinItemModel.java @@ -0,0 +1,117 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.MarlinItem; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class MarlinItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(MarlinItem animatable) { + return ModUtils.loc("animations/marlin.animation.json"); + } + + @Override + public ResourceLocation getModelResource(MarlinItem animatable) { + return ModUtils.loc("geo/marlin.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(MarlinItem animatable) { + return ModUtils.loc("textures/item/marlin.png"); + } + + @Override + public void setCustomAnimations(MarlinItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone jichui = getAnimationProcessor().getBone("jichui"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 7 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(1.712f * (float) zp); + gun.setPosY(1.06f * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(3f * (float) zp + (float) (0.2f * zpz)); + gun.setRotZ((float) (0.02f * zpz)); + gun.setScaleZ(1f - (0.2f * (float) zp)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.4f * fp + 0.44f * fr)); + shen.setPosZ((float) (2.825 * fp + 0.17f * fr + 1.175 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.15f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.87 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + if (NBTTool.getOrCreateTag(stack).getBoolean("empty")) { + jichui.setRotX(-0.52f); + } + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.55 * zt); + float numP = (float) (1 - 0.88 * zt); + + if (GunsTool.getGunBooleanTag(stack, "Reloading")) { + main.setRotX(numR * main.getRotX()); + main.setRotY(numR * main.getRotY()); + main.setRotZ(numR * main.getRotZ()); + main.setPosX(numP * main.getPosX()); + main.setPosY(numP * main.getPosY()); + main.setPosZ(numP * main.getPosZ()); + camera.setRotX(numR * camera.getRotX()); + camera.setRotY(numR * camera.getRotY()); + camera.setRotZ(numR * camera.getRotZ()); + } + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/MinigunItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/MinigunItemModel.java new file mode 100644 index 000000000..95a389d3b --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/MinigunItemModel.java @@ -0,0 +1,84 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.machinegun.MinigunItem; +import com.atsuishio.superbwarfare.tools.GunsTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class MinigunItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(MinigunItem animatable) { + return ModUtils.loc("animations/minigun.animation.json"); + } + + @Override + public ResourceLocation getModelResource(MinigunItem animatable) { + return ModUtils.loc("geo/minigun.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(MinigunItem animatable) { + return ModUtils.loc("textures/item/minigun.png"); + } + + @Override + public void setCustomAnimations(MinigunItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("barrel"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + int rpm = GunsTool.getGunIntTag(stack, "RPM", 0); + + gun.setRotZ(gun.getRotZ() + times * -0.07f * ((float) rpm / 1200) * ClientEventHandler.miniGunRot); + + shen.setPosX((float) (0.75f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (-0.03f * fp - 0.06f * fr)); + shen.setPosZ((float) (0.625 * fp + 0.34f * fr + 1.15 * fpz)); + shen.setRotX((float) (0.02f * fp + 0.02f * fr + 0.02f * fpz)); + shen.setRotY((float) (0.02f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.02f + 0.02 * fr) * ClientEventHandler.recoilHorizon)); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/Mk14ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Mk14ItemModel.java new file mode 100644 index 000000000..b2d309887 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Mk14ItemModel.java @@ -0,0 +1,180 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.Mk14Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +import static com.atsuishio.superbwarfare.event.ClientEventHandler.isProne; + +public class Mk14ItemModel extends GeoModel { + + public static float fireRotY = 0f; + public static float fireRotZ = 0f; + public static float rotXBipod = 0f; + + @Override + public ResourceLocation getAnimationResource(Mk14Item animatable) { + return ModUtils.loc("animations/mk14ebr.animation.json"); + } + + @Override + public ResourceLocation getModelResource(Mk14Item animatable) { + return ModUtils.loc("geo/mk14ebr.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(Mk14Item animatable) { + return ModUtils.loc("textures/item/mk14.png"); + } + + @Override + public void setCustomAnimations(Mk14Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bones"); + GeoBone action = getAnimationProcessor().getBone("action"); + GeoBone scope2 = getAnimationProcessor().getBone("Scope2"); + GeoBone scope3 = getAnimationProcessor().getBone("Scope3"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + int stockType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK); + int barrelType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.BARREL); + int gripType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP); + + float posY = switch (type) { + case 0 -> 1.68f; + case 1 -> 0.23f; + case 2 -> -0.05f; + case 3 -> -0.07f; + default -> 0f; + }; + float scaleZ = switch (type) { + case 0 -> 0.4f; + case 1 -> 0.5f; + case 2 -> 0.8f; + case 3 -> 0.84f; + default -> 0f; + }; + float posZ = switch (type) { + case 0 -> 2f; + case 1 -> 3f; + case 2 -> 5f; + case 3 -> 5.2f; + default -> 0f; + }; + + gun.setPosX(2.714f * (float) zp); + gun.setPosY(posY * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(posZ * (float) zp + (float) (0.3f * zpz)); + gun.setRotZ((float) (0.05f * zpz)); + gun.setScaleZ(1f - (scaleZ * (float) zp)); + scope2.setScaleZ(1f - (0.8f * (float) zp)); + scope3.setScaleZ(1f - (0.55f * (float) zp)); + + GeoBone shen; + if (zt < 0.5) { + shen = getAnimationProcessor().getBone("fireRootNormal"); + } else { + shen = switch (type) { + case 0 -> getAnimationProcessor().getBone("fireRoot0"); + case 1 -> getAnimationProcessor().getBone("fireRoot1"); + case 2 -> getAnimationProcessor().getBone("fireRoot2"); + case 3 -> getAnimationProcessor().getBone("fireRoot3"); + default -> getAnimationProcessor().getBone("fireRootNormal"); + }; + } + + fireRotY = (float) Mth.lerp(0.3f * times, fireRotY, 0.2f * ClientEventHandler.recoilHorizon * fpz); + fireRotZ = (float) Mth.lerp(2f * times, fireRotZ, (0.4f + 0.5 * fpz) * ClientEventHandler.recoilHorizon); + + shen.setPosX(-0.4f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread))); + shen.setPosY((float) (0.15f * fp + 0.18f * fr)); + shen.setPosZ((float) (1.935 * fp + 0.13f * fr + 0.725 * fpz)); + shen.setRotX((float) ((0.015f * fp + 0.12f * fr + 0.015f * fpz))); + shen.setRotY(fireRotY); + shen.setRotZ(fireRotZ); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt) * (barrelType == 1 ? 0.8 : 1.0) * (stockType == 2 ? 0.9 : 1.0) * (gripType == 1 ? 0.9 : 1.0) * (isProne(player) && gripType == 3 ? 0.9 : 1.0))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.8 * zt) * (barrelType == 1 ? 0.4 : 1.0) * (stockType == 2 ? 0.6 : 1.0) * (gripType == 1 ? 0.7 : 1.0) * (isProne(player) && gripType == 3 ? 0.1 : 1.0))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.85 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + action.setPosZ(2.5f * (float) fp); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", !(gun.getPosX() > 2.5)); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.98 * zt); + float numP = (float) (1 - 0.97 * zt); + + GeoBone l = getAnimationProcessor().getBone("l"); + GeoBone r = getAnimationProcessor().getBone("r"); + rotXBipod = Mth.lerp(1.5f * times, rotXBipod, isProne(player) ? -90 : 0); + l.setRotX(rotXBipod * Mth.DEG_TO_RAD); + r.setRotX(rotXBipod * Mth.DEG_TO_RAD); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 1.2f, 0.55f); + + GeoBone shell = getAnimationProcessor().getBone("shell"); + + if (GunsTool.getGunBooleanTag(stack, "HoldOpen")) { + action.setPosZ(2.5f); + shell.setScaleX(0); + shell.setScaleY(0); + shell.setScaleZ(0); + } else { + shell.setScaleX(1); + shell.setScaleY(1); + shell.setScaleZ(1); + } + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/MosinNagantItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/MosinNagantItemModel.java new file mode 100644 index 000000000..40053fcaa --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/MosinNagantItemModel.java @@ -0,0 +1,144 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.sniper.MosinNagantItem; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class MosinNagantItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(MosinNagantItem animatable) { + return ModUtils.loc("animations/mosin_nagant.animation.json"); + } + + @Override + public ResourceLocation getModelResource(MosinNagantItem animatable) { + return ModUtils.loc("geo/mosin_nagant.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(MosinNagantItem animatable) { + return ModUtils.loc("textures/item/mosin_nagant.png"); + } + + @Override + public void setCustomAnimations(MosinNagantItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone pu = getAnimationProcessor().getBone("pu"); + GeoBone bone15 = getAnimationProcessor().getBone("bone15"); + GeoBone bone16 = getAnimationProcessor().getBone("bone16"); + GeoBone qiangshen = getAnimationProcessor().getBone("qiangshen"); + GeoBone rex = getAnimationProcessor().getBone("rex"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 7 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(2.105f * (float) zp); + gun.setPosY(0.766f * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(12.95f * (float) zp + (float) (0.3f * zpz)); + gun.setScaleZ(1f - (0.9f * (float) zp)); + + pu.setScaleZ(1f - (0.5f * (float) zp)); + bone16.setScaleZ(1f - (0.93f * (float) zp)); + bone15.setScaleX(1f - (0.2f * (float) zp)); + + if (gun.getPosX() > 1.4) { + qiangshen.setScaleX(0); + qiangshen.setScaleY(0); + qiangshen.setScaleZ(0); + } else { + qiangshen.setScaleX(1); + qiangshen.setScaleY(1); + qiangshen.setScaleZ(1); + } + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", !(gun.getPosX() > 1.4)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.4f * fp + 0.44f * fr)); + shen.setPosZ((float) (2.825 * fp + 0.17f * fr + 1.175 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.15f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.87 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + rex.setPosY(0.05f + 0.1f * (float) fp); + rex.setRotZ((float) (-0.08f * fp * ClientEventHandler.recoilHorizon * fp)); + + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + GeoBone body = getAnimationProcessor().getBone("roll"); + + float numR = (float) (1 - 0.97 * zt); + float numP = (float) (1 - 0.81 * zt); + + if (GunsTool.getGunBooleanTag(stack, "Reloading") || GunsTool.getGunIntTag(stack, "BoltActionTick") > 0) { + main.setRotX(numR * main.getRotX()); + main.setRotY(numR * main.getRotY()); + main.setRotZ(numR * main.getRotZ()); + main.setPosX(numP * main.getPosX()); + main.setPosY(numP * main.getPosY()); + main.setPosZ(numP * main.getPosZ()); + body.setRotX(numR * body.getRotX()); + body.setRotY(numR * body.getRotY()); + body.setRotZ(numR * body.getRotZ()); + body.setPosX(numP * body.getPosX()); + body.setPosY(numP * body.getPosY()); + body.setPosZ(numP * body.getPosZ()); + camera.setRotX(numR * camera.getRotX()); + camera.setRotY(numR * camera.getRotY()); + camera.setRotZ(numR * camera.getRotZ()); + } + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/Mp443ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Mp443ItemModel.java new file mode 100644 index 000000000..e9d286872 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Mp443ItemModel.java @@ -0,0 +1,139 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.handgun.Mp443Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class Mp443ItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(Mp443Item animatable) { + return ModUtils.loc("animations/glock17.animation.json"); + } + + @Override + public ResourceLocation getModelResource(Mp443Item animatable) { + return ModUtils.loc("geo/mp443.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(Mp443Item animatable) { + return ModUtils.loc("textures/item/mp443.png"); + } + + @Override + public void setCustomAnimations(Mp443Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone slide = getAnimationProcessor().getBone("huatao"); + GeoBone bullet = getAnimationProcessor().getBone("bullet"); + GeoBone hammer = getAnimationProcessor().getBone("trigger"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 20 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(1.23f * (float) zp); + gun.setPosY(1.53f * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(7f * (float) zp + (float) (0.3f * zpz)); + gun.setScaleZ(1f - (0.55f * (float) zp)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.25f * fp + 0.28f * fr)); + shen.setPosZ((float) (2.375 * fp + 0.44f * fr + 0.75 * fpz)); + shen.setRotX((float) (0.15f * fp + 0.3f * fr + 0.3f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.3 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.8 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + slide.setPosZ(1.5f * (float) fp); + hammer.setRotX((120 * Mth.DEG_TO_RAD * (float) fp)); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.12 * zt); + float numP = (float) (1 - 0.68 * zt); + + if (GunsTool.getGunIntTag(stack, "ReloadTime") > 0) { + main.setRotX(numR * main.getRotX()); + main.setRotY(numR * main.getRotY()); + main.setRotZ(numR * main.getRotZ()); + main.setPosX(numP * main.getPosX()); + main.setPosY(numP * main.getPosY()); + main.setPosZ(numP * main.getPosZ()); + camera.setRotX(numR * camera.getRotX()); + camera.setRotY(numR * camera.getRotY()); + camera.setRotZ(numR * camera.getRotZ()); + } + + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 0.7f, 1f); + + GeoBone shell = getAnimationProcessor().getBone("shell"); + if (GunsTool.getGunBooleanTag(stack, "HoldOpen")) { + slide.setPosZ(1.5f); + bullet.setScaleX(0); + bullet.setScaleY(0); + bullet.setScaleZ(0); + + shell.setScaleX(0); + shell.setScaleY(0); + shell.setScaleZ(0); + } else { + bullet.setScaleX(1); + bullet.setScaleY(1); + bullet.setScaleZ(1); + + shell.setScaleX(1); + shell.setScaleY(1); + shell.setScaleZ(1); + } + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/Ntw20Model.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Ntw20Model.java new file mode 100644 index 000000000..71aab2f54 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Ntw20Model.java @@ -0,0 +1,177 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.heavy.Ntw20Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +import static com.atsuishio.superbwarfare.event.ClientEventHandler.isProne; + +public class Ntw20Model extends GeoModel { + + public static float fireRotY = 0f; + public static float fireRotZ = 0f; + public static float rotXBipod = 0f; + + @Override + public ResourceLocation getAnimationResource(Ntw20Item animatable) { + return ModUtils.loc("animations/ntw_20.animation.json"); + } + + @Override + public ResourceLocation getModelResource(Ntw20Item animatable) { + return ModUtils.loc("geo/ntw_20.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(Ntw20Item animatable) { + return ModUtils.loc("textures/item/ntw_20.png"); + } + + @Override + public void setCustomAnimations(Ntw20Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone action = getAnimationProcessor().getBone("action"); + GeoBone lh = getAnimationProcessor().getBone("lh"); + GeoBone scope = getAnimationProcessor().getBone("Scope1"); + GeoBone scope2 = getAnimationProcessor().getBone("Scope2"); + GeoBone scope3 = getAnimationProcessor().getBone("Scope3"); + GeoBone cross1 = getAnimationProcessor().getBone("Cross1"); + GeoBone cross2 = getAnimationProcessor().getBone("Cross2"); + GeoBone cross3 = getAnimationProcessor().getBone("Cross3"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 7 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + + float posY = switch (type) { + case 0 -> -0.25f; + case 1 -> -0.24f; + case 2 -> -0.5f; + case 3 -> -0.28f; + default -> 0f; + }; + float scaleZ = switch (type) { + case 0, 1 -> 0.5f; + case 2 -> 0.8f; + case 3 -> 0.78f; + default -> 0f; + }; + float posZ = switch (type) { + case 0, 1 -> 7f; + case 2 -> 9.8f; + case 3 -> 9.9f; + default -> 0f; + }; + + gun.setPosX(4.5525f * (float) zp); + gun.setPosY(posY * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(posZ * (float) zp + (float) (0.3f * zpz)); + gun.setRotZ((float) (0.05f * zpz)); + gun.setScaleZ(1f - (scaleZ * (float) zp)); + scope.setScaleZ(1f - (0.6f * (float) zp)); + scope2.setScaleZ(1f - (0.8f * (float) zp)); + scope3.setScaleZ(1f - (0.5f * (float) zp)); + + GeoBone shen; + if (zt < 0.5) { + shen = getAnimationProcessor().getBone("fireRootNormal"); + } else { + shen = switch (type) { + case 0 -> getAnimationProcessor().getBone("fireRoot0"); + case 1 -> getAnimationProcessor().getBone("fireRoot1"); + case 2 -> getAnimationProcessor().getBone("fireRoot2"); + case 3 -> getAnimationProcessor().getBone("fireRoot3"); + default -> getAnimationProcessor().getBone("fireRootNormal"); + }; + } + + fireRotY = (float) Mth.lerp(0.3f * times, fireRotY, 0.6f * ClientEventHandler.recoilHorizon * fpz); + fireRotZ = (float) Mth.lerp(2f * times, fireRotZ, (0.4f + 0.5f * fpz) * ClientEventHandler.recoilHorizon); + + shen.setPosX(-0.4f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread))); + shen.setPosY((float) (0.15f * fp + 0.18f * fr)); + shen.setPosZ((float) (2.935 * fp + 0.23f * fr + 1.325 * fpz)); + shen.setRotX((float) (0.015f * fp + 0.12f * fr + 0.015f * fpz + 0.15f * (float) ClientEventHandler.actionMove)); + shen.setRotY(fireRotY); + shen.setRotZ(fireRotZ); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.8 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.85 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", !(gun.getPosX() > 4.3)); + + action.setPosZ(3f * (float) ClientEventHandler.actionMove); + lh.setPosZ(-3f * (float) ClientEventHandler.actionMove); + + GeoBone l = getAnimationProcessor().getBone("l"); + GeoBone r = getAnimationProcessor().getBone("r"); + rotXBipod = Mth.lerp(1.5f * times, rotXBipod, isProne(player) ? -90 : 0); + l.setRotX(rotXBipod * Mth.DEG_TO_RAD); + r.setRotX(rotXBipod * Mth.DEG_TO_RAD); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.92 * zt); + float numP = (float) (1 - 0.88 * zt); + + if (GunsTool.getGunIntTag(stack, "ReloadTime") > 0 || GunsTool.getGunIntTag(stack, "BoltActionTick") > 0) { + main.setRotX(numR * main.getRotX()); + main.setRotY(numR * main.getRotY()); + main.setRotZ(numR * main.getRotZ()); + main.setPosX(numP * main.getPosX()); + main.setPosY(numP * main.getPosY()); + main.setPosZ(numP * main.getPosZ()); + camera.setRotX(numR * camera.getRotX()); + camera.setRotY(numR * camera.getRotY()); + camera.setRotZ(numR * camera.getRotZ()); + } + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/Qbz95ItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Qbz95ItemModel.java new file mode 100644 index 000000000..133db521d --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/Qbz95ItemModel.java @@ -0,0 +1,217 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.Qbz95Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +import static com.atsuishio.superbwarfare.event.ClientEventHandler.isProne; + +public class Qbz95ItemModel extends GeoModel { + + public static float fireRotY = 0f; + public static float fireRotZ = 0f; + public static float rotXBipod = 0f; + + public static float lHandPosX = 0f; + public static float lHandPosY = 0f; + public static float lHandPosZ = 0f; + public static float lHandRotX = 0f; + public static float lHandRotY = 0f; + public static float lHandRotZ = 0f; + + @Override + public ResourceLocation getAnimationResource(Qbz95Item animatable) { + return ModUtils.loc("animations/qbz95.animation.json"); + } + + @Override + public ResourceLocation getModelResource(Qbz95Item animatable) { + return ModUtils.loc("geo/qbz95.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(Qbz95Item animatable) { + return ModUtils.loc("textures/item/qbz95.png"); + } + + @Override + public void setCustomAnimations(Qbz95Item animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone bolt = getAnimationProcessor().getBone("bolt2"); + GeoBone button = getAnimationProcessor().getBone("button"); + GeoBone button3 = getAnimationProcessor().getBone("button3"); + GeoBone button6 = getAnimationProcessor().getBone("button6"); + GeoBone cross1 = getAnimationProcessor().getBone("Cross1"); + GeoBone cross2 = getAnimationProcessor().getBone("Cross2"); + GeoBone cross3 = getAnimationProcessor().getBone("Cross3"); + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + + float posYAlt = switch (type) { + case 2 -> 0.85f; + case 3 -> 0.9f; + default -> 0f; + }; + float posY = switch (type) { + case 0 -> 0.535f; + case 1 -> -0.155f; + case 2 -> -0.975f + posYAlt; + case 3 -> -0.64f + posYAlt; + default -> 0f; + }; + float posZ = switch (type) { + case 0 -> 10.6f; + case 1 -> 8.8f; + case 2 -> 14.51f; + case 3 -> 17.2f; + default -> 0f; + }; + float scaleZ = switch (type) { + case 0 -> 0.5f; + case 1 -> 0.51f; + case 2 -> 0.792f; + case 3 -> 0.891f; + default -> 0f; + }; + + gun.setPosX(3.71f * (float) zp); + gun.setPosY(posY * (float) zp - (float) (0.2f * zpz) - posYAlt); + gun.setPosZ(posZ * (float) zp + (float) (0.3f * zpz)); + gun.setRotZ((float) (0.05f * zpz)); + gun.setScaleZ(1f - (scaleZ * (float) zp)); + + button.setScaleY(1f - (0.85f * (float) zp)); + button3.setScaleX(1f - (0.5f * (float) zp)); + button6.setScaleX(1f - (0.8f * (float) zp)); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", gun.getPosX() < 3.1); + + GeoBone shen; + if (zt < 0.5) { + shen = getAnimationProcessor().getBone("fireRootNormal"); + } else { + shen = switch (type) { + case 0 -> getAnimationProcessor().getBone("fireRoot0"); + case 1 -> getAnimationProcessor().getBone("fireRoot1"); + case 2 -> getAnimationProcessor().getBone("fireRoot2"); + case 3 -> getAnimationProcessor().getBone("fireRoot3"); + default -> getAnimationProcessor().getBone("fireRootNormal"); + }; + } + + fireRotY = (float) Mth.lerp(0.3f * times, fireRotY, 0.2f * ClientEventHandler.recoilHorizon * fpz); + fireRotZ = (float) Mth.lerp(2f * times, fireRotZ, (0.4f + 0.5 * fpz) * ClientEventHandler.recoilHorizon); + + shen.setPosX(-0.4f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread))); + shen.setPosY((float) (0.15f * fp + 0.18f * fr)); + shen.setPosZ((float) (0.375 * fp + 0.44f * fr + 0.75 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.05f * fr + 0.01f * fpz)); + shen.setRotY(fireRotY); + shen.setRotZ(fireRotZ); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.1 * zt))); + shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.1 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - (type == 3 ? 0.96 : type == 1 ? 0.8 : 0.9) * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - (type == 3 ? 0.95 : 0.9) * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + bolt.setPosZ(5f * (float) fp); + + cross1.setPosY(-0.75f * (float) fpz); + cross2.setPosY(-0.7f * (float) fpz); + cross3.setPosY(-0.2f * (float) fpz); + + GeoBone l = getAnimationProcessor().getBone("l"); + GeoBone r = getAnimationProcessor().getBone("r"); + rotXBipod = Mth.lerp(1.5f * times, rotXBipod, isProne(player) ? -90 : 0); + l.setRotX(rotXBipod * Mth.DEG_TO_RAD); + r.setRotX(rotXBipod * Mth.DEG_TO_RAD); + + if (GunsTool.getGunBooleanTag(stack, "HoldOpen")) { + bolt.setPosZ(5f); + } + + GeoBone flare = getAnimationProcessor().getBone("flare"); + int BarrelType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.BARREL); + + if (BarrelType == 1) { + flare.setPosZ(-2); + } + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + float numR = (float) (1 - 0.975 * zt); + float numP = (float) (1 - 0.97 * zt); + + GeoBone leftHand = getAnimationProcessor().getBone("Lefthand"); + GeoBone anim = getAnimationProcessor().getBone("anim"); + + boolean isZooming = zt > 0 && anim.getPosZ() == 0; + + lHandPosX = Mth.lerp(1.5f * times, lHandPosX, isZooming ? 0 : leftHand.getPosX()); + lHandPosY = Mth.lerp(1.5f * times, lHandPosY, isZooming ? 0 : leftHand.getPosY()); + lHandPosZ = Mth.lerp(1.5f * times, lHandPosZ, isZooming ? 0 : leftHand.getPosZ()); + lHandRotX = Mth.lerp(1.5f * times, lHandRotX, isZooming ? -2.1f : leftHand.getRotX()); + lHandRotY = Mth.lerp(1.5f * times, lHandRotY, isZooming ? 0.2419f : leftHand.getRotY()); + lHandRotZ = Mth.lerp(1.5f * times, lHandRotZ, isZooming ? 2.9228f : leftHand.getRotZ()); + + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + leftHand.setPosX(lHandPosX); + leftHand.setPosY(lHandPosY); + leftHand.setPosZ(lHandPosZ); + leftHand.setRotX(lHandRotX); + leftHand.setRotY(lHandRotY); + leftHand.setRotZ(lHandRotZ); + } + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/RocketItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/RocketItemModel.java new file mode 100644 index 000000000..c6dca6802 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/RocketItemModel.java @@ -0,0 +1,24 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.common.ammo.Rocket; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class RocketItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(Rocket animatable) { + return ModUtils.loc("animations/rpg.head.animation.json"); + } + + @Override + public ResourceLocation getModelResource(Rocket animatable) { + return ModUtils.loc("geo/rpg.head.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(Rocket animatable) { + return ModUtils.loc("textures/entity/rpg_rocket.png"); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java new file mode 100644 index 000000000..16529e400 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpgItemModel.java @@ -0,0 +1,107 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.launcher.RpgItem; +import com.atsuishio.superbwarfare.tools.GunsTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class RpgItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(RpgItem animatable) { + return ModUtils.loc("animations/rpg.animation.json"); + } + + @Override + public ResourceLocation getModelResource(RpgItem animatable) { + return ModUtils.loc("geo/rpg.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(RpgItem animatable) { + return ModUtils.loc("textures/item/rpg7.png"); + } + + @Override + public void setCustomAnimations(RpgItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("rpg"); + GeoBone hammer = getAnimationProcessor().getBone("hammer"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + if (GunsTool.getGunBooleanTag(stack, "CloseHammer")) { + hammer.setRotX(-90 * Mth.DEG_TO_RAD); + } + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.4f * fp + 0.44f * fr)); + shen.setPosZ((float) (5.825 * fp + 0.34f * fr + 2.35 * fpz)); + shen.setRotX((float) (0.02f * fp + 0.25f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.7 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.87 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + gun.setPosX(0.91f * (float) zp); + gun.setPosY(-0.04f * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(2f * (float) zp + (float) (0.15f * zpz)); + gun.setRotZ(0.45f * (float) zp + (float) (0.02f * zpz)); + gun.setScaleZ(1f - (0.5f * (float) zp)); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.82 * zt); + float numP = (float) (1 - 0.78 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpkItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpkItemModel.java new file mode 100644 index 000000000..1284ef0d9 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/RpkItemModel.java @@ -0,0 +1,114 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.machinegun.RpkItem; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class RpkItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(RpkItem animatable) { + return ModUtils.loc("animations/rpk.animation.json"); + } + + @Override + public ResourceLocation getModelResource(RpkItem animatable) { + return ModUtils.loc("geo/rpk.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(RpkItem animatable) { + return ModUtils.loc("textures/item/rpk.png"); + } + + @Override + public void setCustomAnimations(RpkItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone scope = getAnimationProcessor().getBone("pka"); + GeoBone button = getAnimationProcessor().getBone("button"); + GeoBone shuan = getAnimationProcessor().getBone("shuan"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(1.69f * (float) zp); + gun.setPosY(-0.33f * (float) zp - (float) (0.1f * zpz)); + gun.setPosZ(3.2f * (float) zp + (float) (0.2f * zpz)); + gun.setRotZ((float) (0.05f * zpz)); + gun.setScaleZ(1f - (0.55f * (float) zp)); + scope.setScaleZ(1f - (0.9f * (float) zp)); + button.setScaleX(1f - (0.2f * (float) zp)); + button.setScaleY(1f - (0.3f * (float) zp)); + button.setScaleZ(1f - (0.3f * (float) zp)); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", !(gun.getPosX() > 1.65)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.15f * fp + 0.18f * fr)); + shen.setPosZ((float) (0.275 * fp + 0.34f * fr + 0.65 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.05f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.5 * zt))); + shen.setPosY((float) (shen.getPosY() * (-1 + 0.4 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.9 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.9 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.9 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + shuan.setPosZ(2.4f * (float) fp); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.94 * zt); + float numP = (float) (1 - 0.8 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 1f, 0.55f); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/SecondaryCataclysmModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/SecondaryCataclysmModel.java new file mode 100644 index 000000000..9d3c54cc6 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/SecondaryCataclysmModel.java @@ -0,0 +1,116 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.launcher.SecondaryCataclysm; +import com.atsuishio.superbwarfare.tools.GunsTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class SecondaryCataclysmModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(SecondaryCataclysm animatable) { + return ModUtils.loc("animations/secondary_cataclysm.animation.json"); + } + + @Override + public ResourceLocation getModelResource(SecondaryCataclysm animatable) { + return ModUtils.loc("geo/secondary_cataclysm.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(SecondaryCataclysm animatable) { + return ModUtils.loc("textures/item/secondary_cataclysm.png"); + } + + @Override + public void setCustomAnimations(SecondaryCataclysm animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 20 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(0.9f * (float) zp); + gun.setPosY(0.15f * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(6f * (float) zp + (float) (0.3f * zpz)); + gun.setScaleZ(1f - (0.35f * (float) zp)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.4f * fp + 0.44f * fr)); + shen.setPosZ((float) (2.825 * fp + 0.17f * fr + 1.175 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.15f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.7 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.87 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + GeoBone bolt = getAnimationProcessor().getBone("bolt"); + GeoBone lun = getAnimationProcessor().getBone("lun"); + bolt.setPosZ(6f * (float) fp); + lun.setRotZ(45f * (float) (Mth.clamp(ClientEventHandler.firePosTimer, 0, 1)) * Mth.DEG_TO_RAD); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.12 * zt); + float numP = (float) (1 - 0.68 * zt); + + if (GunsTool.getGunIntTag(stack, "ReloadTime") > 0) { + main.setRotX(numR * main.getRotX()); + main.setRotY(numR * main.getRotY()); + main.setRotZ(numR * main.getRotZ()); + main.setPosX(numP * main.getPosX()); + main.setPosY(numP * main.getPosY()); + main.setPosZ(numP * main.getPosZ()); + camera.setRotX(numR * camera.getRotX()); + camera.setRotY(numR * camera.getRotY()); + camera.setRotZ(numR * camera.getRotZ()); + } + + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/SentinelItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/SentinelItemModel.java new file mode 100644 index 000000000..0898e19c8 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/SentinelItemModel.java @@ -0,0 +1,130 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.sniper.SentinelItem; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class SentinelItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(SentinelItem animatable) { + return ModUtils.loc("animations/sentinel.animation.json"); + } + + @Override + public ResourceLocation getModelResource(SentinelItem animatable) { + return ModUtils.loc("geo/sentinel.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(SentinelItem animatable) { + return ModUtils.loc("textures/item/sentinel.png"); + } + + @Override + public void setCustomAnimations(SentinelItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + GeoBone scope = getAnimationProcessor().getBone("scope2"); + GeoBone ammo = getAnimationProcessor().getBone("ammobar"); + GeoBone cb = getAnimationProcessor().getBone("chamber2"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 7 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(2.928f * (float) zp); + gun.setPosY(-0.062f * (float) zp - (float) (0.1f * zpz)); + gun.setPosZ(10f * (float) zp + (float) (0.3f * zpz)); + gun.setRotZ((float) (0.05f * zpz)); + gun.setScaleZ(1f - (0.7f * (float) zp)); + + scope.setScaleZ(1f - (0.8f * (float) zp)); + cb.setRotZ((float) (cb.getRotZ() + times * 10 * ClientEventHandler.chamberRot)); + + GeoBone holo = getAnimationProcessor().getBone("holo"); + holo.setPosY(0.09f); + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", !(gun.getPosX() > 2.4)); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.4f * fp + 0.44f * fr)); + shen.setPosZ((float) (3.325 * fp + 0.34f * fr + 2.35 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.15f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.87 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + GeoBone charge = getAnimationProcessor().getBone("charge"); + + charge.setRotZ(charge.getRotZ() + times * 0.5f); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + if (GunsTool.getGunIntTag(stack, "Ammo", 0) <= 5) { + ammo.setScaleX((float) GunsTool.getGunIntTag(stack, "Ammo", 0) / 5); + } + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.9 * zt); + float numP = (float) (1 - 0.98 * zt); + + if (GunsTool.getGunIntTag(stack, "ReloadTime") > 0 || GunsTool.getGunBooleanTag(stack, "Charging")) { + main.setRotX(numR * main.getRotX()); + main.setRotY(numR * main.getRotY()); + main.setRotZ(numR * main.getRotZ()); + main.setPosX(numP * main.getPosX()); + main.setPosY(numP * main.getPosY()); + main.setPosZ(numP * main.getPosZ()); + camera.setRotX(numR * camera.getRotX()); + camera.setRotY(numR * camera.getRotY()); + camera.setRotZ(numR * camera.getRotZ()); + } + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/SksItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/SksItemModel.java new file mode 100644 index 000000000..7a4de6c8e --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/SksItemModel.java @@ -0,0 +1,122 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.SksItem; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class SksItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(SksItem animatable) { + return ModUtils.loc("animations/sks.animation.json"); + } + + @Override + public ResourceLocation getModelResource(SksItem animatable) { + return ModUtils.loc("geo/sks.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(SksItem animatable) { + return ModUtils.loc("textures/item/sks.png"); + } + + @Override + public void setCustomAnimations(SksItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone bolt = getAnimationProcessor().getBone("bolt"); + GeoBone shuan = getAnimationProcessor().getBone("bolt2"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + gun.setPosX(1.53f * (float) zp); + gun.setPosY(0.34f * (float) zp - (float) (0.6f * zpz)); + gun.setPosZ(2.5f * (float) zp + (float) (0.5f * zpz)); + gun.setRotZ((float) (0.05f * zpz)); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", gun.getPosX() <= 1.2); + GeoBone shen = getAnimationProcessor().getBone("shen"); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.2f * fp + 0.24f * fr)); + shen.setPosZ((float) (0.825 * fp + 0.34f * fr + 1.35 * fpz)); + shen.setRotX((float) (0.01f * fp + 0.05f * fr + 0.01f * fpz)); + shen.setRotY((float) (0.1f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.5 * zt))); + shen.setPosY((float) (shen.getPosY() * (-1 + 0.5 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.9 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.9 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.9 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + shuan.setPosZ(2f * (float) fp); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.92 * zt); + float numP = (float) (1 - 0.88 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 0.7f, 1.2f); + GeoBone shell = getAnimationProcessor().getBone("shell"); + + if (GunsTool.getGunBooleanTag(stack, "HoldOpen")) { + shell.setScaleX(0); + shell.setScaleY(0); + shell.setScaleZ(0); + bolt.setPosZ(2.5f); + } else { + shell.setScaleX(1); + shell.setScaleY(1); + shell.setScaleZ(1); + } + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/SvdItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/SvdItemModel.java new file mode 100644 index 000000000..cb8bae921 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/SvdItemModel.java @@ -0,0 +1,176 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.sniper.SvdItem; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +import static com.atsuishio.superbwarfare.event.ClientEventHandler.isProne; + +public class SvdItemModel extends GeoModel { + + public static float fireRotY = 0f; + public static float fireRotZ = 0f; + public static float rotXBipod = 0f; + + @Override + public ResourceLocation getAnimationResource(SvdItem animatable) { + return ModUtils.loc("animations/svd.animation.json"); + } + + @Override + public ResourceLocation getModelResource(SvdItem animatable) { + return ModUtils.loc("geo/svd.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(SvdItem animatable) { + return ModUtils.loc("textures/item/svd.png"); + } + + @Override + public void setCustomAnimations(SvdItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone bolt = getAnimationProcessor().getBone("bolt"); + GeoBone cross3 = getAnimationProcessor().getBone("Cross3"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + int type = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + int stockType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK); + int barrelType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.BARREL); + int gripType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP); + + float posX = switch (type) { + case 0, 1 -> 1.701f; + case 2 -> 1.531f; + case 3 -> 1.708f; + default -> 0f; + }; + float posY = switch (type) { + case 0 -> 1.02f; + case 1 -> 0.04f; + case 2 -> 0.12f; + case 3 -> -0.13f; + default -> 0f; + }; + float scaleZ = switch (type) { + case 0 -> 0.4f; + case 1 -> 0.45f; + case 2 -> 0.85f; + case 3 -> 0.95f; + default -> 0f; + }; + float posZ = switch (type) { + case 0 -> 7f; + case 1 -> 7.5f; + case 2 -> 12.85f; + case 3 -> 14.08f; + default -> 0f; + }; + + gun.setPosX(posX * (float) zp); + gun.setPosY(posY * (float) zp - (float) (0.2f * zpz)); + gun.setPosZ(posZ * (float) zp + (float) (0.3f * zpz)); + gun.setRotZ((float) (0.05f * zpz)); + gun.setScaleZ(1f - (scaleZ * (float) zp)); + cross3.setScaleX((float) (1f + (0.1 * zp))); + cross3.setScaleY((float) (1f + (0.1 * zp))); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", gun.getPosX() <= 1.4); + + GeoBone shen; + if (zt < 0.5) { + shen = getAnimationProcessor().getBone("fireRootNormal"); + } else { + shen = switch (type) { + case 0 -> getAnimationProcessor().getBone("fireRoot0"); + case 1 -> getAnimationProcessor().getBone("fireRoot1"); + case 2 -> getAnimationProcessor().getBone("fireRoot2"); + case 3 -> getAnimationProcessor().getBone("fireRoot3"); + default -> getAnimationProcessor().getBone("fireRootNormal"); + }; + } + + fireRotY = (float) Mth.lerp(0.3f * times, fireRotY, 0.6f * ClientEventHandler.recoilHorizon * fpz); + fireRotZ = (float) Mth.lerp(2f * times, fireRotZ, (0.8f + 1 * fpz) * ClientEventHandler.recoilHorizon); + + shen.setPosX(-0.4f * (float) (ClientEventHandler.recoilHorizon * (0.5 + 0.4 * ClientEventHandler.fireSpread))); + shen.setPosY((float) (0.15f * fp + 0.18f * fr)); + shen.setPosZ((float) (2.935 * fp + 0.23f * fr + 1.325 * fpz)); + shen.setRotX((float) ((0.015f * fp + 0.12f * fr + 0.015f * fpz))); + shen.setRotY(fireRotY); + shen.setRotZ(fireRotZ); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (-1 + 0.8 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.6 * zt) * (barrelType == 1 ? 0.8 : 1.0) * (stockType == 2 ? 0.9 : 1.0) * (gripType == 1 ? 0.9 : 1.0) * (isProne(player) && gripType == 3 ? 0.9 : 1.0))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.8 * zt) * (barrelType == 1 ? 0.4 : 1.0) * (stockType == 2 ? 0.6 : 1.0) * (gripType == 1 ? 0.7 : 1.0) * (isProne(player) && gripType == 3 ? 0.1 : 1.0))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.85 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.4 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + bolt.setPosZ(4.5f * (float) fp); + + if (GunsTool.getGunBooleanTag(stack, "HoldOpen")) { + bolt.setPosZ(3.5f); + } + + GeoBone l = getAnimationProcessor().getBone("l"); + GeoBone r = getAnimationProcessor().getBone("r"); + rotXBipod = Mth.lerp(1.5f * times, rotXBipod, isProne(player) ? -90 : 0); + l.setRotX(rotXBipod * Mth.DEG_TO_RAD); + r.setRotX(rotXBipod * Mth.DEG_TO_RAD); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.96 * zt); + float numP = (float) (1 - 0.9 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + AnimationHelper.handleShellsAnimation(getAnimationProcessor(), 1f, 0.65f); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/TaserItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/TaserItemModel.java new file mode 100644 index 000000000..85688666f --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/TaserItemModel.java @@ -0,0 +1,100 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.special.TaserItem; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +public class TaserItemModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(TaserItem animatable) { + return ModUtils.loc("animations/taser.animation.json"); + } + + @Override + public ResourceLocation getModelResource(TaserItem animatable) { + return ModUtils.loc("geo/taser.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(TaserItem animatable) { + return ModUtils.loc("textures/item/tasergun.png"); + } + + @Override + public void setCustomAnimations(TaserItem animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone shen = getAnimationProcessor().getBone("shen"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.6f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 13 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + shen.setPosX((float) (0.75f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (-0.03f * fp - 0.06f * fr)); + shen.setPosZ((float) (0.725 * fp + 0.34f * fr + 0.45 * fpz)); + shen.setRotX((float) (0.03f * fp + 0.02f * fr + 0.02f * fpz)); + shen.setRotY((float) (0.07f * ClientEventHandler.recoilHorizon * fpz)); + shen.setRotZ((float) ((0.08f + 0.1 * fr) * ClientEventHandler.recoilHorizon)); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.5 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 + 0.2 * zt))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.3 * zt))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.9 * zt))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.9 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.9 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + gun.setPosX(1.82f * (float) zp); + gun.setPosY(1.3f * (float) zp - (float) (0.3f * zpz)); + gun.setPosZ((float) zp + (float) (0.5f * zpz)); + gun.setRotZ((float) (0.05f * zpz)); + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setRotX((float) (swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY)); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + + float numR = (float) (1 - 0.72 * zt); + float numP = (float) (1 - 0.68 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/item/TracheliumItemModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/item/TracheliumItemModel.java new file mode 100644 index 000000000..c5c07740a --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/item/TracheliumItemModel.java @@ -0,0 +1,207 @@ +package com.atsuishio.superbwarfare.client.model.item; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.overlay.CrossHairOverlay; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.handgun.Trachelium; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.animation.AnimationState; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.model.GeoModel; + +import static com.atsuishio.superbwarfare.event.ClientEventHandler.isProne; + +public class TracheliumItemModel extends GeoModel { + + public static float posYAlt = -0.83f; + public static float scaleZAlt = 0.8f; + public static float posZAlt = 13.7f; + + public static float fireRotY = 0f; + public static float fireRotZ = 0f; + public static float rotXBipod = 0f; + + @Override + public ResourceLocation getAnimationResource(Trachelium animatable) { + return ModUtils.loc("animations/trachelium.animation.json"); + } + + @Override + public ResourceLocation getModelResource(Trachelium animatable) { + return ModUtils.loc("geo/trachelium.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(Trachelium animatable) { + return ModUtils.loc("textures/item/trachelium_texture.png"); + } + + @Override + public void setCustomAnimations(Trachelium animatable, long instanceId, AnimationState animationState) { + GeoBone gun = getAnimationProcessor().getBone("bone"); + GeoBone hammer = getAnimationProcessor().getBone("jichui"); + GeoBone lun = getAnimationProcessor().getBone("lun"); + GeoBone barrel1 = getAnimationProcessor().getBone("Barrel1"); + GeoBone barrel2 = getAnimationProcessor().getBone("Barrel2"); + GeoBone flare = getAnimationProcessor().getBone("flare"); + GeoBone camera = getAnimationProcessor().getBone("camera"); + GeoBone main = getAnimationProcessor().getBone("0"); + GeoBone scope2 = getAnimationProcessor().getBone("Scope2"); + + Player player = Minecraft.getInstance().player; + if (player == null) return; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return; + + float times = 0.4f * (float) Math.min(Minecraft.getInstance().getTimer().getGameTimeDeltaTicks(), 0.8); + double zt = ClientEventHandler.zoomTime; + double zp = ClientEventHandler.zoomPos; + double zpz = ClientEventHandler.zoomPosZ; + double swayX = ClientEventHandler.swayX; + double swayY = ClientEventHandler.swayY; + float moveRotZ = (float) ClientEventHandler.moveRotZ; + float movePosX = (float) ClientEventHandler.movePosX; + float movePosY = (float) ClientEventHandler.movePosY; + double mph = ClientEventHandler.movePosHorizon; + double vY = ClientEventHandler.velocityY; + double turnRotX = ClientEventHandler.turnRot[0]; + double turnRotY = ClientEventHandler.turnRot[1]; + double turnRotZ = ClientEventHandler.turnRot[2]; + double fpz = ClientEventHandler.firePosZ * 8 * times; + double fp = ClientEventHandler.firePos; + double fr = ClientEventHandler.fireRot; + + int stockType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK); + int barrelType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.BARREL); + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + int gripType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP); + + posYAlt = Mth.lerp(times, posYAlt, NBTTool.getOrCreateTag(stack).getBoolean("ScopeAlt") ? -1.98f : -0.83f); + scaleZAlt = Mth.lerp(times, scaleZAlt, NBTTool.getOrCreateTag(stack).getBoolean("ScopeAlt") ? 0.4f : 0.8f); + posZAlt = Mth.lerp(times, posZAlt, NBTTool.getOrCreateTag(stack).getBoolean("ScopeAlt") ? 7.5f : 13.7f); + + float posY = switch (scopeType) { + case 0 -> 1.1f; + case 1 -> -0.18f; + case 2 -> posYAlt; + case 3 -> 1.1f; + default -> 0f; + }; + float scaleZ = switch (scopeType) { + case 0 -> 0.2f; + case 1 -> 0.6f; + case 2 -> scaleZAlt; + case 3 -> 0.2f; + default -> 0f; + }; + float posZ = switch (scopeType) { + case 0 -> 1f; + case 1 -> 6f; + case 2 -> posZAlt; + case 3 -> 1f; + default -> 0f; + }; + + + float posZAlt = stockType == 2 ? 1 : 0; + + gun.setPosX((float) (3.48f * zp)); + gun.setPosY((float) (posY * zp - 0.2f * zpz)); + gun.setPosZ((float) (posZ * zp + 0.2f * zpz) + posZAlt); + gun.setScaleZ((float) (1f - scaleZ * zp)); + + scope2.setScaleZ(1f - (0.7f * (float) zp)); + + GeoBone shen; + if (zt < 0.5) { + shen = getAnimationProcessor().getBone("fireRootNormal"); + } else { + shen = switch (scopeType) { + case 0 -> getAnimationProcessor().getBone("fireRoot0"); + case 1 -> getAnimationProcessor().getBone("fireRoot1"); + case 2 -> getAnimationProcessor().getBone("fireRoot2"); + case 3 -> getAnimationProcessor().getBone("fireRoot3"); + default -> getAnimationProcessor().getBone("fireRootNormal"); + }; + } + + fireRotY = (float) Mth.lerp(0.2f * times, fireRotY, 0.2f * ClientEventHandler.recoilHorizon * fpz); + fireRotZ = (float) Mth.lerp(2f * times, fireRotZ, (0.4f + 0.5 * fpz) * ClientEventHandler.recoilHorizon); + + shen.setPosX((float) (0.95f * ClientEventHandler.recoilHorizon * fpz * fp)); + shen.setPosY((float) (0.2f * fp + 0.24f * fr)); + shen.setPosZ((float) (1.225 * fp + 0.1f * fr + 0.55 * fpz)); + shen.setRotX((float) (0.14f * fp + 0.14f * fr + 0.14f * fpz)); + shen.setRotY(fireRotY); + shen.setRotZ(fireRotZ); + + shen.setPosX((float) (shen.getPosX() * (1 - 0.4 * zt))); + shen.setPosY((float) (shen.getPosY() * (1 - 0.5 * zt) * (isProne(player) ? 0.03 : 1))); + shen.setPosZ((float) (shen.getPosZ() * (1 - 0.7 * zt) * (isProne(player) ? 0.4 : 1))); + shen.setRotX((float) (shen.getRotX() * (1 - 0.27 * zt) * (barrelType == 1 ? 0.4 : 1.2) * (stockType == 2 ? 0.6 : 1.2) * (gripType == 1 ? 0.8 : 1.2) * (isProne(player) && gripType == 3 ? 0.03 : 1.2))); + shen.setRotY((float) (shen.getRotY() * (1 - 0.7 * zt))); + shen.setRotZ((float) (shen.getRotZ() * (1 - 0.65 * zt))); + + CrossHairOverlay.gunRot = shen.getRotZ(); + + NBTTool.getOrCreateTag(stack).putBoolean("HoloHidden", (gun.getPosX() <= 3 || Mth.abs(shen.getRotX()) > (scopeType == 2 ? 3 : 1) * Mth.DEG_TO_RAD || Mth.abs(main.getRotX()) > (scopeType == 2 ? 5.7 : 1) * Mth.DEG_TO_RAD || Mth.abs(main.getRotY()) > 3 * Mth.DEG_TO_RAD)); + + hammer.setRotX(50 * Mth.DEG_TO_RAD * (float) ClientEventHandler.revolverPreTime); + lun.setRotZ(-60 * Mth.DEG_TO_RAD * (float) ClientEventHandler.revolverWheelPreTime); + GeoBone ammo = getAnimationProcessor().getBone("ammo"); + GeoBone ammohole = getAnimationProcessor().getBone("ammohole"); + ammo.setRotZ(60 * Mth.DEG_TO_RAD * (float) ClientEventHandler.revolverWheelPreTime); + ammohole.setRotZ(-60 * Mth.DEG_TO_RAD * (float) ClientEventHandler.revolverWheelPreTime); + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + lun.setRotZ(0); + ammo.setRotZ(0); + ammohole.setRotZ(0); + } + + GeoBone root = getAnimationProcessor().getBone("root"); + root.setPosX((float) (movePosX + 20 * ClientEventHandler.drawTime + 9.3f * mph)); + root.setPosY((float) (swayY + movePosY - 40 * ClientEventHandler.drawTime - 2f * vY)); + root.setPosZ(!NBTTool.getOrCreateTag(stack).getBoolean("DA") && !NBTTool.getOrCreateTag(stack).getBoolean("canImmediatelyShoot") ? 0.2f * (float) ClientEventHandler.revolverPreTime : 0); + root.setRotX((float) ((swayX - Mth.DEG_TO_RAD * 60 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotX - 0.15f * vY))); + root.setRotY((float) (0.2f * movePosX + Mth.DEG_TO_RAD * 300 * ClientEventHandler.drawTime + Mth.DEG_TO_RAD * turnRotY)); + root.setRotZ((float) (0.2f * movePosX + moveRotZ + Mth.DEG_TO_RAD * 90 * ClientEventHandler.drawTime + 2.7f * mph + Mth.DEG_TO_RAD * turnRotZ)); + + GeoBone l = getAnimationProcessor().getBone("l"); + GeoBone r = getAnimationProcessor().getBone("r"); + rotXBipod = Mth.lerp(1.5f * times, rotXBipod, isProne(player) ? -90 : 0); + l.setRotX(rotXBipod * Mth.DEG_TO_RAD); + r.setRotX(rotXBipod * Mth.DEG_TO_RAD); + + float numR = (float) (1 - 0.22 * zt); + float numP = (float) (1 - 0.48 * zt); + + AnimationHelper.handleReloadShakeAnimation(stack, main, camera, numR, numP); + ClientEventHandler.shake(Mth.RAD_TO_DEG * camera.getRotX(), Mth.RAD_TO_DEG * camera.getRotY(), Mth.RAD_TO_DEG * camera.getRotZ()); + + barrel1.setPosZ((scopeType == 0 && gripType == 0) ? 17.9f : 0); + barrel2.setPosZ((scopeType == 0 && gripType == 0) ? 15.3f : 3); + + float flarePosZ = 0; + + if (scopeType > 0 || gripType > 0) { + if (barrelType == 1) { + flarePosZ = -21; + } else { + flarePosZ = -18; + } + } else if (barrelType == 1) { + flarePosZ = -3; + } + + flare.setPosZ(flarePosZ); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java new file mode 100644 index 000000000..88bd3305c --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/overlay/CrossHairOverlay.java @@ -0,0 +1,201 @@ +package com.atsuishio.superbwarfare.client.overlay; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.config.client.DisplayConfig; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.CameraType; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.client.event.RenderGuiEvent; + +import static com.atsuishio.superbwarfare.client.RenderHelper.preciseBlit; + +@EventBusSubscriber(value = Dist.CLIENT) +public class CrossHairOverlay { + + private static final ResourceLocation REX_HORIZONTAL = ModUtils.loc("textures/screens/rex_horizontal.png"); + private static final ResourceLocation REX_VERTICAL = ModUtils.loc("textures/screens/rex_vertical.png"); + + public static int HIT_INDICATOR = 0; + public static int HEAD_INDICATOR = 0; + public static int KILL_INDICATOR = 0; + public static int VEHICLE_INDICATOR = 0; + private static float scopeScale = 1f; + public static float gunRot; + + @SubscribeEvent + public static void eventHandler(RenderGuiEvent.Pre event) { + int w = event.getGuiGraphics().guiWidth(); + int h = event.getGuiGraphics().guiHeight(); + + Player player = Minecraft.getInstance().player; + if (player == null) { + return; + } + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + if (cap != null && cap.edit) return; + + // todo ban hand +// if (!player.getMainHandItem().is(ModTags.Items.GUN) || (player.getVehicle() instanceof ArmedVehicleEntity iArmedVehicle && iArmedVehicle.banHand(player))) +// return; + + GuiGraphics guiGraphics = event.getGuiGraphics(); + + ItemStack stack = player.getMainHandItem(); + double spread = ClientEventHandler.gunSpread + 1 * ClientEventHandler.firePos; + float deltaFrame = event.getPartialTick().getGameTimeDeltaTicks(); + float moveX = 0; + float moveY = 0; + + // TODO perk +// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + + if (DisplayConfig.FLOAT_CROSS_HAIR.get() && player.getVehicle() == null) { + moveX = (float) (-6 * ClientEventHandler.turnRot[1] - (player.isSprinting() ? 10 : 6) * ClientEventHandler.movePosX); + moveY = (float) (-6 * ClientEventHandler.turnRot[0] + 6 * (float) ClientEventHandler.velocityY - (player.isSprinting() ? 10 : 6) * ClientEventHandler.movePosY - 0.25 * ClientEventHandler.firePos); + } + + RenderSystem.disableDepthTest(); + RenderSystem.depthMask(false); + RenderSystem.enableBlend(); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + RenderSystem.setShaderColor(1, 1, 1, 1); + + scopeScale = (float) Mth.lerp(0.5F * deltaFrame, scopeScale, 1 + 1.5f * spread); + float minLength = (float) Math.min(w, h); + float scaledMinLength = Math.min((float) w / minLength, (float) h / minLength) * 0.012f * scopeScale; + float finLength = Mth.floor(minLength * scaledMinLength); + float finPosX = ((w - finLength) / 2) + moveX; + float finPosY = ((h - finLength) / 2) + moveY; + + if (shouldRenderCrossHair(player) || (Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON && stack.is(ModItems.MINIGUN.get())) || (Minecraft.getInstance().options.getCameraType() == CameraType.THIRD_PERSON_BACK && (ClientEventHandler.zoomTime > 0 || ClientEventHandler.pullPos > 0))) { + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); + if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0) { + if (stack.is(ModTags.Items.SHOTGUN)) { +// if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { +// normalCrossHair(guiGraphics, w, h, spread, moveX, moveY); +// } else { + shotgunCrossHair(guiGraphics, finPosX, finPosY, finLength); +// } + } else { + normalCrossHair(guiGraphics, w, h, spread, moveX, moveY); + } + } + } + + if (stack.is(ModItems.BOCEK.get())) { + if (NBTTool.getOrCreateTag(stack).getBoolean("HoloHidden")) { + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/point.png"), w / 2f - 7.5f + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); + if (!player.isSprinting() || player.getPersistentData().getDouble("noRun") > 0 || ClientEventHandler.pullPos > 0) { + if (ClientEventHandler.zoomTime < 0.1) { +// if (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug) { +// normalCrossHair(guiGraphics, w, h, spread, moveX, moveY); +// } else { + shotgunCrossHair(guiGraphics, finPosX, finPosY, finLength); +// } + } else { + normalCrossHair(guiGraphics, w, h, spread, moveX, moveY); + } + } + } + } + + // 在开启伤害指示器时才进行渲染 + if (DisplayConfig.KILL_INDICATION.get() + // TODO ah6 +// && !(player.getVehicle() instanceof Ah6Entity ah6Entity && ah6Entity.getFirstPassenger() == player) + ) { + renderKillIndicator(guiGraphics, w, h, moveX, moveY); + } + + RenderSystem.depthMask(true); + RenderSystem.defaultBlendFunc(); + RenderSystem.enableDepthTest(); + RenderSystem.disableBlend(); + RenderSystem.setShaderColor(1, 1, 1, 1); + } + + private static void normalCrossHair(GuiGraphics guiGraphics, int w, int h, double spread, float moveX, float moveY) { + PoseStack poseStack = guiGraphics.pose(); + + poseStack.pushPose(); + poseStack.rotateAround(Axis.ZP.rotationDegrees(-gunRot * Mth.RAD_TO_DEG), w / 2f + moveX, h / 2f + moveY, 0); + preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 13.5f - 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); + preciseBlit(guiGraphics, REX_HORIZONTAL, (float) (w / 2f - 2.5f + 2.8f * spread) + moveX, h / 2f - 7.5f + moveY, 0, 0, 16, 16, 16, 16); + preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 2.5f + 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); + preciseBlit(guiGraphics, REX_VERTICAL, w / 2f - 7.5f + moveX, (float) (h / 2f - 13.5f - 2.8f * spread) + moveY, 0, 0, 16, 16, 16, 16); + poseStack.popPose(); + } + + private static void shotgunCrossHair(GuiGraphics guiGraphics, float finPosX, float finPosY, float finLength) { + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/shotgun_hud.png"), finPosX, finPosY, 0, 0.0F, finLength, finLength, finLength, finLength); + } + + private static boolean shouldRenderCrossHair(Player player) { + if (player == null) return false; + + if (player.isSpectator()) return false; + if (!player.getMainHandItem().is(ModTags.Items.GUN) || ClientEventHandler.zoomTime > 0.8) + return false; + + return !(player.getMainHandItem().getItem() == ModItems.M_79.get() || player.getMainHandItem().getItem() == ModItems.BOCEK.get() || player.getMainHandItem().getItem() == ModItems.SECONDARY_CATACLYSM.get()) + && Minecraft.getInstance().options.getCameraType() == CameraType.FIRST_PERSON; + } + + private static void renderKillIndicator(GuiGraphics guiGraphics, int w, int h, float moveX, float moveY) { + float posX = w / 2f - 7.5f + (float) (2 * (Math.random() - 0.5f)); + float posY = h / 2f - 7.5f + (float) (2 * (Math.random() - 0.5f)); + float rate = (40 - KILL_INDICATOR * 5) / 5.5f; + + if (HIT_INDICATOR > 0) { + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/hit_marker.png"), posX + moveX, posY + moveY, 0, 0, 16, 16, 16, 16); + } + + if (VEHICLE_INDICATOR > 0) { + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/hit_marker_vehicle.png"), posX + moveX, posY + moveY, 0, 0, 16, 16, 16, 16); + } + + if (HEAD_INDICATOR > 0) { + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/headshot_mark.png"), posX + moveX, posY + moveY, 0, 0, 16, 16, 16, 16); + } + + if (KILL_INDICATOR > 0) { + float posX1 = w / 2f - 7.5f - 2 + rate + moveX; + float posY1 = h / 2f - 7.5f - 2 + rate + moveY; + float posX2 = w / 2f - 7.5f + 2 - rate + moveX; + float posY2 = h / 2f - 7.5f + 2 - rate + moveY; + + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/kill_mark1.png"), posX1, posY1, 0, 0, 16, 16, 16, 16); + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/kill_mark2.png"), posX2, posY1, 0, 0, 16, 16, 16, 16); + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/kill_mark3.png"), posX1, posY2, 0, 0, 16, 16, 16, 16); + preciseBlit(guiGraphics, ModUtils.loc("textures/screens/kill_mark4.png"), posX2, posY2, 0, 0, 16, 16, 16, 16); + } + } + + @SubscribeEvent + public static void onClientTick(ClientTickEvent.Post event) { + HEAD_INDICATOR = Math.max(0, HEAD_INDICATOR - 1); + HIT_INDICATOR = Math.max(0, HIT_INDICATOR - 1); + KILL_INDICATOR = Math.max(0, KILL_INDICATOR - 1); + VEHICLE_INDICATOR = Math.max(0, VEHICLE_INDICATOR - 1); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/AK12ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/AK12ItemRenderer.java new file mode 100644 index 000000000..a639d9a78 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/AK12ItemRenderer.java @@ -0,0 +1,173 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.AK12Layer; +import com.atsuishio.superbwarfare.client.model.item.AK12ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.AK12Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class AK12ItemRenderer extends GeoItemRenderer { + + public AK12ItemRenderer() { + super(new AK12ItemModel()); + this.addRenderLayer(new AK12Layer(this)); + } + + @Override + public RenderType getRenderType(AK12Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected AK12Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, AK12Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, AK12Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player != null) { + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("Cross1")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 1); + } + + if (name.equals("Cross2")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 2); + } + + if (name.equals("Cross3")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 3); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2 + && (name.equals("hidden2"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 3 + && (name.equals("jing") || name.equals("Barrel") || name.equals("humu") || name.equals("qiangguan") || name.equals("houzhunxing"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + if (name.equals("flare")) { + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.BARREL) == 1) { + bone.setPosZ(2.25f); + } + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.BARREL) == 2) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + // TODO handle gun attachments +// ItemModelHelper.handleGunAttachments(bone, itemStack, name); + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(AK12Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/AK47ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/AK47ItemRenderer.java new file mode 100644 index 000000000..7d1ef9457 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/AK47ItemRenderer.java @@ -0,0 +1,192 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.AK47Layer; +import com.atsuishio.superbwarfare.client.model.item.AK47ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.AK47Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class AK47ItemRenderer extends GeoItemRenderer { + + public AK47ItemRenderer() { + super(new AK47ItemModel()); + this.addRenderLayer(new AK47Layer(this)); + } + + @Override + public RenderType getRenderType(AK47Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected AK47Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, AK47Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, AK47Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player != null) { + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("Cross1")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 1); + } + + if (name.equals("Cross2")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 2); + } + + if (name.equals("Cross3")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 3); + } + + if (name.equals("humu1")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.GRIP) != 0); + } + + if (name.equals("humu2")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.GRIP) == 0); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2 + && (name.equals("Hidden") || name.equals("gun") || name.equals("Lefthand")) && ClientEventHandler.zoom && !NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden")) { + bone.setHidden(true); + renderingArms = false; + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 3 + && (name.equals("jing") || name.equals("Barrel") || name.equals("humu") || name.equals("qiangguan") || name.equals("houzhunxing"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.BARREL) == 2) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.55 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.55 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (name.equals("Mag0")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.MAGAZINE) != 0); + } + + if (name.equals("Mag1")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.MAGAZINE) != 1); + } + + if (name.equals("Mag2")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.MAGAZINE) != 2); + } + + // TODO handle gun attachments +// ItemModelHelper.handleGunAttachments(bone, itemStack, name); + } + + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(AK47Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Aa12ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Aa12ItemRenderer.java new file mode 100644 index 000000000..32b8245c4 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Aa12ItemRenderer.java @@ -0,0 +1,141 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.Aa12Layer; +import com.atsuishio.superbwarfare.client.model.item.Aa12ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.shotgun.Aa12Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class Aa12ItemRenderer extends GeoItemRenderer { + + public Aa12ItemRenderer() { + super(new Aa12ItemModel()); + this.addRenderLayer(new Aa12Layer(this)); + } + + @Override + public RenderType getRenderType(Aa12Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected Aa12Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, Aa12Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, Aa12Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player != null) { + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.BARREL) == 2) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + // TODO handle gun attachments +// ItemModelHelper.handleGunAttachments(bone, itemStack, name); + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(Aa12Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/BocekItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/BocekItemRenderer.java new file mode 100644 index 000000000..804e6efca --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/BocekItemRenderer.java @@ -0,0 +1,140 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.BocekLayer; +import com.atsuishio.superbwarfare.client.model.item.BocekItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.special.BocekItem; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class BocekItemRenderer extends GeoItemRenderer { + + public BocekItemRenderer() { + super(new BocekItemModel()); + this.addRenderLayer(new BocekLayer(this)); + } + + @Override + public RenderType getRenderType(BocekItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected BocekItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, BocekItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, BocekItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("holo")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") || !ClientEventHandler.zoom); + } + + if (name.equals("arrow")) { + bone.setHidden(GunsTool.getGunIntTag(itemStack, "ArrowEmpty") > 0); + } + + if (name.equals("jian")) { + bone.setHidden(GunsTool.getGunIntTag(itemStack, "MaxAmmo") == 0); + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(BocekItem instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/DevotionItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/DevotionItemRenderer.java new file mode 100644 index 000000000..90d135d25 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/DevotionItemRenderer.java @@ -0,0 +1,142 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.DevotionLayer; +import com.atsuishio.superbwarfare.client.model.item.DevotionItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.machinegun.DevotionItem; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class DevotionItemRenderer extends GeoItemRenderer { + + public DevotionItemRenderer() { + super(new DevotionItemModel()); + this.addRenderLayer(new DevotionLayer(this)); + } + + @Override + public RenderType getRenderType(DevotionItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected DevotionItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, DevotionItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, DevotionItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (name.equals("holo")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") || !ClientEventHandler.zoom); + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(DevotionItem instance) { + return super.getTextureLocation(instance); + } +} + diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Glock17ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Glock17ItemRenderer.java new file mode 100644 index 000000000..f5efc9add --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Glock17ItemRenderer.java @@ -0,0 +1,138 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.Glock17Layer; +import com.atsuishio.superbwarfare.client.layer.gun.Glock17LightLayer; +import com.atsuishio.superbwarfare.client.model.item.Glock17ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.handgun.Glock17Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class Glock17ItemRenderer extends GeoItemRenderer { + + public Glock17ItemRenderer() { + super(new Glock17ItemModel()); + this.addRenderLayer(new Glock17Layer(this)); + this.addRenderLayer(new Glock17LightLayer(this)); + } + + @Override + public RenderType getRenderType(Glock17Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected Glock17Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, Glock17Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, Glock17Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(Glock17Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Glock18ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Glock18ItemRenderer.java new file mode 100644 index 000000000..16cb64fdd --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Glock18ItemRenderer.java @@ -0,0 +1,138 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.Glock18Layer; +import com.atsuishio.superbwarfare.client.layer.gun.Glock18LightLayer; +import com.atsuishio.superbwarfare.client.model.item.Glock18ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.handgun.Glock18Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class Glock18ItemRenderer extends GeoItemRenderer { + + public Glock18ItemRenderer() { + super(new Glock18ItemModel()); + this.addRenderLayer(new Glock18Layer(this)); + this.addRenderLayer(new Glock18LightLayer(this)); + } + + @Override + public RenderType getRenderType(Glock18Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected Glock18Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, Glock18Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, Glock18Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(Glock18Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Hk416ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Hk416ItemRenderer.java new file mode 100644 index 000000000..2506791ab --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Hk416ItemRenderer.java @@ -0,0 +1,169 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.Hk416Layer; +import com.atsuishio.superbwarfare.client.model.item.Hk416ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.Hk416Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class Hk416ItemRenderer extends GeoItemRenderer { + + public Hk416ItemRenderer() { + super(new Hk416ItemModel()); + this.addRenderLayer(new Hk416Layer(this)); + } + + @Override + public RenderType getRenderType(Hk416Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected Hk416Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, Hk416Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, Hk416Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("Cross1")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 1); + } + + if (name.equals("Cross2")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 2); + } + + if (name.equals("Cross3")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 3); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2 + && (name.equals("hidden"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 3 + && (name.equals("jing") || name.equals("Barrel") || name.equals("yugu") || name.equals("qiangguan"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.BARREL) == 2) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.55 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.55 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + // TODO handle gun attachments +// ItemModelHelper.handleGunAttachments(bone, itemStack, name); + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(Hk416Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/HomemadeShotgunItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/HomemadeShotgunItemRenderer.java new file mode 100644 index 000000000..0a091e6e7 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/HomemadeShotgunItemRenderer.java @@ -0,0 +1,138 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.HomemadeShotgunLayer; +import com.atsuishio.superbwarfare.client.model.item.HomemadeShotgunItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.shotgun.HomemadeShotgunItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class HomemadeShotgunItemRenderer extends GeoItemRenderer { + + public HomemadeShotgunItemRenderer() { + super(new HomemadeShotgunItemModel()); + this.addRenderLayer(new HomemadeShotgunLayer(this)); + } + + @Override + public RenderType getRenderType(HomemadeShotgunItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected HomemadeShotgunItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, HomemadeShotgunItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, HomemadeShotgunItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player != null) { + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(HomemadeShotgunItem instance) { + return super.getTextureLocation(instance); + } +} + diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/HuntingRifleItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/HuntingRifleItemRenderer.java new file mode 100644 index 000000000..f7e417a6f --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/HuntingRifleItemRenderer.java @@ -0,0 +1,137 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.HuntingRifleLayer; +import com.atsuishio.superbwarfare.client.model.item.HuntingRifleItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.sniper.HuntingRifleItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class HuntingRifleItemRenderer extends GeoItemRenderer { + + public HuntingRifleItemRenderer() { + super(new HuntingRifleItemModel()); + this.addRenderLayer(new HuntingRifleLayer(this)); + } + + @Override + public RenderType getRenderType(HuntingRifleItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected HuntingRifleItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, HuntingRifleItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, HuntingRifleItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(HuntingRifleItem instance) { + return super.getTextureLocation(instance); + } +} + diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/JavelinItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/JavelinItemRenderer.java new file mode 100644 index 000000000..544b39725 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/JavelinItemRenderer.java @@ -0,0 +1,25 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.model.item.JavelinItemModel; +import com.atsuishio.superbwarfare.item.gun.launcher.JavelinItem; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.renderer.GeoItemRenderer; + +public class JavelinItemRenderer extends GeoItemRenderer { + + public JavelinItemRenderer() { + super(new JavelinItemModel()); + } + + @Override + public RenderType getRenderType(JavelinItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + @Override + public ResourceLocation getTextureLocation(JavelinItem instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/K98ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/K98ItemRenderer.java new file mode 100644 index 000000000..aeb44508d --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/K98ItemRenderer.java @@ -0,0 +1,136 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.K98Layer; +import com.atsuishio.superbwarfare.client.model.item.K98ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.sniper.K98Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class K98ItemRenderer extends GeoItemRenderer { + + public K98ItemRenderer() { + super(new K98ItemModel()); + this.addRenderLayer(new K98Layer(this)); + } + + @Override + public RenderType getRenderType(K98Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected K98Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, K98Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, K98Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(K98Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M1911ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M1911ItemRenderer.java new file mode 100644 index 000000000..37c0298d6 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M1911ItemRenderer.java @@ -0,0 +1,136 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.M1911Layer; +import com.atsuishio.superbwarfare.client.model.item.M1911ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.handgun.M1911Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class M1911ItemRenderer extends GeoItemRenderer { + + public M1911ItemRenderer() { + super(new M1911ItemModel()); + this.addRenderLayer(new M1911Layer(this)); + } + + @Override + public RenderType getRenderType(M1911Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected M1911Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, M1911Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, M1911Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(M1911Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M4ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M4ItemRenderer.java new file mode 100644 index 000000000..7c0270225 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M4ItemRenderer.java @@ -0,0 +1,180 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.M4Layer; +import com.atsuishio.superbwarfare.client.model.item.M4ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.M4Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class M4ItemRenderer extends GeoItemRenderer { + + public M4ItemRenderer() { + super(new M4ItemModel()); + this.addRenderLayer(new M4Layer(this)); + } + + @Override + public RenderType getRenderType(M4Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected M4Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, M4Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, M4Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("Cross1")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 1); + } + + if (name.equals("Cross2")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 2 + || NBTTool.getOrCreateTag(itemStack).getBoolean("ScopeAlt")); + } + + if (name.equals("CrossAlt")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 2 + || !(NBTTool.getOrCreateTag(itemStack).getBoolean("ScopeAlt"))); + } + + if (name.equals("Cross3")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 3); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2 && !NBTTool.getOrCreateTag(itemStack).getBoolean("ScopeAlt") && (name.equals("hidden"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 3 + && (name.equals("hidden2") || name.equals("yugu") || name.equals("qiangguan") || name.equals("Barrel"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.BARREL) == 2) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.55 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.55 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (name.equals("Sight")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 3); + } + + // TODO handle gun attachments +// ItemModelHelper.handleGunAttachments(bone, itemStack, name); + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(M4Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M60ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M60ItemRenderer.java new file mode 100644 index 000000000..18203c849 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M60ItemRenderer.java @@ -0,0 +1,136 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.M60Layer; +import com.atsuishio.superbwarfare.client.model.item.M60ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.machinegun.M60Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class M60ItemRenderer extends GeoItemRenderer { + + public M60ItemRenderer() { + super(new M60ItemModel()); + this.addRenderLayer(new M60Layer(this)); + } + + @Override + public RenderType getRenderType(M60Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected M60Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, M60Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, M60Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(M60Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M79ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M79ItemRenderer.java new file mode 100644 index 000000000..0bdbd89f2 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M79ItemRenderer.java @@ -0,0 +1,136 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.M79Layer; +import com.atsuishio.superbwarfare.client.model.item.M79ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.launcher.M79Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class M79ItemRenderer extends GeoItemRenderer { + + public M79ItemRenderer() { + super(new M79ItemModel()); + this.addRenderLayer(new M79Layer(this)); + } + + @Override + public RenderType getRenderType(M79Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected M79Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, M79Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, M79Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(M79Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M870ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M870ItemRenderer.java new file mode 100644 index 000000000..e21bf5642 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M870ItemRenderer.java @@ -0,0 +1,136 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.M870Layer; +import com.atsuishio.superbwarfare.client.model.item.M870ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.shotgun.M870Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class M870ItemRenderer extends GeoItemRenderer { + + public M870ItemRenderer() { + super(new M870ItemModel()); + this.addRenderLayer(new M870Layer(this)); + } + + @Override + public RenderType getRenderType(M870Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected M870Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, M870Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, M870Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(M870Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M98bItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M98bItemRenderer.java new file mode 100644 index 000000000..173bc6a29 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/M98bItemRenderer.java @@ -0,0 +1,145 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.M98bLayer; +import com.atsuishio.superbwarfare.client.model.item.M98bItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.sniper.M98bItem; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class M98bItemRenderer extends GeoItemRenderer { + + public M98bItemRenderer() { + super(new M98bItemModel()); + this.addRenderLayer(new M98bLayer(this)); + } + + @Override + public RenderType getRenderType(M98bItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected M98bItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, M98bItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, M98bItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (name.equals("scope2")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") || !ClientEventHandler.zoom); + } + + if (name.equals("qiang")) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden")); + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(M98bItem instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/MarlinItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/MarlinItemRenderer.java new file mode 100644 index 000000000..91f81852b --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/MarlinItemRenderer.java @@ -0,0 +1,136 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.MarlinLayer; +import com.atsuishio.superbwarfare.client.model.item.MarlinItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.MarlinItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class MarlinItemRenderer extends GeoItemRenderer { + + public MarlinItemRenderer() { + super(new MarlinItemModel()); + this.addRenderLayer(new MarlinLayer(this)); + } + + @Override + public RenderType getRenderType(MarlinItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected MarlinItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, MarlinItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, MarlinItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(MarlinItem instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/MinigunItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/MinigunItemRenderer.java new file mode 100644 index 000000000..0306d8c61 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/MinigunItemRenderer.java @@ -0,0 +1,138 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.MinigunHeatLayer; +import com.atsuishio.superbwarfare.client.layer.gun.MinigunLayer; +import com.atsuishio.superbwarfare.client.model.item.MinigunItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.machinegun.MinigunItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class MinigunItemRenderer extends GeoItemRenderer { + + public MinigunItemRenderer() { + super(new MinigunItemModel()); + this.addRenderLayer(new MinigunLayer(this)); + this.addRenderLayer(new MinigunHeatLayer(this)); + } + + @Override + public RenderType getRenderType(MinigunItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected MinigunItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, MinigunItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, MinigunItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (1 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (1 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(MinigunItem instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Mk14ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Mk14ItemRenderer.java new file mode 100644 index 000000000..6406d1b7a --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Mk14ItemRenderer.java @@ -0,0 +1,173 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.Mk14Layer; +import com.atsuishio.superbwarfare.client.model.item.Mk14ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.Mk14Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class Mk14ItemRenderer extends GeoItemRenderer { + + public Mk14ItemRenderer() { + super(new Mk14ItemModel()); + this.addRenderLayer(new Mk14Layer(this)); + } + + @Override + public RenderType getRenderType(Mk14Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected Mk14Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, Mk14Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, Mk14Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("qiaojia")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 0); + } + + if (name.equals("Cross1")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 1); + } + + if (name.equals("Cross2")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 2); + } + + if (name.equals("Cross3")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 3); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2 + && (name.equals("hidden"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 3 + && (name.equals("jing") || name.equals("yugu") || name.equals("qiangguan") || name.equals("Barrel"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.BARREL) == 2) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + // TODO handle gun attachments +// ItemModelHelper.handleGunAttachments(bone, itemStack, name); + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(Mk14Item instance) { + return super.getTextureLocation(instance); + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/MosinNagantItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/MosinNagantItemRenderer.java new file mode 100644 index 000000000..f0a370499 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/MosinNagantItemRenderer.java @@ -0,0 +1,145 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.MosinNagantLayer; +import com.atsuishio.superbwarfare.client.model.item.MosinNagantItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.sniper.MosinNagantItem; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class MosinNagantItemRenderer extends GeoItemRenderer { + + public MosinNagantItemRenderer() { + super(new MosinNagantItemModel()); + this.addRenderLayer(new MosinNagantLayer(this)); + } + + @Override + public RenderType getRenderType(MosinNagantItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected MosinNagantItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, MosinNagantItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, MosinNagantItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("rex")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") || !ClientEventHandler.zoom); + } + + if (name.equals("jia") || name.equals("b1") || name.equals("b2")) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden")); + } + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(MosinNagantItem instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Mp443ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Mp443ItemRenderer.java new file mode 100644 index 000000000..638370ce0 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Mp443ItemRenderer.java @@ -0,0 +1,138 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.Mp443Layer; +import com.atsuishio.superbwarfare.client.layer.gun.Mp443LightLayer; +import com.atsuishio.superbwarfare.client.model.item.Mp443ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.handgun.Mp443Item; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class Mp443ItemRenderer extends GeoItemRenderer { + + public Mp443ItemRenderer() { + super(new Mp443ItemModel()); + this.addRenderLayer(new Mp443Layer(this)); + this.addRenderLayer(new Mp443LightLayer(this)); + } + + @Override + public RenderType getRenderType(Mp443Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected Mp443Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, Mp443Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, Mp443Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(Mp443Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Ntw20Renderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Ntw20Renderer.java new file mode 100644 index 000000000..213e4bc57 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Ntw20Renderer.java @@ -0,0 +1,173 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.Ntw20Layer; +import com.atsuishio.superbwarfare.client.model.item.Ntw20Model; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.heavy.Ntw20Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class Ntw20Renderer extends GeoItemRenderer { + + public Ntw20Renderer() { + super(new Ntw20Model()); + this.addRenderLayer(new Ntw20Layer(this)); + } + + @Override + public RenderType getRenderType(Ntw20Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected Ntw20Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, Ntw20Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, Ntw20Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("ironSight")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 0); + } + + if (name.equals("Cross1")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 1); + } + + if (name.equals("Cross2")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 2); + } + + if (name.equals("Cross3")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 3); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2 + && (name.equals("bone1") || name.equals("zhituiqi") || name.equals("guan") || name.equals("hidden"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 3 + && (name.equals("bone1") || name.equals("zhituiqi") || name.equals("guan") || name.equals("jing") || name.equals("rail") || name.equals("base2") || name.equals("guan7"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.BARREL) == 2) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.55 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.55 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + // TODO handle gun attachments +// ItemModelHelper.handleGunAttachments(bone, itemStack, name); + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(Ntw20Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Qbz95ItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Qbz95ItemRenderer.java new file mode 100644 index 000000000..074612295 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/Qbz95ItemRenderer.java @@ -0,0 +1,181 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.Qbz95Layer; +import com.atsuishio.superbwarfare.client.model.item.Qbz95ItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.Qbz95Item; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class Qbz95ItemRenderer extends GeoItemRenderer { + + public Qbz95ItemRenderer() { + super(new Qbz95ItemModel()); + this.addRenderLayer(new Qbz95Layer(this)); + } + + @Override + public RenderType getRenderType(Qbz95Item animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected Qbz95Item animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, Qbz95Item animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, Qbz95Item animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("Cross1")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 1); + } + + if (name.equals("tiba")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 0); + } + + if (name.equals("longbow")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 0); + } + + if (name.equals("under_rail")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.GRIP) == 0); + } + + if (name.equals("Cross2")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 2); + } + + if (name.equals("Cross3")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 3); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2 + && (name.equals("hidden"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 3 + && (name.equals("hidden2") || name.equals("jimiao2"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.BARREL) == 2) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.55 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.55 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + // TODO handle gun attachments +// ItemModelHelper.handleGunAttachments(bone, itemStack, name); + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(Qbz95Item instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RocketItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RocketItemRenderer.java new file mode 100644 index 000000000..6f36d1e9b --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RocketItemRenderer.java @@ -0,0 +1,18 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.model.item.RocketItemModel; +import com.atsuishio.superbwarfare.item.common.ammo.Rocket; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.renderer.GeoItemRenderer; + +public class RocketItemRenderer extends GeoItemRenderer { + + public RocketItemRenderer() { + super(new RocketItemModel()); + } + + @Override + public ResourceLocation getTextureLocation(Rocket instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RpgItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RpgItemRenderer.java new file mode 100644 index 000000000..fb31f68cb --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RpgItemRenderer.java @@ -0,0 +1,139 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.model.item.RpgItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.launcher.RpgItem; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class RpgItemRenderer extends GeoItemRenderer { + + public RpgItemRenderer() { + super(new RpgItemModel()); + } + + @Override + public RenderType getRenderType(RpgItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected RpgItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, RpgItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, RpgItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("Rockets")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("empty")); + } + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(RpgItem instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RpkItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RpkItemRenderer.java new file mode 100644 index 000000000..f5aaa0112 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/RpkItemRenderer.java @@ -0,0 +1,141 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.RpkLayer; +import com.atsuishio.superbwarfare.client.model.item.RpkItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.machinegun.RpkItem; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class RpkItemRenderer extends GeoItemRenderer { + + public RpkItemRenderer() { + super(new RpkItemModel()); + this.addRenderLayer(new RpkLayer(this)); + } + + @Override + public RenderType getRenderType(RpkItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected RpkItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, RpkItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, RpkItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("holo")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") || !ClientEventHandler.zoom); + } + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(RpkItem instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SecondaryCataclysmRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SecondaryCataclysmRenderer.java new file mode 100644 index 000000000..b6dbbeb2a --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SecondaryCataclysmRenderer.java @@ -0,0 +1,136 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.SecondaryCataclysmLightLayer; +import com.atsuishio.superbwarfare.client.model.item.SecondaryCataclysmModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.launcher.SecondaryCataclysm; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class SecondaryCataclysmRenderer extends GeoItemRenderer { + + public SecondaryCataclysmRenderer() { + super(new SecondaryCataclysmModel()); + this.addRenderLayer(new SecondaryCataclysmLightLayer(this)); + } + + @Override + public RenderType getRenderType(SecondaryCataclysm animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected SecondaryCataclysm animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, SecondaryCataclysm animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, SecondaryCataclysm animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(SecondaryCataclysm instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SentinelItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SentinelItemRenderer.java new file mode 100644 index 000000000..ff0cb6b41 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SentinelItemRenderer.java @@ -0,0 +1,151 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.SentinelLayer; +import com.atsuishio.superbwarfare.client.layer.gun.SentinelLightLayer; +import com.atsuishio.superbwarfare.client.model.item.SentinelItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.sniper.SentinelItem; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.capabilities.Capabilities; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class SentinelItemRenderer extends GeoItemRenderer { + + public SentinelItemRenderer() { + super(new SentinelItemModel()); + this.addRenderLayer(new SentinelLayer(this)); + this.addRenderLayer(new SentinelLightLayer(this)); + } + + @Override + public RenderType getRenderType(SentinelItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected SentinelItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, SentinelItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, SentinelItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (name.equals("holo")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") || !ClientEventHandler.zoom); + } + + var cap = itemStack.getCapability(Capabilities.EnergyStorage.ITEM); + var flag = cap != null && cap.getEnergyStored() > 0; + + if (name.equals("charge")) { + bone.setHidden(!flag); + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(SentinelItem instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SksItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SksItemRenderer.java new file mode 100644 index 000000000..409b10437 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SksItemRenderer.java @@ -0,0 +1,141 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.SksLayer; +import com.atsuishio.superbwarfare.client.model.item.SksItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.rifle.SksItem; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class SksItemRenderer extends GeoItemRenderer { + + public SksItemRenderer() { + super(new SksItemModel()); + this.addRenderLayer(new SksLayer(this)); + } + + @Override + public RenderType getRenderType(SksItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected SksItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, SksItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, SksItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("holo")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") || !ClientEventHandler.zoom); + } + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(SksItem instance) { + return super.getTextureLocation(instance); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SvdItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SvdItemRenderer.java new file mode 100644 index 000000000..22071801e --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/SvdItemRenderer.java @@ -0,0 +1,166 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.SvdLayer; +import com.atsuishio.superbwarfare.client.model.item.SvdItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.sniper.SvdItem; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class SvdItemRenderer extends GeoItemRenderer { + + public SvdItemRenderer() { + super(new SvdItemModel()); + this.addRenderLayer(new SvdLayer(this)); + } + + @Override + public RenderType getRenderType(SvdItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected SvdItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, SvdItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, SvdItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("mount")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 0 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2); + } + + if (name.equals("Cross1")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 1); + } + + if (name.equals("Cross2")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 2); + } + + if ((GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 3) + && (name.equals("Hidden2") || name.equals("Hidden") || name.equals("gun") || name.equals("bolt") || name.equals("Lefthand") || name.equals("Barrel") || name.equals("bipod") || name.equals("mount")) && ClientEventHandler.zoom && !NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden")) { + bone.setHidden(true); + renderingArms = false; + } + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.BARREL) == 2 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.BARREL) == 3) { + bone.setHidden(true); + } else { + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2 && ClientEventHandler.zoom && !NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden")) { + bone.setPosY(-2f); + } + bone.setHidden(false); + bone.setScaleX((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.75 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + // TODO handle gun attachments +// ItemModelHelper.handleGunAttachments(bone, itemStack, name); + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(SvdItem instance) { + return super.getTextureLocation(instance); + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/TaserItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/TaserItemRenderer.java new file mode 100644 index 000000000..5e89f62de --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/TaserItemRenderer.java @@ -0,0 +1,123 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.model.item.TaserItemModel; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.special.TaserItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class TaserItemRenderer extends GeoItemRenderer { + + public TaserItemRenderer() { + super(new TaserItemModel()); + } + + @Override + public RenderType getRenderType(TaserItem animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected TaserItem animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, TaserItem animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, TaserItem animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone2(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone2(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(TaserItem instance) { + return super.getTextureLocation(instance); + } +} + diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/TracheliumItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/TracheliumItemRenderer.java new file mode 100644 index 000000000..f409beb34 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/TracheliumItemRenderer.java @@ -0,0 +1,183 @@ +package com.atsuishio.superbwarfare.client.renderer.item; + +import com.atsuishio.superbwarfare.client.AnimationHelper; +import com.atsuishio.superbwarfare.client.layer.gun.TracheliumLayer; +import com.atsuishio.superbwarfare.client.layer.gun.TracheliumLightLayer; +import com.atsuishio.superbwarfare.client.model.item.TracheliumItemModel; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.handgun.Trachelium; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.RenderUtil; + +import java.util.HashSet; +import java.util.Set; + +public class TracheliumItemRenderer extends GeoItemRenderer { + + public TracheliumItemRenderer() { + super(new TracheliumItemModel()); + this.addRenderLayer(new TracheliumLayer(this)); + this.addRenderLayer(new TracheliumLightLayer(this)); + } + + @Override + public RenderType getRenderType(Trachelium animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } + + private static final float SCALE_RECIPROCAL = 1.0f / 16.0f; + protected boolean renderArms = false; + protected MultiBufferSource currentBuffer; + protected RenderType renderType; + public ItemDisplayContext transformType; + protected Trachelium animatable; + private final Set hiddenBones = new HashSet<>(); + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack matrixStack, MultiBufferSource bufferIn, int combinedLightIn, int p_239207_6_) { + this.transformType = transformType; + if (this.animatable != null) + this.animatable.getTransformType(transformType); + super.renderByItem(stack, transformType, matrixStack, bufferIn, combinedLightIn, p_239207_6_); + } + + @Override + public void actuallyRender(PoseStack matrixStackIn, Trachelium animatable, BakedGeoModel model, RenderType type, MultiBufferSource renderTypeBuffer, VertexConsumer vertexBuilder, boolean isRenderer, float partialTicks, int packedLightIn, + int packedOverlayIn, int color) { + this.currentBuffer = renderTypeBuffer; + this.renderType = type; + this.animatable = animatable; + super.actuallyRender(matrixStackIn, animatable, model, type, renderTypeBuffer, vertexBuilder, isRenderer, partialTicks, packedLightIn, packedOverlayIn, color); + if (this.renderArms) { + this.renderArms = false; + } + } + + @Override + public void renderRecursively(PoseStack stack, Trachelium animatable, GeoBone bone, RenderType type, MultiBufferSource buffer, VertexConsumer bufferIn, boolean isReRender, float partialTick, int packedLightIn, int packedOverlayIn, int color) { + Minecraft mc = Minecraft.getInstance(); + String name = bone.getName(); + boolean renderingArms = false; + if (name.equals("Lefthand") || name.equals("Righthand")) { + bone.setHidden(true); + renderingArms = true; + } else { + bone.setHidden(this.hiddenBones.contains(name)); + } + + Player player = mc.player; + if (player == null) return; + ItemStack itemStack = player.getMainHandItem(); + if (!itemStack.is(ModTags.Items.GUN)) return; + + if (name.equals("humu")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 0 && GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.GRIP) == 0); + } + + if (name.equals("qianzhunxing1")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) > 0 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.GRIP) > 0); + } + + if (name.equals("railup")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 0); + } + + if (name.equals("raildown")) { + bone.setHidden(GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.GRIP) == 0); + } + + if (name.equals("Cross1")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 1); + } + + if (name.equals("Cross2")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 2 + || NBTTool.getOrCreateTag(itemStack).getBoolean("ScopeAlt")); + } + + if (name.equals("CrossAlt")) { + bone.setHidden(NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") + || !ClientEventHandler.zoom + || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) != 2 + || !(NBTTool.getOrCreateTag(itemStack).getBoolean("ScopeAlt"))); + } + + if (GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.SCOPE) == 2 && !NBTTool.getOrCreateTag(itemStack).getBoolean("ScopeAlt") && (name.equals("hidden"))) { + bone.setHidden(!NBTTool.getOrCreateTag(itemStack).getBoolean("HoloHidden") && ClientEventHandler.zoom); + } + + // TODO handle gun attachments +// ItemModelHelper.handleGunAttachments(bone, itemStack, name); + + if (name.equals("flare")) { + if (ClientEventHandler.firePosTimer == 0 || ClientEventHandler.firePosTimer > 0.5 || GunsTool.getAttachmentType(itemStack, GunsTool.AttachmentType.BARREL) == 2) { + bone.setHidden(true); + } else { + bone.setHidden(false); + bone.setScaleX((float) (0.55 + 0.5 * (Math.random() - 0.5))); + bone.setScaleY((float) (0.55 + 0.5 * (Math.random() - 0.5))); + bone.setRotZ((float) (0.5 * (Math.random() - 0.5))); + } + } + + if (this.transformType.firstPerson() && renderingArms) { + AbstractClientPlayer localPlayer = mc.player; + + if (localPlayer == null) { + return; + } + + PlayerRenderer playerRenderer = (PlayerRenderer) mc.getEntityRenderDispatcher().getRenderer(localPlayer); + PlayerModel model = playerRenderer.getModel(); + stack.pushPose(); + RenderUtil.translateMatrixToBone(stack, bone); + RenderUtil.translateToPivotPoint(stack, bone); + RenderUtil.rotateMatrixAroundBone(stack, bone); + RenderUtil.scaleMatrixForBone(stack, bone); + RenderUtil.translateAwayFromPivotPoint(stack, bone); + ResourceLocation loc = localPlayer.getSkin().texture(); + VertexConsumer armBuilder = this.currentBuffer.getBuffer(RenderType.entitySolid(loc)); + VertexConsumer sleeveBuilder = this.currentBuffer.getBuffer(RenderType.entityTranslucent(loc)); + if (name.equals("Lefthand")) { + stack.translate(-1.0f * SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.leftArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.leftSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } else { + stack.translate(SCALE_RECIPROCAL, 2.0f * SCALE_RECIPROCAL, 0.0f); + AnimationHelper.renderPartOverBone(model.rightArm, bone, stack, armBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + AnimationHelper.renderPartOverBone(model.rightSleeve, bone, stack, sleeveBuilder, packedLightIn, OverlayTexture.NO_OVERLAY, 1); + } + + this.currentBuffer.getBuffer(this.renderType); + stack.popPose(); + } + super.renderRecursively(stack, animatable, bone, type, buffer, bufferIn, isReRender, partialTick, packedLightIn, packedOverlayIn, color); + } + + @Override + public ResourceLocation getTextureLocation(Trachelium instance) { + return super.getTextureLocation(instance); + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/VectorItemRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/VectorItemRenderer.java index 5b10aad52..61426ebd0 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/VectorItemRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/item/VectorItemRenderer.java @@ -1,7 +1,7 @@ package com.atsuishio.superbwarfare.client.renderer.item; import com.atsuishio.superbwarfare.client.AnimationHelper; -import com.atsuishio.superbwarfare.client.layer.VectorLayer; +import com.atsuishio.superbwarfare.client.layer.gun.VectorLayer; import com.atsuishio.superbwarfare.client.model.item.VectorItemModel; import com.atsuishio.superbwarfare.event.ClientEventHandler; import com.atsuishio.superbwarfare.init.ModTags; @@ -114,7 +114,7 @@ public class VectorItemRenderer extends GeoItemRenderer { } // TODO handle gun attachments -// ItemModelHelper.handleGunAttachments(bone, itemStack, name); +// ItemModelHelper.handleGunAttachments(bone, itemStack, name); if (this.transformType.firstPerson() && renderingArms) { AbstractClientPlayer localPlayer = mc.player; diff --git a/src/main/java/com/atsuishio/superbwarfare/client/screens/FuMO25Screen.java b/src/main/java/com/atsuishio/superbwarfare/client/screens/FuMO25Screen.java index 9d6d789d5..07bfdd823 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/screens/FuMO25Screen.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/screens/FuMO25Screen.java @@ -288,7 +288,8 @@ public class FuMO25Screen extends AbstractContainerScreen { @Override public void onPress() { if (FuMO25Screen.this.menu.getFuncType() == 3 && FuMO25Screen.this.menu.getSlot(0).getItem().isEmpty()) { - if (FuMO25Screen.this.currentTarget == null) return; + if (FuMO25Screen.this.currentTarget == null) { + } // TODO network // ModUtils.PACKET_HANDLER.sendToServer(new RadarSetTargetMessage(FuMO25Screen.this.currentTarget.getUUID())); } else { diff --git a/src/main/java/com/atsuishio/superbwarfare/client/screens/ReforgingTableScreen.java b/src/main/java/com/atsuishio/superbwarfare/client/screens/ReforgingTableScreen.java index 55ae9003e..1008fc8d7 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/screens/ReforgingTableScreen.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/screens/ReforgingTableScreen.java @@ -145,17 +145,14 @@ public class ReforgingTableScreen extends AbstractContainerScreen { if (ReforgingTableScreen.this.menu.ammoPerkLevel.get() >= ReforgingTableMenu.MAX_PERK_LEVEL) { - return; } } case FUNCTIONAL -> { if (ReforgingTableScreen.this.menu.funcPerkLevel.get() >= ReforgingTableMenu.MAX_PERK_LEVEL) { - return; } } case DAMAGE -> { if (ReforgingTableScreen.this.menu.damagePerkLevel.get() >= ReforgingTableMenu.MAX_PERK_LEVEL) { - return; } } } @@ -192,17 +189,14 @@ public class ReforgingTableScreen extends AbstractContainerScreen { if (ReforgingTableScreen.this.menu.ammoPerkLevel.get() <= 1) { - return; } } case FUNCTIONAL -> { if (ReforgingTableScreen.this.menu.funcPerkLevel.get() <= 1) { - return; } } case DAMAGE -> { if (ReforgingTableScreen.this.menu.damagePerkLevel.get() <= 1) { - return; } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/projectile/ProjectileEntity.java b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/ProjectileEntity.java index 3ddce282f..220241598 100644 --- a/src/main/java/com/atsuishio/superbwarfare/entity/projectile/ProjectileEntity.java +++ b/src/main/java/com/atsuishio/superbwarfare/entity/projectile/ProjectileEntity.java @@ -432,7 +432,7 @@ public class ProjectileEntity extends Projectile implements IEntityWithComplexSp // if (stack.is(ModItems.TRANSCRIPT.get())) { // final int size = 10; // -// ListTag tags = stack.getOrCreateTag().getList(Transcript.TAG_SCORES, Tag.TAG_COMPOUND); +// ListTag tags = NBTTool.getOrCreateTag(stack).getList(Transcript.TAG_SCORES, Tag.TAG_COMPOUND); // // Queue queue = new ArrayDeque<>(); // for (int i = 0; i < tags.size(); i++) { @@ -451,7 +451,7 @@ public class ProjectileEntity extends Projectile implements IEntityWithComplexSp // ListTag newTags = new ListTag(); // newTags.addAll(queue); // -// stack.getOrCreateTag().put(Transcript.TAG_SCORES, newTags); +// NBTTool.getOrCreateTag(stack).put(Transcript.TAG_SCORES, newTags); // } } diff --git a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java index 5c8ffc515..132ba57bb 100644 --- a/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/event/ClientEventHandler.java @@ -256,7 +256,7 @@ public class ClientEventHandler { // && !(player.getVehicle() instanceof ArmedVehicleEntity iArmedVehicle && iArmedVehicle.banHand(player)) && !holdFireVehicle && !notInGame() -// && !player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).edit +// && !cap != null && cap.edit && !(NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading") || NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) && !GunsTool.getGunBooleanTag(stack, "Reloading") && !player.getCooldowns().isOnCooldown(stack.getItem()) @@ -1018,7 +1018,7 @@ public class ClientEventHandler { // && !(player.getVehicle() instanceof ArmedVehicleEntity iArmedVehicle && iArmedVehicle.banHand(player)) // && !notInGame() // && drawTime < 0.01 -// && !player.getCapability(ModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new ModVariables.PlayerVariables()).edit) { +// && !cap != null && cap.edit) { // if (Minecraft.getInstance().player != null) { // Minecraft.getInstance().player.getPersistentData().putDouble("noRun", 5); // } @@ -1372,7 +1372,6 @@ public class ClientEventHandler { } } - return; } // if (stack.is(ModItems.MONITOR.get()) && GunNBTTool.getOrCreateTag(stack).getBoolean("Using") && GunNBTTool.getOrCreateTag(stack).getBoolean("Linked")) { @@ -1505,6 +1504,7 @@ public class ClientEventHandler { if (e == player) { // ModUtils.PACKET_HANDLER.sendToServer(new AimVillagerMessage(villager.getId())); aimVillagerCountdown = 80; + break; } } } diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java index 1b94fd1d4..95d1247bb 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java @@ -7,7 +7,24 @@ import com.atsuishio.superbwarfare.item.common.CannonShellItem; import com.atsuishio.superbwarfare.item.common.MaterialPack; import com.atsuishio.superbwarfare.item.common.ammo.*; import com.atsuishio.superbwarfare.item.common.ammo.box.AmmoBox; +import com.atsuishio.superbwarfare.item.gun.handgun.*; +import com.atsuishio.superbwarfare.item.gun.heavy.Ntw20Item; +import com.atsuishio.superbwarfare.item.gun.launcher.JavelinItem; +import com.atsuishio.superbwarfare.item.gun.launcher.M79Item; +import com.atsuishio.superbwarfare.item.gun.launcher.RpgItem; +import com.atsuishio.superbwarfare.item.gun.launcher.SecondaryCataclysm; +import com.atsuishio.superbwarfare.item.gun.machinegun.DevotionItem; +import com.atsuishio.superbwarfare.item.gun.machinegun.M60Item; +import com.atsuishio.superbwarfare.item.gun.machinegun.MinigunItem; +import com.atsuishio.superbwarfare.item.gun.machinegun.RpkItem; +import com.atsuishio.superbwarfare.item.gun.rifle.*; +import com.atsuishio.superbwarfare.item.gun.shotgun.Aa12Item; +import com.atsuishio.superbwarfare.item.gun.shotgun.HomemadeShotgunItem; +import com.atsuishio.superbwarfare.item.gun.shotgun.M870Item; import com.atsuishio.superbwarfare.item.gun.smg.VectorItem; +import com.atsuishio.superbwarfare.item.gun.sniper.*; +import com.atsuishio.superbwarfare.item.gun.special.BocekItem; +import com.atsuishio.superbwarfare.item.gun.special.TaserItem; import com.atsuishio.superbwarfare.tools.AmmoType; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; @@ -28,40 +45,40 @@ public class ModItems { */ public static final DeferredRegister GUNS = DeferredRegister.create(BuiltInRegistries.ITEM, ModUtils.MODID); -// public static final DeferredHolder TASER = GUNS.register("taser", TaserItem::new); -// public static final DeferredHolder GLOCK_17 = GUNS.register("glock_17", Glock17Item::new); -// public static final DeferredHolder GLOCK_18 = GUNS.register("glock_18", Glock18Item::new); -// public static final DeferredHolder MP_443 = GUNS.register("mp_443", Mp443Item::new); -// public static final DeferredHolder M_1911 = GUNS.register("m_1911", M1911Item::new); -// public static final DeferredHolder HOMEMADE_SHOTGUN = GUNS.register("homemade_shotgun", HomemadeShotgunItem::new); -// public static final DeferredHolder TRACHELIUM = GUNS.register("trachelium", Trachelium::new); -public static final DeferredHolder VECTOR = GUNS.register("vector", VectorItem::new); -// public static final DeferredHolder AK_47 = GUNS.register("ak_47", AK47Item::new); -// public static final DeferredHolder AK_12 = GUNS.register("ak_12", AK12Item::new); -// public static final DeferredHolder SKS = GUNS.register("sks", SksItem::new); -// public static final DeferredHolder M_4 = GUNS.register("m_4", M4Item::new); -// public static final DeferredHolder HK_416 = GUNS.register("hk_416", Hk416Item::new); -// public static final DeferredHolder QBZ_95 = GUNS.register("qbz_95", Qbz95Item::new); -// public static final DeferredHolder MK_14 = GUNS.register("mk_14", Mk14Item::new); -// public static final DeferredHolder MARLIN = GUNS.register("marlin", MarlinItem::new); -// public static final DeferredHolder K_98 = GUNS.register("k_98", K98Item::new); -// public static final DeferredHolder MOSIN_NAGANT = GUNS.register("mosin_nagant", MosinNagantItem::new); -// public static final DeferredHolder SVD = GUNS.register("svd", SvdItem::new); -// public static final DeferredHolder M_98B = GUNS.register("m_98b", M98bItem::new); -// public static final DeferredHolder SENTINEL = GUNS.register("sentinel", SentinelItem::new); -// public static final DeferredHolder HUNTING_RIFLE = GUNS.register("hunting_rifle", HuntingRifleItem::new); -// public static final DeferredHolder NTW_20 = GUNS.register("ntw_20", Ntw20Item::new); -// public static final DeferredHolder M_870 = GUNS.register("m_870", M870Item::new); -// public static final DeferredHolder AA_12 = GUNS.register("aa_12", Aa12Item::new); -// public static final DeferredHolder DEVOTION = GUNS.register("devotion", DevotionItem::new); -// public static final DeferredHolder RPK = GUNS.register("rpk", RpkItem::new); -// public static final DeferredHolder M_60 = GUNS.register("m_60", M60Item::new); -// public static final DeferredHolder MINIGUN = GUNS.register("minigun", MinigunItem::new); -// public static final DeferredHolder M_79 = GUNS.register("m_79", M79Item::new); -// public static final DeferredHolder SECONDARY_CATACLYSM = GUNS.register("secondary_cataclysm", SecondaryCataclysm::new); -// public static final DeferredHolder RPG = GUNS.register("rpg", RpgItem::new); -// public static final DeferredHolder JAVELIN = GUNS.register("javelin", JavelinItem::new); -// public static final DeferredHolder BOCEK = GUNS.register("bocek", BocekItem::new); + public static final DeferredHolder TASER = GUNS.register("taser", TaserItem::new); + public static final DeferredHolder GLOCK_17 = GUNS.register("glock_17", Glock17Item::new); + public static final DeferredHolder GLOCK_18 = GUNS.register("glock_18", Glock18Item::new); + public static final DeferredHolder MP_443 = GUNS.register("mp_443", Mp443Item::new); + public static final DeferredHolder M_1911 = GUNS.register("m_1911", M1911Item::new); + public static final DeferredHolder HOMEMADE_SHOTGUN = GUNS.register("homemade_shotgun", HomemadeShotgunItem::new); + public static final DeferredHolder TRACHELIUM = GUNS.register("trachelium", Trachelium::new); + public static final DeferredHolder VECTOR = GUNS.register("vector", VectorItem::new); + public static final DeferredHolder AK_47 = GUNS.register("ak_47", AK47Item::new); + public static final DeferredHolder AK_12 = GUNS.register("ak_12", AK12Item::new); + public static final DeferredHolder SKS = GUNS.register("sks", SksItem::new); + public static final DeferredHolder M_4 = GUNS.register("m_4", M4Item::new); + public static final DeferredHolder HK_416 = GUNS.register("hk_416", Hk416Item::new); + public static final DeferredHolder QBZ_95 = GUNS.register("qbz_95", Qbz95Item::new); + public static final DeferredHolder MK_14 = GUNS.register("mk_14", Mk14Item::new); + public static final DeferredHolder MARLIN = GUNS.register("marlin", MarlinItem::new); + public static final DeferredHolder K_98 = GUNS.register("k_98", K98Item::new); + public static final DeferredHolder MOSIN_NAGANT = GUNS.register("mosin_nagant", MosinNagantItem::new); + public static final DeferredHolder SVD = GUNS.register("svd", SvdItem::new); + public static final DeferredHolder M_98B = GUNS.register("m_98b", M98bItem::new); + public static final DeferredHolder SENTINEL = GUNS.register("sentinel", SentinelItem::new); + public static final DeferredHolder HUNTING_RIFLE = GUNS.register("hunting_rifle", HuntingRifleItem::new); + public static final DeferredHolder NTW_20 = GUNS.register("ntw_20", Ntw20Item::new); + public static final DeferredHolder M_870 = GUNS.register("m_870", M870Item::new); + public static final DeferredHolder AA_12 = GUNS.register("aa_12", Aa12Item::new); + public static final DeferredHolder DEVOTION = GUNS.register("devotion", DevotionItem::new); + public static final DeferredHolder RPK = GUNS.register("rpk", RpkItem::new); + public static final DeferredHolder M_60 = GUNS.register("m_60", M60Item::new); + public static final DeferredHolder MINIGUN = GUNS.register("minigun", MinigunItem::new); + public static final DeferredHolder M_79 = GUNS.register("m_79", M79Item::new); + public static final DeferredHolder SECONDARY_CATACLYSM = GUNS.register("secondary_cataclysm", SecondaryCataclysm::new); + public static final DeferredHolder RPG = GUNS.register("rpg", RpgItem::new); + public static final DeferredHolder JAVELIN = GUNS.register("javelin", JavelinItem::new); + public static final DeferredHolder BOCEK = GUNS.register("bocek", BocekItem::new); /** * Ammo @@ -117,7 +134,7 @@ public static final DeferredHolder VECTOR = GUNS.register("vec // // public static final DeferredHolder DETONATOR = ITEMS.register("detonator", Detonator::new); public static final DeferredHolder TARGET_DEPLOYER = ITEMS.register("target_deployer", TargetDeployer::new); -// public static final DeferredHolder KNIFE = ITEMS.register("knife", Knife::new); + // public static final DeferredHolder KNIFE = ITEMS.register("knife", Knife::new); // public static final DeferredHolder HAMMER = ITEMS.register("hammer", Hammer::new); public static final DeferredHolder CROWBAR = ITEMS.register("crowbar", Crowbar::new); // public static final DeferredHolder DEFUSER = ITEMS.register("defuser", Defuser::new); @@ -161,7 +178,7 @@ public static final DeferredHolder VECTOR = GUNS.register("vec public static final DeferredHolder SMALL_BATTERY_PACK = ITEMS.register("small_battery_pack", () -> new BatteryItem(500000, new Item.Properties())); public static final DeferredHolder MEDIUM_BATTERY_PACK = ITEMS.register("medium_battery_pack", () -> new BatteryItem(5000000, new Item.Properties())); public static final DeferredHolder LARGE_BATTERY_PACK = ITEMS.register("large_battery_pack", () -> new BatteryItem(20000000, new Item.Properties())); -// public static final DeferredHolder TRANSCRIPT = ITEMS.register("transcript", Transcript::new); + // public static final DeferredHolder TRANSCRIPT = ITEMS.register("transcript", Transcript::new); public static final DeferredHolder FIRING_PARAMETERS = ITEMS.register("firing_parameters", FiringParameters::new); public static final DeferredHolder TUNGSTEN_ROD = ITEMS.register("tungsten_rod", () -> new Item(new Item.Properties())); diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java b/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java index dd5f73b49..3a4cdac4c 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModTabs.java @@ -2,7 +2,6 @@ package com.atsuishio.superbwarfare.init; import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.item.BatteryItem; -import com.atsuishio.superbwarfare.item.gun.smg.VectorItem; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.world.item.CreativeModeTab; @@ -22,56 +21,18 @@ public class ModTabs { public static final DeferredHolder GUN_TAB = TABS.register("guns", () -> CreativeModeTab.builder() .title(Component.translatable("item_group.superbwarfare.guns")) -// .icon(() -> new ItemStack(ModItems.TASER.get())) - .icon(() -> new ItemStack(ModItems.VECTOR.get())) - .displayItems( - (param, output) -> { -// output.accept(TaserItem.getGunInstance()); -// output.accept(Glock17Item.getGunInstance()); -// output.accept(Glock18Item.getGunInstance()); -// output.accept(M1911Item.getGunInstance()); -// output.accept(Mp443Item.getGunInstance()); -// output.accept(HomemadeShotgunItem.getGunInstance()); -// output.accept(Trachelium.getGunInstance()); - output.accept(VectorItem.getGunInstance()); -// output.accept(SksItem.getGunInstance()); -// output.accept(AK47Item.getGunInstance()); -// output.accept(AK12Item.getGunInstance()); -// output.accept(M4Item.getGunInstance()); -// output.accept(Hk416Item.getGunInstance()); -// output.accept(Qbz95Item.getGunInstance()); -// output.accept(Mk14Item.getGunInstance()); -// output.accept(MarlinItem.getGunInstance()); -// output.accept(K98Item.getGunInstance()); -// output.accept(MosinNagantItem.getGunInstance()); -// output.accept(SvdItem.getGunInstance()); -// output.accept(HuntingRifleItem.getGunInstance()); -// output.accept(M98bItem.getGunInstance()); -// output.accept(SentinelItem.getGunInstance()); -// output.accept(Ntw20Item.getGunInstance()); -// output.accept(M870Item.getGunInstance()); -// output.accept(Aa12Item.getGunInstance()); -// output.accept(DevotionItem.getGunInstance()); -// output.accept(RpkItem.getGunInstance()); -// output.accept(M60Item.getGunInstance()); -// output.accept(MinigunItem.getGunInstance()); -// output.accept(BocekItem.getGunInstance()); -// output.accept(M79Item.getGunInstance()); -// output.accept(SecondaryCataclysm.getGunInstance()); -// output.accept(RpgItem.getGunInstance()); -// output.accept(JavelinItem.getGunInstance()); - } - ) + .icon(() -> new ItemStack(ModItems.TASER.get())) + .displayItems((param, output) -> ModItems.GUNS.getEntries().forEach(registryObject -> output.accept(registryObject.get()))) .build()); - // + public static final DeferredHolder PERK_TAB = TABS.register("perk", () -> CreativeModeTab.builder() .title(Component.translatable("item_group.superbwarfare.perk")) .icon(() -> new ItemStack(ModItems.AP_BULLET.get())) -// .withTabsBefore(GUN_TAB.getKey()) + .withTabsBefore(GUN_TAB.getKey()) .displayItems((param, output) -> ModItems.PERKS.getEntries().forEach(registryObject -> output.accept(registryObject.get()))) .build()); - // + public static final DeferredHolder AMMO_TAB = TABS.register("ammo", () -> CreativeModeTab.builder() .title(Component.translatable("item_group.superbwarfare.ammo")) diff --git a/src/main/java/com/atsuishio/superbwarfare/item/BeamTest.java b/src/main/java/com/atsuishio/superbwarfare/item/BeamTest.java index 32a78a3e6..ff6daf144 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/BeamTest.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/BeamTest.java @@ -2,6 +2,7 @@ package com.atsuishio.superbwarfare.item; import com.atsuishio.superbwarfare.capability.ModCapabilities; import com.atsuishio.superbwarfare.capability.laser.LaserHandler; +import com.atsuishio.superbwarfare.client.TooltipTool; import com.atsuishio.superbwarfare.entity.projectile.LaserEntity; import com.atsuishio.superbwarfare.init.ModSounds; import com.atsuishio.superbwarfare.network.message.LaserShootMessage; @@ -149,8 +150,7 @@ public class BeamTest extends Item { @Override @ParametersAreNonnullByDefault public void appendHoverText(ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { - // TODO developing - // TooltipTool.addDevelopingText(pTooltipComponents); + TooltipTool.addDevelopingText(tooltipComponents); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/PerkItem.java b/src/main/java/com/atsuishio/superbwarfare/item/PerkItem.java index cd35161d2..d36173c23 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/PerkItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/PerkItem.java @@ -12,7 +12,6 @@ import net.neoforged.neoforge.registries.DeferredHolder; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; -import java.util.function.Supplier; public class PerkItem extends Item { private final DeferredHolder perk; diff --git a/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/Rocket.java b/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/Rocket.java index 0be4ab8f6..d4b67e71e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/Rocket.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/common/ammo/Rocket.java @@ -1,52 +1,74 @@ package com.atsuishio.superbwarfare.item.common.ammo; +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.PoseTool; +import com.atsuishio.superbwarfare.client.renderer.item.RocketItemRenderer; +import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.tools.ParticleTool; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; -//public class Rocket extends Item implements GeoItem { -// TODO rewrite -public class Rocket extends Item { - // private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); +import javax.annotation.ParametersAreNonnullByDefault; + +@EventBusSubscriber(modid = ModUtils.MODID, bus = EventBusSubscriber.Bus.MOD) +public class Rocket extends Item implements GeoItem { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); public static ItemDisplayContext transformType; public Rocket() { super(new Properties().stacksTo(16)); } -// @Override -// public void initializeClient(@NotNull Consumer consumer) { -// super.initializeClient(consumer); -// consumer.accept(new IClientItemExtensions() { -// private final BlockEntityWithoutLevelRenderer renderer = new RocketItemRenderer(); -// -// @Override -// public BlockEntityWithoutLevelRenderer getCustomRenderer() { -// return renderer; -// } -// }); -// } + @SubscribeEvent + private static void registerGunExtensions(RegisterClientExtensionsEvent event) { + event.registerItem(new IClientItemExtensions() { + private final BlockEntityWithoutLevelRenderer renderer = new RocketItemRenderer(); + + @Override + public @NotNull BlockEntityWithoutLevelRenderer getCustomRenderer() { + return renderer; + } + + @Override + @ParametersAreNonnullByDefault + public HumanoidModel.ArmPose getArmPose(LivingEntity entityLiving, InteractionHand hand, ItemStack stack) { + return PoseTool.pose(entityLiving, hand, stack); + } + }, ModItems.ROCKET.get()); + } public void getTransformType(ItemDisplayContext type) { transformType = type; } -// @Override -// public void registerControllers(AnimatableManager.ControllerRegistrar data) { -// } + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + } -// @Override -// public AnimatableInstanceCache getAnimatableInstanceCache() { -// return this.cache; -// } + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + // TODO attribute modifier // @Override // public Multimap getAttributeModifiers(EquipmentSlot slot, ItemStack stack) { // Multimap map = super.getAttributeModifiers(slot, stack); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/SpecialFireWeapon.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/SpecialFireWeapon.java new file mode 100644 index 000000000..fdcf1a744 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/SpecialFireWeapon.java @@ -0,0 +1,29 @@ +package com.atsuishio.superbwarfare.item.gun; + +import net.minecraft.world.entity.player.Player; + + +/** + * 拥有特殊开火方式的武器的开火处理 + */ +public interface SpecialFireWeapon { + + + /** + * 按下按键时武器发射处理 + * + * @param player 玩家 + */ + + default void fireOnPress(Player player) { + } + + /** + * 松开按键时武器发射处理 + * + * @param player 玩家 + */ + default void fireOnRelease(Player player) { + } + +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock17Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock17Item.java new file mode 100644 index 000000000..51b30686f --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock17Item.java @@ -0,0 +1,150 @@ +package com.atsuishio.superbwarfare.item.gun.handgun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.Glock17ItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class Glock17Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public Glock17Item() { + super(new Properties().stacksTo(1).rarity(Rarity.COMMON)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new Glock17ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState fireAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_normal")); + } + + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.idle")); + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (player.isSprinting() && player.onGround() + && player.getPersistentData().getDouble("noRun") == 0 + && !(NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading") || NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.idle")); + } + + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var fireAnimController = new AnimationController<>(this, "fireAnimController", 1, this::fireAnimPredicate); + data.add(fireAnimController); + var idleController = new AnimationController<>(this, "idleController", 2, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.GLOCK_17_RELOAD_EMPTY.get(), ModSounds.GLOCK_17_RELOAD_NORMAL.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.GLOCK_17.get()); + GunsTool.initCreativeGun(stack, ModItems.GLOCK_17.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/glock_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "GLOCK-17"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // TODO perk +// return PerkHelper.HANDGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock18Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock18Item.java new file mode 100644 index 000000000..43edc3527 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Glock18Item.java @@ -0,0 +1,157 @@ +package com.atsuishio.superbwarfare.item.gun.handgun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.Glock18ItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class Glock18Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public Glock18Item() { + super(new Properties().stacksTo(1).rarity(Rarity.RARE)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new Glock18ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState fireAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_normal")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.idle")); + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (player.isSprinting() && player.onGround() + && player.getPersistentData().getDouble("noRun") == 0 + && !(NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading") || NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.idle")); + } + + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var fireAnimController = new AnimationController<>(this, "fireAnimController", 1, this::fireAnimPredicate); + data.add(fireAnimController); + var idleController = new AnimationController<>(this, "idleController", 2, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of( + ModSounds.GLOCK_18_RELOAD_EMPTY.get(), + ModSounds.GLOCK_18_RELOAD_NORMAL.get() + ); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.GLOCK_18.get()); + GunsTool.initCreativeGun(stack, ModItems.GLOCK_18.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/glock_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "GLOCK-18"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.HANDGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get(); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean isAutoWeapon(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag + FireMode.AUTO.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/M1911Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/M1911Item.java new file mode 100644 index 000000000..38ea2102c --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/M1911Item.java @@ -0,0 +1,153 @@ +package com.atsuishio.superbwarfare.item.gun.handgun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.M1911ItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class M1911Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public M1911Item() { + super(new Properties().stacksTo(1).rarity(Rarity.COMMON)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new M1911ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState fireAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_normal")); + } + + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.idle")); + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (player.isSprinting() && player.onGround() + && player.getPersistentData().getDouble("noRun") == 0 + && !(NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading") || NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.idle")); + } + + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var fireAnimController = new AnimationController<>(this, "fireAnimController", 1, this::fireAnimPredicate); + data.add(fireAnimController); + var idleController = new AnimationController<>(this, "idleController", 2, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of( + ModSounds.M_1911_RELOAD_EMPTY.get(), + ModSounds.M_1911_RELOAD_NORMAL.get() + ); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.M_1911.get()); + GunsTool.initCreativeGun(stack, ModItems.M_1911.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/m1911_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "M-1911"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.HANDGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Mp443Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Mp443Item.java new file mode 100644 index 000000000..10c1f87d3 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Mp443Item.java @@ -0,0 +1,150 @@ +package com.atsuishio.superbwarfare.item.gun.handgun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.Mp443ItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class Mp443Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public Mp443Item() { + super(new Properties().stacksTo(1).rarity(Rarity.COMMON)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new Mp443ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState fireAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.glock.reload_normal")); + } + + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.idle")); + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (player.isSprinting() && player.onGround() + && player.getPersistentData().getDouble("noRun") == 0 + && !(NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading") || NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.glock.idle")); + } + + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var fireAnimController = new AnimationController<>(this, "fireAnimController", 1, this::fireAnimPredicate); + data.add(fireAnimController); + var idleController = new AnimationController<>(this, "idleController", 2, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.MP_443_RELOAD_EMPTY.get(), ModSounds.MP_443_RELOAD_NORMAL.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.MP_443.get()); + GunsTool.initCreativeGun(stack, ModItems.MP_443.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/mp443_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "MP-443"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.HANDGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Trachelium.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Trachelium.java new file mode 100644 index 000000000..88ec28e68 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/handgun/Trachelium.java @@ -0,0 +1,332 @@ +package com.atsuishio.superbwarfare.item.gun.handgun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.TooltipTool; +import com.atsuishio.superbwarfare.client.renderer.item.TracheliumItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; +import java.util.Set; + +public class Trachelium extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public Trachelium() { + super(new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.TRACHELIUM_RELOAD_EMPTY.get()); + } + + @Override + public GeoItemRenderer getRenderer() { + return new TracheliumItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState fireAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + boolean stock = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK) == 2; + boolean grip = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) > 0 || GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE) > 0; + + if (ClientEventHandler.firePosTimer > 0 && ClientEventHandler.firePosTimer < 1.7) { + if (stock) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.fire_stock_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.fire_stock")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.fire_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.fire")); + } + } + } + + if (stock) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.idle_stock_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.idle_stock")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.idle_stock_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.idle")); + } + } + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + boolean stock = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK) == 2; + boolean grip = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) > 0 || GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE) > 0; + + if (GunsTool.getGunIntTag(stack, "BoltActionTick") > 0) { + if (stock) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.action_stock_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.action_stock")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.action_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.action")); + } + } + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + if (stock) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.reload_stock_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.reload_stock")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.reload_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.reload")); + } + } + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (stock) { + if (grip) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.run_fast_stock")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.run_stock_grip")); + } + } else { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.run_fast_stock")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.run_stock")); + } + } + } else { + if (grip) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.run_grip")); + } + } else { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.run")); + } + } + } + } + + if (stock) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.idle_stock_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.idle_stock")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.idle_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.idle")); + } + } + } + + private PlayState editPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + if (cap != null && cap.edit) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.trachelium.edit")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.trachelium.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var fireAnimController = new AnimationController<>(this, "fireAnimController", 0, this::fireAnimPredicate); + data.add(fireAnimController); + var idlePredicate = new AnimationController<>(this, "idlePredicate", 3, this::idlePredicate); + data.add(idlePredicate); + var editController = new AnimationController<>(this, "editController", 1, this::editPredicate); + data.add(editController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + @ParametersAreNonnullByDefault + public void appendHoverText(ItemStack stack, TooltipContext context, List list, TooltipFlag tooltipFlag) { + list.add(Component.literal("")); + list.add(Component.translatable("des.superbwarfare.trachelium_1").withStyle(ChatFormatting.GRAY).withStyle(ChatFormatting.ITALIC)); + list.add(Component.translatable("des.superbwarfare.trachelium_2").withStyle(ChatFormatting.GRAY)); + + TooltipTool.addHideText(list, Component.literal("")); + TooltipTool.addHideText(list, Component.translatable("des.superbwarfare.trachelium_3").withStyle(ChatFormatting.WHITE)); + TooltipTool.addHideText(list, Component.translatable("des.superbwarfare.trachelium_4").withStyle(Style.EMPTY.withColor(0xF4F0FF))); + } + + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.TRACHELIUM.get()); + GunsTool.initCreativeGun(stack, ModItems.TRACHELIUM.getId().getPath()); + return stack; + } + + @Override + @ParametersAreNonnullByDefault + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + var tag = NBTTool.getOrCreateTag(stack); + GunsTool.setGunIntTag(stack, "BoltActionTime", tag.getBoolean("DA") ? 12 : 0); + + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + int gripType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP); + int stockType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK); + CompoundTag tags = NBTTool.getOrCreateTag(stack).getCompound("Attachments"); + + if (stockType == 1) { + tags.putInt("Stock", 2); + } + + if (scopeType == 3) { + tags.putInt("Scope", 0); + } + + if (scopeType > 0 || gripType > 0) { + GunsTool.setGunDoubleTag(stack, "CustomVelocity", 15); + GunsTool.setGunDoubleTag(stack, "BypassesArmor", 0.4); + GunsTool.setGunDoubleTag(stack, "Damage", 21); + GunsTool.setGunDoubleTag(stack, "Headshot", 2.5); + } else { + GunsTool.setGunDoubleTag(stack, "CustomVelocity", 0); + GunsTool.setGunDoubleTag(stack, "BypassesArmor", 0.3); + GunsTool.setGunDoubleTag(stack, "Damage", 19); + GunsTool.setGunDoubleTag(stack, "Headshot", 2); + } + + double customZoom = switch (scopeType) { + case 0, 1 -> 0; + case 2 -> NBTTool.getOrCreateTag(stack).getBoolean("ScopeAlt") ? 0 : 2.75; + default -> 1; + }; + + GunsTool.setGunBooleanTag(stack, "CanSwitchScope", scopeType == 2); + GunsTool.setGunDoubleTag(stack, "CustomZoom", customZoom); + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/trachelium_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "TRACHELIUM"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.HANDGUN_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isCustomizable(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomGrip(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomScope(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomStock(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/heavy/Ntw20Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/heavy/Ntw20Item.java new file mode 100644 index 000000000..b6ad00369 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/heavy/Ntw20Item.java @@ -0,0 +1,213 @@ +package com.atsuishio.superbwarfare.item.gun.heavy; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.Ntw20Renderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class Ntw20Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public Ntw20Item() { + super(new Properties().stacksTo(1) + // TODO rarity +// .rarity(RarityTool.LEGENDARY) + ); + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.NTW_20_RELOAD_EMPTY.get(), ModSounds.NTW_20_RELOAD_NORMAL.get(), ModSounds.NTW_20_BOLT.get()); + } + + @Override + public GeoItemRenderer getRenderer() { + return new Ntw20Renderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState fireAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (GunsTool.getGunIntTag(stack, "BoltActionTick") > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ntw_20.shift")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ntw_20.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ntw_20.reload_normal")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ntw_20.idle")); + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (player.isSprinting() && player.onGround() + && player.getPersistentData().getDouble("noRun") == 0 + && !(NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading") || NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) + && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED) && GunsTool.getGunIntTag(stack, "BoltActionTick") == 0) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ntw_20.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ntw_20.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ntw_20.idle")); + } + + private PlayState editPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + if (cap != null && cap.edit) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ntw_20.edit")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ntw_20.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var fireAnimController = new AnimationController<>(this, "fireAnimController", 0, this::fireAnimPredicate); + data.add(fireAnimController); + var idleController = new AnimationController<>(this, "idleController", 4, this::idlePredicate); + data.add(idleController); + var editController = new AnimationController<>(this, "editController", 1, this::editPredicate); + data.add(editController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + + int customMag = switch (magType) { + case 1 -> 3; + case 2 -> 6; + default -> 0; + }; + + double customZoom = switch (scopeType) { + case 0, 1 -> 0; + case 2 -> 2.25; + default -> GunsTool.getGunDoubleTag(stack, "CustomZoom", 0); + }; + + NBTTool.getOrCreateTag(stack).putBoolean("CanAdjustZoomFov", scopeType == 3); + GunsTool.setGunDoubleTag(stack, "CustomZoom", customZoom); + GunsTool.setGunIntTag(stack, "CustomMagazine", customMag); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.NTW_20.get()); + GunsTool.initCreativeGun(stack, ModItems.NTW_20.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/ntw_20_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "NTW-20"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean isCustomizable(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomMagazine(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomScope(ItemStack stack) { + return true; + } + + @Override + public boolean hasBipod(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java new file mode 100644 index 000000000..f85a8d066 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/JavelinItem.java @@ -0,0 +1,331 @@ +package com.atsuishio.superbwarfare.item.gun.launcher; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.JavelinItemRenderer; +import com.atsuishio.superbwarfare.client.tooltip.component.LauncherImageComponent; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.game.ClientboundStopSoundPacket; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.joml.Vector3d; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +public class JavelinItem extends GunItem implements GeoItem, SpecialFireWeapon { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public JavelinItem() { + super(new Properties().stacksTo(1) + // TODO rarity +// .rarity(RarityTool.LEGENDARY) + ); + } + + @Override + public GeoItemRenderer getRenderer() { + return new JavelinItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.javelin.reload")); + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.javelin.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.javelin.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.javelin.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 4, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + public static int getAmmoCount(Player player) { + int count = 0; + for (var inv : player.getInventory().items) { + if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) { + count++; + } + } + + if (count == 0) { + int sum = 0; + for (int i = 0; i < player.getInventory().getContainerSize(); ++i) { + ItemStack itemstack = player.getInventory().getItem(i); + if (check(itemstack)) { + sum += itemstack.getCount(); + } + } + return sum; + } + return (int) Double.POSITIVE_INFINITY; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.JAVELIN_RELOAD_EMPTY.get(), ModSounds.JAVELIN_LOCK.get(), ModSounds.JAVELIN_LOCKON.get()); + } + + @Override + @ParametersAreNonnullByDefault + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + if (entity instanceof Player player && selected) { + var tag = NBTTool.getOrCreateTag(stack); + GunsTool.setGunIntTag(stack, "MaxAmmo", getAmmoCount(player)); + + if (tag.getBoolean("Seeking")) { + + List decoy = SeekTool.seekLivingEntities(player, player.level(), 512, 8); + for (var e : decoy) { + // todo flare decoy +// if (e instanceof FlareDecoyEntity flareDecoy) { +// tag.putString("TargetEntity", flareDecoy.getStringUUID()); +// tag.putDouble("TargetPosX", flareDecoy.getX()); +// tag.putDouble("TargetPosY", flareDecoy.getEyeY()); +// tag.putDouble("TargetPosZ", flareDecoy.getZ()); +// } + } + + Entity targetEntity = EntityFindUtil.findEntity(player.level(), tag.getString("TargetEntity")); + Entity seekingEntity = SeekTool.seekEntity(player, player.level(), 512, 8); + + + if (tag.getInt("GuideType") == 0) { + if (seekingEntity != null && seekingEntity == targetEntity) { + tag.putInt("SeekTime", tag.getInt("SeekTime") + 1); + // TODO vehicle +// if (tag.getInt("SeekTime") > 0 && (!seekingEntity.getPassengers().isEmpty() || seekingEntity instanceof VehicleEntity) && seekingEntity.tickCount % 3 == 0) { +// seekingEntity.level().playSound(null, seekingEntity.getOnPos(), seekingEntity instanceof Pig ? SoundEvents.PIG_HURT : ModSounds.LOCKING_WARNING.get(), SoundSource.PLAYERS, 1, 1f); +// } + } else { + tag.putInt("SeekTime", 0); + } + + if (tag.getInt("SeekTime") == 1 && player instanceof ServerPlayer serverPlayer) { + SoundTool.playLocalSound(serverPlayer, ModSounds.JAVELIN_LOCK.get(), 1, 1); + } + + if (seekingEntity != null && tag.getInt("SeekTime") > 20) { + if (player instanceof ServerPlayer serverPlayer) { + SoundTool.playLocalSound(serverPlayer, ModSounds.JAVELIN_LOCKON.get(), 1, 1); + } + // TODO vehicle +// if ((!seekingEntity.getPassengers().isEmpty() || seekingEntity instanceof VehicleEntity) && seekingEntity.tickCount % 2 == 0) { +// seekingEntity.level().playSound(null, seekingEntity.getOnPos(), seekingEntity instanceof Pig ? SoundEvents.PIG_HURT : ModSounds.LOCKED_WARNING.get(), SoundSource.PLAYERS, 1, 0.95f); +// } + } + + } else if (tag.getInt("GuideType") == 1) { + + Vec3 toVec = player.getEyePosition().vectorTo(new Vec3(tag.getDouble("TargetPosX"), tag.getDouble("TargetPosY"), tag.getDouble("TargetPosZ"))).normalize(); + if (VectorTool.calculateAngle(player.getViewVector(1), toVec) < 8) { + tag.putInt("SeekTime", tag.getInt("SeekTime") + 1); + } else { + tag.putInt("SeekTime", 0); + } + + if (tag.getInt("SeekTime") == 1 && player instanceof ServerPlayer serverPlayer) { + SoundTool.playLocalSound(serverPlayer, ModSounds.JAVELIN_LOCK.get(), 1, 1); + } + + if (tag.getInt("SeekTime") > 20) { + if (player instanceof ServerPlayer serverPlayer) { + SoundTool.playLocalSound(serverPlayer, ModSounds.JAVELIN_LOCKON.get(), 1, 1); + } + } + } + } + } else { + NBTTool.getOrCreateTag(stack).putInt("SeekTime", 0); + } + } + + protected static boolean check(ItemStack stack) { + return stack.getItem() == ModItems.JAVELIN_MISSILE.get(); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.JAVELIN.get()); + GunsTool.initCreativeGun(stack, ModItems.JAVELIN.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/javelin_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "FGM-148"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.LAUNCHER_PERKS.test(perk); + } + + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + return Optional.of(new LauncherImageComponent(pStack)); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + private void fire(Player player) { + Level level = player.level(); + ItemStack stack = player.getMainHandItem(); + CompoundTag tag = NBTTool.getOrCreateTag(stack); + + if (tag.getInt("SeekTime") < 20) return; + + float yRot = player.getYRot() + 360; + yRot = (yRot + 90) % 360; + + var firePos = new Vector3d(0, -0.2, 0.15); + firePos.rotateZ(-player.getXRot() * Mth.DEG_TO_RAD); + firePos.rotateY(-yRot * Mth.DEG_TO_RAD); + + if (player.level() instanceof ServerLevel serverLevel) { + // TODO launch +// JavelinMissileEntity missileEntity = new JavelinMissileEntity(player, level, +// (float) GunsTool.getGunDoubleTag(stack, "Damage", 0), +// (float) GunsTool.getGunDoubleTag(stack, "ExplosionDamage", 0), +// (float) GunsTool.getGunDoubleTag(stack, "ExplosionRadius", 0), +// NBTTool.getOrCreateTag(stack).getInt("GuideType"), +// new Vec3(NBTTool.getOrCreateTag(stack).getDouble("TargetPosX"), NBTTool.getOrCreateTag(stack).getDouble("TargetPosY"), NBTTool.getOrCreateTag(stack).getDouble("TargetPosZ"))); +// +// var dmgPerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); +// if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { +// int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, stack); +// missileEntity.setMonsterMultiplier(0.1f + 0.1f * perkLevel); +// } +// +// missileEntity.setPos(player.getX() + firePos.x, player.getEyeY() + firePos.y, player.getZ() + firePos.z); +// missileEntity.shoot(player.getLookAngle().x, player.getLookAngle().y + 0.3, player.getLookAngle().z, 3f, 1); +// missileEntity.setTargetUuid(tag.getString("TargetEntity")); +// missileEntity.setAttackMode(tag.getBoolean("TopMode")); +// +// level.addFreshEntity(missileEntity); +// ParticleTool.sendParticle(serverLevel, ParticleTypes.CLOUD, player.getX() + 1.8 * player.getLookAngle().x, +// player.getY() + player.getBbHeight() - 0.1 + 1.8 * player.getLookAngle().y, +// player.getZ() + 1.8 * player.getLookAngle().z, +// 30, 0.4, 0.4, 0.4, 0.005, true); +// +// var serverPlayer = (ServerPlayer) player; +// +// SoundTool.playLocalSound(serverPlayer, ModSounds.JAVELIN_FIRE_1P.get(), 2, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.JAVELIN_FIRE_3P.get(), SoundSource.PLAYERS, 4, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.JAVELIN_FAR.get(), SoundSource.PLAYERS, 10, 1); +// +// ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShootClientMessage(10)); + } + + player.getCooldowns().addCooldown(stack.getItem(), 10); + GunsTool.setGunIntTag(stack, "Ammo", GunsTool.getGunIntTag(stack, "Ammo", 0) - 1); + } + + @Override + public void fireOnRelease(Player player) { + var tag = NBTTool.getOrCreateTag(player.getMainHandItem()); + fire(player); + tag.putBoolean("Seeking", false); + tag.putInt("SeekTime", 0); + tag.putString("TargetEntity", "none"); + if (player instanceof ServerPlayer serverPlayer) { + var clientboundstopsoundpacket = new ClientboundStopSoundPacket(ModUtils.loc("javelin_lock"), SoundSource.PLAYERS); + serverPlayer.connection.send(clientboundstopsoundpacket); + } + } + + @Override + public void fireOnPress(Player player) { + var stack = player.getMainHandItem(); + var tag = NBTTool.getOrCreateTag(stack); + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + if (cap != null && !cap.zoom || GunsTool.getGunIntTag(stack, "Ammo", 0) <= 0) return; + + Entity seekingEntity = SeekTool.seekEntity(player, player.level(), 512, 8); + + if (seekingEntity != null && !player.isCrouching()) { + tag.putInt("GuideType", 0); + tag.putString("TargetEntity", seekingEntity.getStringUUID()); + } else { + BlockHitResult result = player.level().clip(new ClipContext(player.getEyePosition(), player.getEyePosition().add(player.getViewVector(1).scale(512)), + ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, player)); + Vec3 hitPos = result.getLocation(); + + tag.putInt("GuideType", 1); + tag.putDouble("TargetPosX", hitPos.x); + tag.putDouble("TargetPosY", hitPos.y); + tag.putDouble("TargetPosZ", hitPos.z); + } + tag.putBoolean("Seeking", true); + tag.putInt("SeekTime", 0); + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java new file mode 100644 index 000000000..6701e83fe --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/M79Item.java @@ -0,0 +1,216 @@ +package com.atsuishio.superbwarfare.item.gun.launcher; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.M79ItemRenderer; +import com.atsuishio.superbwarfare.client.tooltip.component.LauncherImageComponent; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Optional; +import java.util.Set; + +public class M79Item extends GunItem implements GeoItem, SpecialFireWeapon { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.M_79_RELOAD_EMPTY.get()); + } + + public M79Item() { + super(new Properties().stacksTo(1).fireResistant().rarity(Rarity.RARE)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new M79ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m79.reload")); + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m79.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m79.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m79.idle")); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + } + + public static int getAmmoCount(Player player) { + int count = 0; + for (var inv : player.getInventory().items) { + if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) { + count++; + } + } + + if (count == 0) { + int sum = 0; + for (int i = 0; i < player.getInventory().getContainerSize(); ++i) { + ItemStack itemstack = player.getInventory().getItem(i); + if (check(itemstack)) { + sum += itemstack.getCount(); + } + } + return sum; + } + return (int) Double.POSITIVE_INFINITY; + } + + @Override + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + if (entity instanceof Player player) { + GunsTool.setGunIntTag(stack, "MaxAmmo", getAmmoCount(player)); + } + } + + protected static boolean check(ItemStack stack) { + return stack.getItem() == ModItems.GRENADE_40MM.get(); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.M_79.get()); + GunsTool.initCreativeGun(stack, ModItems.M_79.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/m79_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "M79 LAUNCHER"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.LAUNCHER_PERKS.test(perk) || perk == ModPerks.MICRO_MISSILE.get(); + } + + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + return Optional.of(new LauncherImageComponent(pStack)); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public void fireOnPress(Player player) { + ItemStack stack = player.getMainHandItem(); + if (GunsTool.getGunBooleanTag(stack, "Reloading")) return; + if (player.getCooldowns().isOnCooldown(stack.getItem()) || GunsTool.getGunIntTag(stack, "Ammo", 0) <= 0) return; + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + boolean zooming = cap != null && cap.zoom; + double spread = GunsTool.getGunDoubleTag(stack, "Spread"); + + if (player.level() instanceof ServerLevel serverLevel) { + // TODO launch +// GunGrenadeEntity gunGrenadeEntity = new GunGrenadeEntity(player, serverLevel, +// (float) GunsTool.getGunDoubleTag(stack, "Damage", 0), +// (float) GunsTool.getGunDoubleTag(stack, "ExplosionDamage", 0), +// (float) GunsTool.getGunDoubleTag(stack, "ExplosionRadius", 0)); +// +// var dmgPerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); +// if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { +// int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, stack); +// gunGrenadeEntity.setMonsterMultiplier(0.1f + 0.1f * perkLevel); +// } +// +// gunGrenadeEntity.setNoGravity(PerkHelper.getPerkByType(stack, Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get()); +// +// float velocity = (float) GunsTool.getGunDoubleTag(stack, "Velocity", 0); +// int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), stack); +// if (perkLevel > 0) { +// gunGrenadeEntity.setExplosionRadius((float) GunsTool.getGunDoubleTag(stack, "ExplosionRadius", 0) * 0.5f); +// gunGrenadeEntity.setDamage((float) GunsTool.getGunDoubleTag(stack, "Damage", 0) * (1.1f + perkLevel * 0.1f)); +// velocity *= 1.2f; +// } +// +// gunGrenadeEntity.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ()); +// gunGrenadeEntity.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, +// (float) (zooming ? 0.1 : spread)); +// serverLevel.addFreshEntity(gunGrenadeEntity); +// +// ParticleTool.sendParticle(serverLevel, ParticleTypes.CLOUD, player.getX() + 1.8 * player.getLookAngle().x, +// player.getY() + player.getBbHeight() - 0.1 + 1.8 * player.getLookAngle().y, +// player.getZ() + 1.8 * player.getLookAngle().z, +// 4, 0.1, 0.1, 0.1, 0.002, true); +// +// var serverPlayer = (ServerPlayer) player; +// +// SoundTool.playLocalSound(serverPlayer, ModSounds.M_79_FIRE_1P.get(), 2, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.M_79_FIRE_3P.get(), SoundSource.PLAYERS, 2, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.M_79_FAR.get(), SoundSource.PLAYERS, 5, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.M_79_VERYFAR.get(), SoundSource.PLAYERS, 10, 1); +// +// ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShootClientMessage(10)); + } + + player.getCooldowns().addCooldown(stack.getItem(), 2); + GunsTool.setGunIntTag(stack, "Ammo", GunsTool.getGunIntTag(stack, "Ammo", 0) - 1); + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java new file mode 100644 index 000000000..91963bd43 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/RpgItem.java @@ -0,0 +1,237 @@ +package com.atsuishio.superbwarfare.item.gun.launcher; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.RpgItemRenderer; +import com.atsuishio.superbwarfare.client.tooltip.component.LauncherImageComponent; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Optional; +import java.util.Set; + +public class RpgItem extends GunItem implements GeoItem, SpecialFireWeapon { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public RpgItem() { + super(new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new RpgItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.rpg.reload")); + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.rpg.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.rpg.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.rpg.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 4, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + public static int getAmmoCount(Player player) { + int count = 0; + for (var inv : player.getInventory().items) { + if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) { + count++; + } + } + + if (count == 0) { + int sum = 0; + for (int i = 0; i < player.getInventory().getContainerSize(); ++i) { + ItemStack itemstack = player.getInventory().getItem(i); + if (check(itemstack)) { + sum += itemstack.getCount(); + } + } + return sum; + } + return (int) Double.POSITIVE_INFINITY; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.RPG_RELOAD_EMPTY.get()); + } + + @Override + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + if (NBTTool.getOrCreateTag(stack).getBoolean("draw")) { + NBTTool.getOrCreateTag(stack).putBoolean("draw", false); + + if (GunsTool.getGunIntTag(stack, "Ammo", 0) == 0) { + NBTTool.getOrCreateTag(stack).putDouble("empty", 1); + } + } + + if (entity instanceof Player player) { + GunsTool.setGunIntTag(stack, "MaxAmmo", getAmmoCount(player)); + } + + super.inventoryTick(stack, world, entity, slot, selected); + } + + protected static boolean check(ItemStack stack) { + return stack.getItem() == ModItems.ROCKET.get(); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.RPG.get()); + GunsTool.initCreativeGun(stack, ModItems.RPG.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/rpg_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "RPG-7"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.LAUNCHER_PERKS.test(perk) || perk == ModPerks.MICRO_MISSILE.get(); + } + + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + return Optional.of(new LauncherImageComponent(pStack)); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public void fireOnPress(Player player) { + Level level = player.level(); + ItemStack stack = player.getMainHandItem(); + CompoundTag tag = NBTTool.getOrCreateTag(stack); + + if (GunsTool.getGunBooleanTag(stack, "Reloading") + || player.getCooldowns().isOnCooldown(stack.getItem()) + || GunsTool.getGunIntTag(stack, "Ammo", 0) <= 0 + ) return; + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + boolean zoom = cap != null && cap.zoom; + double spread = GunsTool.getGunDoubleTag(stack, "Spread"); + + if (player.level() instanceof ServerLevel serverLevel) { + // TODO launch +// RpgRocketEntity rocket = new RpgRocketEntity(player, level, +// (float) GunsTool.getGunDoubleTag(stack, "Damage", 0)); +// +// var dmgPerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); +// if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { +// int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, stack); +// rocket.setMonsterMultiplier(0.1f + 0.1f * perkLevel); +// } +// +// float velocity = (float) GunsTool.getGunDoubleTag(stack, "Velocity", 0); +// +// if (PerkHelper.getPerkByType(stack, Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get()) { +// rocket.setNoGravity(true); +// +// int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), stack); +// if (perkLevel > 0) { +// rocket.setExplosionRadius(0.5f); +// rocket.setDamage((float) GunsTool.getGunDoubleTag(stack, "Damage", 0) * (1.1f + perkLevel * 0.1f)); +// velocity *= 1.2f; +// } +// } +// +// rocket.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ()); +// rocket.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, velocity, +// (float) (zoom ? 0.1 : spread)); +// level.addFreshEntity(rocket); +// +// ParticleTool.sendParticle(serverLevel, ParticleTypes.CLOUD, player.getX() + 1.8 * player.getLookAngle().x, +// player.getY() + player.getBbHeight() - 0.1 + 1.8 * player.getLookAngle().y, +// player.getZ() + 1.8 * player.getLookAngle().z, +// 30, 0.4, 0.4, 0.4, 0.005, true); +// +// var serverPlayer = (ServerPlayer) player; +// +// SoundTool.playLocalSound(serverPlayer, ModSounds.RPG_FIRE_1P.get(), 2, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.RPG_FIRE_3P.get(), SoundSource.PLAYERS, 2, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.RPG_FAR.get(), SoundSource.PLAYERS, 5, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.RPG_VERYFAR.get(), SoundSource.PLAYERS, 10, 1); +// +// ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShootClientMessage(10)); + } + + if (GunsTool.getGunIntTag(stack, "Ammo", 0) == 1) { + tag.putBoolean("empty", true); + GunsTool.setGunBooleanTag(stack, "CloseHammer", true); + } + + player.getCooldowns().addCooldown(stack.getItem(), 10); + GunsTool.setGunIntTag(stack, "Ammo", GunsTool.getGunIntTag(stack, "Ammo", 0) - 1); + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java new file mode 100644 index 000000000..592da06b1 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/launcher/SecondaryCataclysm.java @@ -0,0 +1,334 @@ +package com.atsuishio.superbwarfare.item.gun.launcher; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.SecondaryCataclysmRenderer; +import com.atsuishio.superbwarfare.client.tooltip.component.SecondaryCataclysmImageComponent; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.capabilities.Capabilities; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Optional; +import java.util.function.Supplier; + +public class SecondaryCataclysm extends GunItem implements GeoItem, SpecialFireWeapon { + private final Supplier energyCapacity = () -> 24000; + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public SecondaryCataclysm() { + super(new Properties().stacksTo(1).fireResistant() + // TODO rarity +// .rarity(RarityTool.LEGENDARY) + ); + } + + @Override + public boolean isBarVisible(ItemStack stack) { + var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); + return cap != null && cap.getEnergyStored() > 0; + } + + @Override + public int getBarWidth(ItemStack stack) { + var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); + return Math.round((float) (cap != null ? cap.getEnergyStored() : 0) * 13.0F / 24000F); + } + + // TODO register cap +// @Override +// public ICapabilityProvider initCapabilities(ItemStack stack, CompoundTag tag) { +// return new ItemEnergyProvider(stack, energyCapacity.get()); +// } + + @Override + public int getBarColor(@NotNull ItemStack pStack) { + return 0x95E9FF; + } + + @Override + public GeoItemRenderer getRenderer() { + return new SecondaryCataclysmRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState reloadAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 1 && NBTTool.getOrCreateTag(stack).getDouble("prepare_load") > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sc.prepare")); + } + + if (NBTTool.getOrCreateTag(stack).getDouble("load_index") == 0 && NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 2) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sc.iterativeload")); + } + + if (NBTTool.getOrCreateTag(stack).getDouble("load_index") == 1 && NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 2) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sc.iterativeload2")); + } + + if (ClientEventHandler.gunMelee > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sc.hit")); + } + + if (NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 3) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sc.finish")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.sc.idle")); + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (player.isSprinting() && player.onGround() + && player.getPersistentData().getDouble("noRun") == 0 + && !(NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) + && NBTTool.getOrCreateTag(stack).getInt("reload_stage") != 1 + && NBTTool.getOrCreateTag(stack).getInt("reload_stage") != 2 + && NBTTool.getOrCreateTag(stack).getInt("reload_stage") != 3 + && ClientEventHandler.drawTime < 0.01 + && ClientEventHandler.gunMelee == 0 + && !GunsTool.getGunBooleanTag(stack, "Reloading")) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.sc.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.sc.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.sc.idle")); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var reloadAnimController = new AnimationController<>(this, "reloadAnimController", 1, this::reloadAnimPredicate); + data.add(reloadAnimController); + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + } + + public static int getAmmoCount(Player player) { + int count = 0; + for (var inv : player.getInventory().items) { + if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) { + count++; + } + } + + if (count == 0) { + int sum = 0; + for (int i = 0; i < player.getInventory().getContainerSize(); ++i) { + ItemStack itemstack = player.getInventory().getItem(i); + if (check(itemstack)) { + sum += itemstack.getCount(); + } + } + return sum; + } + return (int) Double.POSITIVE_INFINITY; + } + + @Override + @ParametersAreNonnullByDefault + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + if (entity instanceof Player player) { + GunsTool.setGunIntTag(stack, "MaxAmmo", getAmmoCount(player)); + } + + if (entity instanceof Player player) { + for (var cell : player.getInventory().items) { + if (cell.is(ModItems.CELL.get())) { + var stackStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (stackStorage == null) continue; + int stackMaxEnergy = stackStorage.getMaxEnergyStored(); + int stackEnergy = stackStorage.getEnergyStored(); + + var cellStorage = cell.getCapability(Capabilities.EnergyStorage.ITEM); + if (cellStorage == null) continue; + int cellEnergy = cellStorage.getEnergyStored(); + + int stackEnergyNeed = Math.min(cellEnergy, stackMaxEnergy - stackEnergy); + + if (cellEnergy > 0) { + stackStorage.receiveEnergy(stackEnergyNeed, false); + } + cellStorage.extractEnergy(stackEnergyNeed, false); + } + } + } + } + + protected static boolean check(ItemStack stack) { + return stack.getItem() == ModItems.GRENADE_40MM.get(); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.SECONDARY_CATACLYSM.get()); + GunsTool.initCreativeGun(stack, ModItems.SECONDARY_CATACLYSM.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/secondary_cataclysm_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "SECONDARY CATACLYSM"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.LAUNCHER_PERKS.test(perk) || perk == ModPerks.MICRO_MISSILE.get(); + } + + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + return Optional.of(new SecondaryCataclysmImageComponent(pStack)); + } + + // TODO attribute +// @Override +// public Multimap getAttributeModifiers(EquipmentSlot slot, ItemStack stack) { +// Multimap map = super.getAttributeModifiers(slot, stack); +// UUID uuid = new UUID(slot.toString().hashCode(), 0); +// if (slot == EquipmentSlot.MAINHAND) { +// map = HashMultimap.create(map); +// map.put(Attributes.ATTACK_DAMAGE, +// new AttributeModifier(uuid, ModUtils.ATTRIBUTE_MODIFIER, 19, AttributeModifier.Operation.ADDITION)); +// } +// return map; +// } + + @Override + public boolean isIterativeReload(ItemStack stack) { + return true; + } + + @Override + public boolean hasMeleeAttack(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } + + @Override + public void fireOnPress(Player player) { + ItemStack stack = player.getMainHandItem(); + if (GunsTool.getGunBooleanTag(stack, "Reloading")) return; + if (player.getCooldowns().isOnCooldown(stack.getItem()) || GunsTool.getGunIntTag(stack, "Ammo", 0) <= 0) return; + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + boolean zooming = cap != null && cap.zoom; + double spread = GunsTool.getGunDoubleTag(stack, "Spread"); + + var stackCap = stack.getCapability(Capabilities.EnergyStorage.ITEM); + var hasEnoughEnergy = stackCap != null && stackCap.getEnergyStored() >= 3000; + + boolean isChargedFire = zooming && hasEnoughEnergy; + + if (player.level() instanceof ServerLevel serverLevel) { + // TODO launch +// GunGrenadeEntity gunGrenadeEntity = new GunGrenadeEntity(player, serverLevel, +// (float) GunsTool.getGunDoubleTag(stack, "Damage", 0), +// (float) GunsTool.getGunDoubleTag(stack, "ExplosionDamage", 0), +// (float) GunsTool.getGunDoubleTag(stack, "ExplosionRadius", 0)); +// +// var dmgPerk = PerkHelper.getPerkByType(stack, Perk.Type.DAMAGE); +// if (dmgPerk == ModPerks.MONSTER_HUNTER.get()) { +// int perkLevel = PerkHelper.getItemPerkLevel(dmgPerk, stack); +// gunGrenadeEntity.setMonsterMultiplier(0.1f + 0.1f * perkLevel); +// } +// +// gunGrenadeEntity.setNoGravity(PerkHelper.getPerkByType(stack, Perk.Type.AMMO) == ModPerks.MICRO_MISSILE.get()); +// gunGrenadeEntity.charged(isChargedFire); +// +// float velocity = (float) GunsTool.getGunDoubleTag(stack, "Velocity", 0); +// int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.MICRO_MISSILE.get(), stack); +// if (perkLevel > 0) { +// gunGrenadeEntity.setExplosionRadius((float) GunsTool.getGunDoubleTag(stack, "ExplosionRadius", 0) * 0.5f); +// gunGrenadeEntity.setDamage((float) GunsTool.getGunDoubleTag(stack, "Damage", 0) * (1.1f + perkLevel * 0.1f)); +// velocity *= 1.2f; +// } +// +// gunGrenadeEntity.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ()); +// gunGrenadeEntity.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (isChargedFire ? 4 : 1) * velocity, +// (float) (zooming ? 0.1 : spread)); +// serverLevel.addFreshEntity(gunGrenadeEntity); +// +// ParticleTool.sendParticle(serverLevel, ParticleTypes.CLOUD, player.getX() + 1.8 * player.getLookAngle().x, +// player.getEyeY() - 0.35 + 1.8 * player.getLookAngle().y, +// player.getZ() + 1.8 * player.getLookAngle().z, +// 4, 0.1, 0.1, 0.1, 0.002, true); +// +// +// var serverPlayer = (ServerPlayer) player; +// +// if (isChargedFire) { +// SoundTool.playLocalSound(serverPlayer, ModSounds.SECONDARY_CATACLYSM_FIRE_1P_CHARGE.get(), 1, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.SECONDARY_CATACLYSM_FIRE_3P_CHARGE.get(), SoundSource.PLAYERS, 3, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.SECONDARY_CATACLYSM_FAR_CHARGE.get(), SoundSource.PLAYERS, 5, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.SECONDARY_CATACLYSM_VERYFAR_CHARGE.get(), SoundSource.PLAYERS, 10, 1); +// +// stack.getCapability(ForgeCapabilities.ENERGY).ifPresent(energy -> energy.extractEnergy(3000, false)); +// } else { +// SoundTool.playLocalSound(serverPlayer, ModSounds.SECONDARY_CATACLYSM_FIRE_1P.get(), 1, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.SECONDARY_CATACLYSM_FIRE_3P.get(), SoundSource.PLAYERS, 3, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.SECONDARY_CATACLYSM_FAR.get(), SoundSource.PLAYERS, 5, 1); +// serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.SECONDARY_CATACLYSM_VERYFAR.get(), SoundSource.PLAYERS, 10, 1); +// } +// +// ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShootClientMessage(10)); + } + + GunsTool.setGunIntTag(stack, "Ammo", GunsTool.getGunIntTag(stack, "Ammo", 0) - 1); + player.getCooldowns().addCooldown(stack.getItem(), 6); + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/DevotionItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/DevotionItem.java new file mode 100644 index 000000000..065e88aac --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/DevotionItem.java @@ -0,0 +1,140 @@ +package com.atsuishio.superbwarfare.item.gun.machinegun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.DevotionItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class DevotionItem extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public DevotionItem() { + super(new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new DevotionItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.devotion.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.devotion.reload_normal")); + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.devotion.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.devotion.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.devotion.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.DEVOTION_RELOAD_EMPTY.get(), ModSounds.DEVOTION_RELOAD_NORMAL.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.DEVOTION.get()); + GunsTool.initCreativeGun(stack, ModItems.DEVOTION.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/devotion_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "Devotion"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.MACHINE_GUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get() || perk == ModPerks.TURBO_CHARGER.get(); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean isAutoWeapon(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.AUTO.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java new file mode 100644 index 000000000..305ceb0d8 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/M60Item.java @@ -0,0 +1,166 @@ +package com.atsuishio.superbwarfare.item.gun.machinegun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.M60ItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Set; + +public class M60Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public M60Item() { + super(new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new M60ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState fireAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (ClientEventHandler.firePosTimer > 0 && ClientEventHandler.firePosTimer < 0.45) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m60.fire")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m60.idle")); + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m60.reload")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m60.reload2")); + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m60.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m60.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m60.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var fireAnimController = new AnimationController<>(this, "fireAnimController", 0, this::fireAnimPredicate); + data.add(fireAnimController); + var idleController = new AnimationController<>(this, "idleController", 4, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.M_60_RELOAD_EMPTY.get(), ModSounds.M_60_RELOAD_NORMAL.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.M_60.get()); + GunsTool.initCreativeGun(stack, ModItems.M_60.getId().getPath()); + return stack; + } + + @Override + @ParametersAreNonnullByDefault + public void inventoryTick(ItemStack stack, Level level, Entity entity, int slot, boolean selected) { + if (NBTTool.getOrCreateTag(stack).getBoolean("draw")) { + NBTTool.getOrCreateTag(stack).putBoolean("draw", false); + + if (GunsTool.getGunIntTag(stack, "Ammo", 0) <= 5) { + GunsTool.setGunBooleanTag(stack, "HideBulletChain", true); + } + } + super.inventoryTick(stack, level, entity, slot, selected); + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/m60_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "M60"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.MACHINE_GUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get(); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean isAutoWeapon(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.AUTO.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/MinigunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/MinigunItem.java new file mode 100644 index 000000000..5f1a06bf9 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/MinigunItem.java @@ -0,0 +1,188 @@ +package com.atsuishio.superbwarfare.item.gun.machinegun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.MinigunItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModParticleTypes; +import com.atsuishio.superbwarfare.init.ModPerks; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.atsuishio.superbwarfare.tools.ParticleTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; +import org.joml.Vector3d; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import javax.annotation.ParametersAreNonnullByDefault; + +public class MinigunItem extends GunItem implements GeoItem { + + private static final String TAG_HEAT = "heat"; + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public MinigunItem() { + super(new Properties().stacksTo(1) + // TODO rarity +// .rarity(RarityTool.LEGENDARY) + ); + } + + @Override + public boolean isBarVisible(@NotNull ItemStack pStack) { + return NBTTool.getDouble(pStack, TAG_HEAT, 0) != 0; + } + + @Override + public int getBarWidth(@NotNull ItemStack pStack) { + return Math.round((float) NBTTool.getDouble(pStack, TAG_HEAT, 0) * 13.0F / 51F); + } + + @Override + public int getBarColor(@NotNull ItemStack pStack) { + double f = 1 - NBTTool.getDouble(pStack, TAG_HEAT, 0) / 55.0F; + return Mth.hsvToRgb((float) f / 3.0F, 1.0F, 1.0F); + } + + @Override + public GeoItemRenderer getRenderer() { + return new MinigunItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.minigun.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.minigun.run")); + } + } + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.minigun.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 6, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + @ParametersAreNonnullByDefault + public void inventoryTick(ItemStack itemstack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(itemstack, world, entity, slot, selected); + + float yRot = entity.getYRot(); + if (yRot < 0) { + yRot += 360; + } + yRot = yRot + 90 % 360; + + var leftPos = new Vector3d(1.2, -0.3, 0.3); + + if (entity.isSprinting()) { + leftPos = new Vector3d(1., -0.4, -0.4); + } + + + leftPos.rotateZ(-entity.getXRot() * Mth.DEG_TO_RAD); + leftPos.rotateY(-yRot * Mth.DEG_TO_RAD); + + double cooldown = 0; + if (entity.wasInPowderSnow) { + cooldown = 0.15; + } else if (entity.isInWaterOrRain()) { + cooldown = 0.04; + } else if (entity.isOnFire() || entity.isInLava()) { + cooldown = -0.1; + } + + if (entity instanceof ServerPlayer serverPlayer && entity.level() instanceof ServerLevel serverLevel && NBTTool.getOrCreateTag(itemstack).getDouble("heat") > 4 && entity.isInWaterOrRain()) { + if (entity.isInWater()) { + ParticleTool.sendParticle(serverLevel, ParticleTypes.BUBBLE_COLUMN_UP, + entity.getX() + leftPos.x, + entity.getEyeY() + leftPos.y, + entity.getZ() + leftPos.z, + 1, 0.1, 0.1, 0.1, 0.002, true, serverPlayer); + } + ParticleTool.sendParticle(serverLevel, ModParticleTypes.CUSTOM_CLOUD.get(), + entity.getX() + leftPos.x, + entity.getEyeY() + leftPos.y, + entity.getZ() + leftPos.z, + 1, 0.1, 0.1, 0.1, 0.002, true, serverPlayer); + } + + NBTTool.getOrCreateTag(itemstack).putDouble("heat", Mth.clamp(NBTTool.getOrCreateTag(itemstack).getDouble("heat") - 0.05 - cooldown, 0, 55)); + + if (NBTTool.getOrCreateTag(itemstack).getDouble("overheat") > 0) { + NBTTool.getOrCreateTag(itemstack).putDouble("overheat", (NBTTool.getOrCreateTag(itemstack).getDouble("overheat") - 1)); + } + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.MINIGUN.get()); + GunsTool.initCreativeGun(stack, ModItems.MINIGUN.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/minigun_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "M134 MINIGUN"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return switch (perk.type) { + case AMMO -> perk != ModPerks.MICRO_MISSILE.get() && perk != ModPerks.LONGER_WIRE.get(); + case FUNCTIONAL -> perk == ModPerks.FIELD_DOCTOR.get() || perk == ModPerks.INTELLIGENT_CHIP.get(); + case DAMAGE -> perk == ModPerks.MONSTER_HUNTER.get() || perk == ModPerks.KILLING_TALLY.get(); + }; + } + + @Override + public boolean isAutoWeapon(ItemStack stack) { + return true; + } + + @Override + public boolean useBackpackAmmo(ItemStack stack) { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/RpkItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/RpkItem.java new file mode 100644 index 000000000..379d5f4e4 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/machinegun/RpkItem.java @@ -0,0 +1,140 @@ +package com.atsuishio.superbwarfare.item.gun.machinegun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.RpkItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class RpkItem extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public RpkItem() { + super(new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new RpkItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_normal")); + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ak47.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ak47.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ak47.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 4, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.RPK_RELOAD_EMPTY.get(), ModSounds.RPK_RELOAD_NORMAL.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.RPK.get()); + GunsTool.initCreativeGun(stack, ModItems.RPK.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/rpk_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "RPK"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.MACHINE_GUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get(); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean isAutoWeapon(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag + FireMode.AUTO.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK12Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK12Item.java new file mode 100644 index 000000000..963c7a57c --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK12Item.java @@ -0,0 +1,242 @@ +package com.atsuishio.superbwarfare.item.gun.rifle; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.AK12ItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class AK12Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.AK_12_RELOAD_EMPTY.get(), ModSounds.AK_12_RELOAD_NORMAL.get()); + } + + public AK12Item() { + super(new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new AK12ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + boolean drum = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE) == 2; + boolean grip = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 2; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak12.reload_empty_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak12.reload_empty")); + } + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + if (drum) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak12.reload_normal_drum_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak12.reload_normal_drum")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak12.reload_normal_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak12.reload_normal")); + } + } + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ak12.run_fast")); + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak12.run_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ak12.run")); + } + } + } + + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ak12.idle_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ak12.idle")); + } + } + + private PlayState editPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + if (cap != null && cap.edit) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak12.edit")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ak12.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + var editController = new AnimationController<>(this, "editController", 1, this::editPredicate); + data.add(editController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.AK_12.get()); + GunsTool.initCreativeGun(stack, ModItems.AK_12.getId().getPath()); + return stack; + } + + @Override + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + int barrelType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.BARREL); + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + int stockType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK); + + int customMag = switch (magType) { + case 1 -> 15; + case 2 -> 45; + default -> 0; + }; + + double customZoom = switch (scopeType) { + case 0, 1 -> 0; + case 2 -> 2.15; + default -> GunsTool.getGunDoubleTag(stack, "CustomZoom", 0); + }; + + NBTTool.getOrCreateTag(stack).putBoolean("CanAdjustZoomFov", scopeType == 3); + GunsTool.setGunDoubleTag(stack, "CustomZoom", customZoom); + GunsTool.setGunIntTag(stack, "CustomMagazine", customMag); + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/ak12_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "AK-12"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean isAutoWeapon(ItemStack stack) { + return true; + } + + @Override + public boolean isCustomizable(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomGrip(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomMagazine(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomScope(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomStock(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag + FireMode.AUTO.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK47Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK47Item.java new file mode 100644 index 000000000..129272be8 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/AK47Item.java @@ -0,0 +1,252 @@ +package com.atsuishio.superbwarfare.item.gun.rifle; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.AK47ItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Set; + +public class AK47Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.AK_47_RELOAD_EMPTY.get(), ModSounds.AK_47_RELOAD_NORMAL.get()); + } + + public AK47Item() { + super(new Properties().stacksTo(1).rarity(Rarity.RARE)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new AK47ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + boolean drum = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE) == 2; + boolean grip = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 2; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + if (drum) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_empty_drum_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_empty_drum")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_empty_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_empty")); + } + } + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + if (drum) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_normal_drum_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_normal_drum")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_normal_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.reload_normal")); + } + } + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ak47.run_fast")); + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.run_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ak47.run")); + } + } + } + + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ak47.idle_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ak47.idle")); + } + } + + private PlayState editPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + if (cap != null && cap.edit) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ak47.edit")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ak47.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + var editController = new AnimationController<>(this, "editController", 1, this::editPredicate); + data.add(editController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.AK_47.get()); + GunsTool.initCreativeGun(stack, ModItems.AK_47.getId().getPath()); + return stack; + } + + @Override + @ParametersAreNonnullByDefault + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + int barrelType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.BARREL); + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + int stockType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK); + + int customMag = switch (magType) { + case 1 -> 15; + case 2 -> 40; + default -> 0; + }; + + double customZoom = switch (scopeType) { + case 0, 1 -> 0; + case 2 -> 2.75; + default -> GunsTool.getGunDoubleTag(stack, "CustomZoom", 0); + }; + + NBTTool.getOrCreateTag(stack).putBoolean("CanAdjustZoomFov", scopeType == 3); + GunsTool.setGunDoubleTag(stack, "CustomZoom", customZoom); + GunsTool.setGunIntTag(stack, "CustomMagazine", customMag); + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/ak_47_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "AK-47"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean isAutoWeapon(ItemStack stack) { + return true; + } + + @Override + public boolean isCustomizable(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomGrip(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomMagazine(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomScope(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomStock(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag + FireMode.AUTO.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Hk416Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Hk416Item.java new file mode 100644 index 000000000..bcf43279a --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Hk416Item.java @@ -0,0 +1,252 @@ +package com.atsuishio.superbwarfare.item.gun.rifle; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.Hk416ItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class Hk416Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public Hk416Item() { + super(new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new Hk416ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + boolean drum = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE) == 2; + boolean grip = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 2; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + if (drum) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_empty_drum_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_empty_drum")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_empty_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_empty")); + } + } + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + if (drum) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_normal_drum_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_normal_drum")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_normal_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_normal")); + } + } + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m4.run_fast")); + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.run_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m4.run")); + } + } + } + + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m4.idle_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m4.idle")); + } + } + + private PlayState editPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + boolean grip = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 2; + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + if (cap != null && cap.edit) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.edit")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m4.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + var editController = new AnimationController<>(this, "editController", 1, this::editPredicate); + data.add(editController); + } + + @Override + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + int barrelType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.BARREL); + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + int stockType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK); + + int customMag = switch (magType) { + case 1 -> 15; + case 2 -> 30; + default -> 0; + }; + + double customZoom = switch (scopeType) { + case 0, 1 -> 0; + case 2 -> 2.25; + default -> GunsTool.getGunDoubleTag(stack, "CustomZoom", 0); + }; + + NBTTool.getOrCreateTag(stack).putBoolean("CanAdjustZoomFov", scopeType == 3); + GunsTool.setGunDoubleTag(stack, "CustomZoom", customZoom); + GunsTool.setGunIntTag(stack, "CustomMagazine", customMag); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.HK_416_RELOAD_EMPTY.get(), ModSounds.HK_416_RELOAD_NORMAL.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.HK_416.get()); + GunsTool.initCreativeGun(stack, ModItems.HK_416.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/hk416_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "HK-416"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean isAutoWeapon(ItemStack stack) { + return true; + } + + @Override + public boolean isCustomizable(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomGrip(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomMagazine(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomScope(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomStock(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag + FireMode.AUTO.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/M4Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/M4Item.java new file mode 100644 index 000000000..1154ba724 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/M4Item.java @@ -0,0 +1,251 @@ +package com.atsuishio.superbwarfare.item.gun.rifle; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.M4ItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class M4Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public M4Item() { + super(new Properties().stacksTo(1).rarity(Rarity.RARE)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new M4ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + boolean drum = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE) == 2; + boolean grip = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 2; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + if (drum) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_empty_drum_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_empty_drum")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_empty_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_empty")); + } + } + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + if (drum) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_normal_drum_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_normal_drum")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_normal_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.reload_normal")); + } + } + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m4.run_fast")); + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.run_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m4.run")); + } + } + } + + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m4.idle_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m4.idle")); + } + } + + private PlayState editPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + if (cap != null && cap.edit) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m4.edit")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m4.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + var editController = new AnimationController<>(this, "editController", 1, this::editPredicate); + data.add(editController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.M_4_RELOAD_EMPTY.get(), ModSounds.M_4_RELOAD_NORMAL.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.M_4.get()); + GunsTool.initCreativeGun(stack, ModItems.M_4.getId().getPath()); + return stack; + } + + @Override + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + int barrelType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.BARREL); + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + int stockType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK); + + int customMag = switch (magType) { + case 1 -> 15; + case 2 -> 30; + default -> 0; + }; + + double customZoom = switch (scopeType) { + case 0, 1 -> 0; + case 2 -> NBTTool.getOrCreateTag(stack).getBoolean("ScopeAlt") ? 0 : 2.75; + default -> GunsTool.getGunDoubleTag(stack, "CustomZoom", 0); + }; + + GunsTool.setGunBooleanTag(stack, "CanSwitchScope", scopeType == 2); + NBTTool.getOrCreateTag(stack).putBoolean("CanAdjustZoomFov", scopeType == 3); + GunsTool.setGunDoubleTag(stack, "CustomZoom", customZoom); + GunsTool.setGunIntTag(stack, "CustomMagazine", customMag); + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/m4_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "M4A1"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean isAutoWeapon(ItemStack stack) { + return true; + } + + @Override + public boolean isCustomizable(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomGrip(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomMagazine(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomScope(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomStock(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag + FireMode.AUTO.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/MarlinItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/MarlinItem.java new file mode 100644 index 000000000..8a9f20b41 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/MarlinItem.java @@ -0,0 +1,156 @@ +package com.atsuishio.superbwarfare.item.gun.rifle; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.MarlinItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class MarlinItem extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public MarlinItem() { + super(new Properties().stacksTo(1).rarity(Rarity.COMMON)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new MarlinItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState fireAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (GunsTool.getGunIntTag(stack, "BoltActionTick") > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.marlin.shift")); + } + + if (NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 1 && NBTTool.getOrCreateTag(stack).getDouble("prepare") > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.marlin.prepare")); + } + + if (NBTTool.getOrCreateTag(stack).getDouble("load_index") == 0 && NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 2) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.marlin.iterativeload")); + } + + if (NBTTool.getOrCreateTag(stack).getDouble("load_index") == 1 && NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 2) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.marlin.iterativeload2")); + } + + if (NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 3) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.marlin.finish")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.marlin.idle")); + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (transformType != null && transformType.firstPerson()) { + + + if (player.isSprinting() + && player.onGround() + && player.getPersistentData().getDouble("noRun") == 0 + && ClientEventHandler.drawTime < 0.01 + && !GunsTool.getGunBooleanTag(stack, "Reloading")) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.marlin.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.marlin.run")); + } + } + + event.getController().setAnimation(RawAnimation.begin().thenLoop("animation.marlin.idle")); + return PlayState.CONTINUE; + } + return PlayState.STOP; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var fireAnimController = new AnimationController<>(this, "fireAnimController", 1, this::fireAnimPredicate); + data.add(fireAnimController); + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.MARLIN_LOOP.get(), + ModSounds.MARLIN_PREPARE.get(), + ModSounds.MARLIN_END.get(), + ModSounds.MARLIN_BOLT.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.MARLIN.get()); + GunsTool.initCreativeGun(stack, ModItems.MARLIN.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/marlin_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "MARLIN-1894"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isIterativeReload(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Mk14Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Mk14Item.java new file mode 100644 index 000000000..3b309571f --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Mk14Item.java @@ -0,0 +1,250 @@ +package com.atsuishio.superbwarfare.item.gun.rifle; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.Mk14ItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class Mk14Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public Mk14Item() { + super(new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new Mk14ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + boolean drum = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE) == 2; + boolean grip = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 2; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + if (drum) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m14.reload_empty_drum_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m14.reload_empty_drum")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m14.reload_empty_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m14.reload_empty")); + } + } + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + if (drum) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m14.reload_normal_drum_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m14.reload_normal_drum")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m14.reload_normal_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m14.reload_normal")); + } + } + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m14.run_fast")); + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m14.run_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m14.run")); + } + } + } + + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m14.idle_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m14.idle")); + } + } + + private PlayState editPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + if (cap != null && cap.edit) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m14.edit")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m14.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + var editController = new AnimationController<>(this, "editController", 1, this::editPredicate); + data.add(editController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + int barrelType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.BARREL); + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + int stockType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK); + + int customMag = switch (magType) { + case 1 -> 10; + case 2 -> 30; + default -> 0; + }; + + double customZoom = switch (scopeType) { + case 0, 1 -> 0; + case 2 -> 2.25; + default -> GunsTool.getGunDoubleTag(stack, "CustomZoom", 0); + }; + + NBTTool.getOrCreateTag(stack).putBoolean("CanAdjustZoomFov", scopeType == 3); + GunsTool.setGunDoubleTag(stack, "CustomZoom", customZoom); + GunsTool.setGunIntTag(stack, "CustomMagazine", customMag); + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.MK_14_RELOAD_EMPTY.get(), ModSounds.MK_14_RELOAD_NORMAL.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.MK_14.get()); + GunsTool.initCreativeGun(stack, ModItems.MK_14.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/mk14ebr_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "MK-14"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean isAutoWeapon(ItemStack stack) { + return true; + } + + @Override + public boolean isCustomizable(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomGrip(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomMagazine(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomScope(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomStock(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag + FireMode.AUTO.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Qbz95Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Qbz95Item.java new file mode 100644 index 000000000..b1bc52ca6 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/Qbz95Item.java @@ -0,0 +1,249 @@ +package com.atsuishio.superbwarfare.item.gun.rifle; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.Qbz95ItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class Qbz95Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public Qbz95Item() { + super(new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new Qbz95ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + boolean drum = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE) == 2; + boolean grip = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 2; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + if (drum) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz95.reload_empty_drum_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz95.reload_empty_drum")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz95.reload_empty_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz95.reload_empty")); + } + } + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + if (drum) { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz95.reload_normal_drum_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz95.reload_normal_drum")); + } + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz95.reload_normal_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz95.reload_normal")); + } + } + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.qbz95.run_fast")); + } else { + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz95.run_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.qbz95.run")); + } + } + } + + if (grip) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.qbz95.idle_grip")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.qbz95.idle")); + } + } + + private PlayState editPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + boolean grip = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 1 || GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.GRIP) == 2; + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + if (cap != null && cap.edit) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.qbz95.edit")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.qbz95.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + var editController = new AnimationController<>(this, "editController", 1, this::editPredicate); + data.add(editController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + int barrelType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.BARREL); + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + int stockType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.STOCK); + + if (magType == 1) { + CompoundTag tag = NBTTool.getOrCreateTag(stack).getCompound("Attachments"); + tag.putInt("Magazine", 2); + } + + int customMag = magType == 2 ? 30 : 0; + + double customZoom = switch (scopeType) { + case 0, 1 -> 0; + case 2 -> 2.15; + default -> GunsTool.getGunDoubleTag(stack, "CustomZoom", 0); + }; + + NBTTool.getOrCreateTag(stack).putBoolean("CanAdjustZoomFov", scopeType == 3); + GunsTool.setGunDoubleTag(stack, "CustomZoom", customZoom); + GunsTool.setGunIntTag(stack, "CustomMagazine", customMag); + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.QBZ_95_RELOAD_EMPTY.get(), ModSounds.QBZ_95_RELOAD_NORMAL.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.QBZ_95.get()); + GunsTool.initCreativeGun(stack, ModItems.QBZ_95.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/qbz95_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "QBZ-95-1"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean isAutoWeapon(ItemStack stack) { + return true; + } + + @Override + public boolean isCustomizable(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomGrip(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomMagazine(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomScope(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag + FireMode.AUTO.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/SksItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/SksItem.java new file mode 100644 index 000000000..43d67bbbf --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/rifle/SksItem.java @@ -0,0 +1,151 @@ +package com.atsuishio.superbwarfare.item.gun.rifle; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.SksItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Set; + +public class SksItem extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.SKS_RELOAD_EMPTY.get(), ModSounds.SKS_RELOAD_NORMAL.get()); + } + + public SksItem() { + super(new Properties().stacksTo(1).rarity(Rarity.RARE)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new SksItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sks.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sks.reload_normal")); + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.sks.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.sks.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.sks.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 4, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.SKS.get()); + GunsTool.initCreativeGun(stack, ModItems.SKS.getId().getPath()); + return stack; + } + + @Override + @ParametersAreNonnullByDefault + public void inventoryTick(ItemStack stack, Level level, Entity entity, int slot, boolean selected) { + if (NBTTool.getOrCreateTag(stack).getBoolean("draw")) { + NBTTool.getOrCreateTag(stack).putBoolean("draw", false); + + if (GunsTool.getGunIntTag(stack, "Ammo", 0) == 0) { + GunsTool.setGunBooleanTag(stack, "HoldOpen", true); + } + } + super.inventoryTick(stack, level, entity, slot, selected); + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/sks_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "SKS"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/Aa12Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/Aa12Item.java new file mode 100644 index 000000000..4437d5ba1 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/Aa12Item.java @@ -0,0 +1,173 @@ +package com.atsuishio.superbwarfare.item.gun.shotgun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.Aa12ItemRenderer; +import com.atsuishio.superbwarfare.client.tooltip.component.ShotgunImageComponent; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Optional; +import java.util.Set; + +public class Aa12Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public String animationProcedure = "empty"; + public static ItemDisplayContext transformType; + + public Aa12Item() { + super(new Properties().stacksTo(1) + // TODO rarity +// .rarity(RarityTool.LEGENDARY) + ); + } + + @Override + public GeoItemRenderer getRenderer() { + return new Aa12ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (this.animationProcedure.equals("empty")) { + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.aa12.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.aa12.reload_normal")); + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.aa12.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.aa12.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.aa12.idle")); + } + return PlayState.STOP; + } + + private PlayState procedurePredicate(AnimationState event) { + if (transformType != null && transformType.firstPerson()) { + if (!this.animationProcedure.equals("empty") && event.getController().getAnimationState() == AnimationController.State.STOPPED) { + event.getController().setAnimation(RawAnimation.begin().thenPlay(this.animationProcedure)); + if (event.getController().getAnimationState() == AnimationController.State.STOPPED) { + this.animationProcedure = "empty"; + event.getController().forceAnimationReset(); + } + } else if (this.animationProcedure.equals("empty")) { + return PlayState.STOP; + } + } + return PlayState.CONTINUE; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var procedureController = new AnimationController<>(this, "procedureController", 0, this::procedurePredicate); + data.add(procedureController); + var idleController = new AnimationController<>(this, "idleController", 4, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.AA_12_RELOAD_EMPTY.get(), ModSounds.AA_12_RELOAD_NORMAL.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.AA_12.get()); + GunsTool.initCreativeGun(stack, ModItems.AA_12.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/aa_12_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "AA-12"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.SHOTGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk) || perk == ModPerks.DESPERADO.get(); + } + + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + return Optional.of(new ShotgunImageComponent(pStack)); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean isAutoWeapon(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag + FireMode.AUTO.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java new file mode 100644 index 000000000..40bddc7ef --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/HomemadeShotgunItem.java @@ -0,0 +1,134 @@ +package com.atsuishio.superbwarfare.item.gun.shotgun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.HomemadeShotgunItemRenderer; +import com.atsuishio.superbwarfare.client.tooltip.component.ShotgunImageComponent; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Optional; +import java.util.Set; + +public class HomemadeShotgunItem extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.HOMEMADE_SHOTGUN_RELOAD_EMPTY.get(), ModSounds.HOMEMADE_SHOTGUN_NORMAL.get()); + } + + public HomemadeShotgunItem() { + super(new Properties().durability(24).rarity(Rarity.COMMON)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new HomemadeShotgunItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ab.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.ab.reload_normal")); + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ab.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ab.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.ab.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.HOMEMADE_SHOTGUN.get()); + GunsTool.initCreativeGun(stack, ModItems.HOMEMADE_SHOTGUN.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/homemade_shotgun_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "Homemade Shotgun"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.SHOTGUN_PERKS.test(perk); + } + + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + return Optional.of(new ShotgunImageComponent(pStack)); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/M870Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/M870Item.java new file mode 100644 index 000000000..343dbefbb --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/shotgun/M870Item.java @@ -0,0 +1,163 @@ +package com.atsuishio.superbwarfare.item.gun.shotgun; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.M870ItemRenderer; +import com.atsuishio.superbwarfare.client.tooltip.component.ShotgunImageComponent; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Optional; +import java.util.Set; + +public class M870Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public M870Item() { + super(new Properties().stacksTo(1).rarity(Rarity.RARE)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new M870ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState fireAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (GunsTool.getGunIntTag(stack, "BoltActionTick") > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.shift")); + } + + if (NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 1 && NBTTool.getOrCreateTag(stack).getDouble("prepare_load") > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.preparealt")); + } + + if (NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 1 && NBTTool.getOrCreateTag(stack).getDouble("prepare") > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.prepare")); + } + + if (NBTTool.getOrCreateTag(stack).getDouble("load_index") == 0 && NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 2) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.iterativeload")); + } + + if (NBTTool.getOrCreateTag(stack).getDouble("load_index") == 1 && NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 2) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.iterativeload2")); + } + + if (NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 3) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m870.finish")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m870.idle")); + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (player.isSprinting() + && player.onGround() + && player.getPersistentData().getDouble("noRun") == 0 + && ClientEventHandler.drawTime < 0.01 + && !GunsTool.getGunBooleanTag(stack, "Reloading")) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m870.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m870.run")); + } + } + + event.getController().setAnimation(RawAnimation.begin().thenLoop("animation.m870.idle")); + return PlayState.CONTINUE; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var fireAnimController = new AnimationController<>(this, "fireAnimController", 1, this::fireAnimPredicate); + data.add(fireAnimController); + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.M_870_PREPARE_LOAD.get(), + ModSounds.M_870_LOOP.get(), + ModSounds.M_870_BOLT.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.M_870.get()); + GunsTool.initCreativeGun(stack, ModItems.M_870.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/m870_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "M870 MCS"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.SHOTGUN_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + return Optional.of(new ShotgunImageComponent(pStack)); + } + + @Override + public boolean isIterativeReload(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/HuntingRifleItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/HuntingRifleItem.java new file mode 100644 index 000000000..c13b75893 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/HuntingRifleItem.java @@ -0,0 +1,115 @@ +package com.atsuishio.superbwarfare.item.gun.sniper; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.HuntingRifleItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class HuntingRifleItem extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public HuntingRifleItem() { + super(new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.HUNTING_RIFLE_RELOAD_EMPTY.get()); + } + + @Override + public GeoItemRenderer getRenderer() { + return new HuntingRifleItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.hunting_rifle.reload")); + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.hunting_rifle.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.hunting_rifle.run")); + } + } + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.hunting_rifle.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 4, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.HUNTING_RIFLE.get()); + GunsTool.initCreativeGun(stack, ModItems.HUNTING_RIFLE.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/hunting_rifle_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "Hunting Rifle"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/K98Item.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/K98Item.java new file mode 100644 index 000000000..3a92dcaf8 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/K98Item.java @@ -0,0 +1,165 @@ +package com.atsuishio.superbwarfare.item.gun.sniper; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.K98ItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class K98Item extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public K98Item() { + super(new Properties().stacksTo(1).rarity(Rarity.RARE)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new K98ItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState fireAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (GunsTool.getGunIntTag(stack, "BoltActionTick") > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.shift")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 1 && NBTTool.getOrCreateTag(stack).getDouble("prepare") > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.prepare")); + } + + if (NBTTool.getOrCreateTag(stack).getDouble("load_index") == 0 && NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 2) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.iterativeload")); + } + + if (NBTTool.getOrCreateTag(stack).getDouble("load_index") == 1 && NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 2) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.iterativeload2")); + } + + if (NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 3) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.k98.finish")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.k98.idle")); + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (player.isSprinting() && player.onGround() + && player.getPersistentData().getDouble("noRun") == 0 + && !(NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) + && NBTTool.getOrCreateTag(stack).getInt("reload_stage") != 1 + && NBTTool.getOrCreateTag(stack).getInt("reload_stage") != 2 + && NBTTool.getOrCreateTag(stack).getInt("reload_stage") != 3 + && ClientEventHandler.drawTime < 0.01 + && !GunsTool.getGunBooleanTag(stack, "Reloading")) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED) && GunsTool.getGunIntTag(stack, "BoltActionTick") == 0) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.k98.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.k98.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.k98.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var fireAnimController = new AnimationController<>(this, "fireAnimController", 1, this::fireAnimPredicate); + data.add(fireAnimController); + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of( + ModSounds.K_98_RELOAD_EMPTY.get(), + ModSounds.K_98_BOLT.get(), + ModSounds.K_98_PREPARE.get(), + ModSounds.K_98_LOOP.get(), + ModSounds.K_98_END.get() + ); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.K_98.get()); + GunsTool.initCreativeGun(stack, ModItems.K_98.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/k98_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "KAR-98K"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + // TODO perk +// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk); + return false; + } + + @Override + public boolean isClipReload(ItemStack stack) { + return true; + } + + @Override + public boolean isIterativeReload(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/M98bItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/M98bItem.java new file mode 100644 index 000000000..5296d8011 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/M98bItem.java @@ -0,0 +1,147 @@ +package com.atsuishio.superbwarfare.item.gun.sniper; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.M98bItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class M98bItem extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public M98bItem() { + super(new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new M98bItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState fireAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (GunsTool.getGunIntTag(stack, "BoltActionTick") > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m98b.shift")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m98b.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.m98b.reload_normal")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m98b.idle")); + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (player.isSprinting() && player.onGround() + && player.getPersistentData().getDouble("noRun") == 0 + && !(NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading") || NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED) && GunsTool.getGunIntTag(stack, "BoltActionTick") == 0) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m98b.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m98b.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.m98b.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var fireAnimController = new AnimationController<>(this, "fireAnimController", 1, this::fireAnimPredicate); + data.add(fireAnimController); + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.M_98B_RELOAD_EMPTY.get(), ModSounds.M_98B_RELOAD_NORMAL.get(), ModSounds.M_98B_BOLT.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.M_98B.get()); + GunsTool.initCreativeGun(stack, ModItems.M_98B.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/m98b_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "M98-B"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/MosinNagantItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/MosinNagantItem.java new file mode 100644 index 000000000..bfc2538e1 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/MosinNagantItem.java @@ -0,0 +1,160 @@ +package com.atsuishio.superbwarfare.item.gun.sniper; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.MosinNagantItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class MosinNagantItem extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public MosinNagantItem() { + super(new Properties().stacksTo(1).rarity(Rarity.RARE)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new MosinNagantItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState fireAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (GunsTool.getGunIntTag(stack, "BoltActionTick") > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mosin.shift")); + } + + if (NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 1 && GunsTool.getGunIntTag(stack, "Ammo", 0) == 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mosin.prepare_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 1 && GunsTool.getGunIntTag(stack, "Ammo", 0) > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mosin.prepare")); + } + + if (NBTTool.getOrCreateTag(stack).getDouble("load_index") == 0 && NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 2) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mosin.iterativeload")); + } + + if (NBTTool.getOrCreateTag(stack).getDouble("load_index") == 1 && NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 2) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mosin.iterativeload2")); + } + + if (NBTTool.getOrCreateTag(stack).getInt("reload_stage") == 3) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.mosin.finish")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.mosin.idle")); + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (player.isSprinting() && player.onGround() + && player.getPersistentData().getDouble("noRun") == 0 + && !(NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) + && NBTTool.getOrCreateTag(stack).getInt("reload_stage") != 1 + && NBTTool.getOrCreateTag(stack).getInt("reload_stage") != 2 + && NBTTool.getOrCreateTag(stack).getInt("reload_stage") != 3 + && ClientEventHandler.drawTime < 0.01 + && !GunsTool.getGunBooleanTag(stack, "Reloading")) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED) && GunsTool.getGunIntTag(stack, "BoltActionTick") == 0) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.mosin.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.mosin.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.mosin.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var fireAnimController = new AnimationController<>(this, "fireAnimController", 1, this::fireAnimPredicate); + data.add(fireAnimController); + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of( + ModSounds.MOSIN_NAGANT_BOLT.get(), + ModSounds.MOSIN_NAGANT_PREPARE.get(), + ModSounds.MOSIN_NAGANT_PREPARE_EMPTY.get(), + ModSounds.MOSIN_NAGANT_LOOP.get(), + ModSounds.MOSIN_NAGANT_END.get() + ); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.MOSIN_NAGANT.get()); + GunsTool.initCreativeGun(stack, ModItems.MOSIN_NAGANT.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/mosin_nagant_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "MOSIN NAGANT"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk); + } + + @Override + public boolean isIterativeReload(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java new file mode 100644 index 000000000..86977fb7d --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SentinelItem.java @@ -0,0 +1,216 @@ +package com.atsuishio.superbwarfare.item.gun.sniper; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.client.renderer.item.SentinelItemRenderer; +import com.atsuishio.superbwarfare.client.tooltip.component.SentinelImageComponent; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.capabilities.Capabilities; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Optional; +import java.util.Set; +import java.util.function.Supplier; + +public class SentinelItem extends GunItem implements GeoItem { + + private final Supplier energyCapacity; + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public SentinelItem() { + super(new Properties().stacksTo(1) + // todo rarity +// .rarity(RarityTool.LEGENDARY) + ); + + this.energyCapacity = () -> 24000; + } + + @Override + public boolean isBarVisible(ItemStack stack) { + var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); + return cap != null && cap.getEnergyStored() > 0; + } + + @Override + public int getBarWidth(ItemStack stack) { + var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); + + return Math.round((float) (cap != null ? cap.getEnergyStored() : 0) * 13.0F / 24000F); + } + + // TODO register cap +// @Override +// public ICapabilityProvider initCapabilities(ItemStack stack, CompoundTag tag) { +// return new ItemEnergyProvider(stack, energyCapacity.get()); +// } + + @Override + public int getBarColor(@NotNull ItemStack pStack) { + return 0x95E9FF; + } + + @Override + public GeoItemRenderer getRenderer() { + return new SentinelItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState fireAnimPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (GunsTool.getGunIntTag(stack, "BoltActionTick") > 0) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sentinel.shift")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sentinel.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sentinel.reload_normal")); + } + + if (GunsTool.getGunBooleanTag(stack, "Charging")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.sentinel.charge")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.sentinel.idle")); + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (player.isSprinting() && player.onGround() + && player.getPersistentData().getDouble("noRun") == 0 + && !(NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading") || NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) + && !GunsTool.getGunBooleanTag(stack, "Charging") && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED) && GunsTool.getGunIntTag(stack, "BoltActionTick") == 0) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.sentinel.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.sentinel.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.sentinel.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var fireAnimController = new AnimationController<>(this, "fireAnimController", 1, this::fireAnimPredicate); + data.add(fireAnimController); + var idleController = new AnimationController<>(this, "idleController", 4, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + @ParametersAreNonnullByDefault + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + + var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (cap != null && cap.getEnergyStored() > 0) { + cap.extractEnergy(1, false); + GunsTool.setGunDoubleTag(stack, "ChargedDamage", 0.2857142857142857 + * GunsTool.getGunDoubleTag(stack, "Damage", 0)); + } else { + GunsTool.setGunDoubleTag(stack, "ChargedDamage", 0); + } + } + + @Override + public Set getReloadSound() { + return Set.of( + ModSounds.SENTINEL_RELOAD_EMPTY.get(), + ModSounds.SENTINEL_RELOAD_NORMAL.get(), + ModSounds.SENTINEL_CHARGE.get(), + ModSounds.SENTINEL_BOLT.get() + ); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.SENTINEL.get()); + GunsTool.initCreativeGun(stack, ModItems.SENTINEL.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/sentinel_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "SENTINEL"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // TODO perk +// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + return Optional.of(new SentinelImageComponent(pStack)); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SvdItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SvdItem.java new file mode 100644 index 000000000..adf66d971 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/sniper/SvdItem.java @@ -0,0 +1,204 @@ +package com.atsuishio.superbwarfare.item.gun.sniper; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.SvdItemRenderer; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Set; + +public class SvdItem extends GunItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public SvdItem() { + super(new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new SvdItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.svd.reload_empty")); + } + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_normal_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.svd.reload_normal")); + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.svd.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.svd.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.svd.idle")); + } + + private PlayState editPredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + + if (cap != null && cap.edit) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.svd.edit")); + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.svd.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + var editController = new AnimationController<>(this, "editController", 1, this::editPredicate); + data.add(editController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.SVD_RELOAD_EMPTY.get(), ModSounds.SVD_RELOAD_NORMAL.get()); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.SVD.get()); + GunsTool.initCreativeGun(stack, ModItems.SVD.getId().getPath()); + return stack; + } + + @Override + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + + int scopeType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.SCOPE); + int magType = GunsTool.getAttachmentType(stack, GunsTool.AttachmentType.MAGAZINE); + + int customMag = switch (magType) { + case 1 -> 10; + case 2 -> 20; + default -> 0; + }; + + double customZoom = switch (scopeType) { + case 0, 1 -> 0; + case 2 -> 3.75; + default -> GunsTool.getGunDoubleTag(stack, "CustomZoom", 0); + }; + + NBTTool.getOrCreateTag(stack).putBoolean("CanAdjustZoomFov", scopeType == 3); + GunsTool.setGunDoubleTag(stack, "CustomZoom", customZoom); + GunsTool.setGunIntTag(stack, "CustomMagazine", customMag); + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/svd_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "SVD"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return false; + // todo perk +// return PerkHelper.SNIPER_RIFLE_PERKS.test(perk) || PerkHelper.MAGAZINE_PERKS.test(perk); + } + + @Override + public boolean isCustomizable(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomScope(ItemStack stack) { + return true; + } + + @Override + public boolean hasCustomMagazine(ItemStack stack) { + return true; + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public boolean isOpenBolt(ItemStack stack) { + return true; + } + + @Override + public boolean hasBulletInBarrel(ItemStack stack) { + return true; + } + + @Override + public boolean canEjectShell(ItemStack stack) { + return true; + } + + @Override + public boolean hasBipod(ItemStack stack) { + return true; + } + + @Override + public int getAvailableFireModes() { + return FireMode.SEMI.flag; + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java new file mode 100644 index 000000000..f5c1e2596 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/BocekItem.java @@ -0,0 +1,222 @@ +package com.atsuishio.superbwarfare.item.gun.special; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.BocekItemRenderer; +import com.atsuishio.superbwarfare.client.tooltip.component.BocekImageComponent; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.InventoryTool; +import com.atsuishio.superbwarfare.tools.SoundTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.Optional; + +public class BocekItem extends GunItem implements GeoItem, SpecialFireWeapon { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + + public BocekItem() { + super(new Properties().stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public GeoItemRenderer getRenderer() { + return new BocekItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.bocek.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.bocek.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.bocek.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + var idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + public static int getAmmoCount(Player player) { + int count = 0; + for (var inv : player.getInventory().items) { + if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) { + count++; + } + } + + if (count == 0) { + int sum = 0; + for (int i = 0; i < player.getInventory().getContainerSize(); ++i) { + ItemStack itemstack = player.getInventory().getItem(i); + if (check(itemstack)) { + sum += itemstack.getCount(); + } + } + return sum; + } + return (int) Double.POSITIVE_INFINITY; + } + + @Override + @ParametersAreNonnullByDefault + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + if (entity instanceof Player player) { + GunsTool.setGunIntTag(stack, "MaxAmmo", getAmmoCount(player)); + } + + if (GunsTool.getGunIntTag(stack, "ArrowEmpty") > 0) { + GunsTool.setGunIntTag(stack, "ArrowEmpty", GunsTool.getGunIntTag(stack, "ArrowEmpty") - 1); + } + } + + protected static boolean check(ItemStack stack) { + return stack.getItem() == Items.ARROW; + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.BOCEK.get()); + GunsTool.initCreativeGun(stack, ModItems.BOCEK.getId().getPath()); + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/bocek_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "Bocek"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return switch (perk.type) { + case AMMO -> !perk.descriptionId.equals("butterfly_bullet") && perk != ModPerks.MICRO_MISSILE.get(); + case FUNCTIONAL -> perk == ModPerks.FIELD_DOCTOR.get() || perk == ModPerks.INTELLIGENT_CHIP.get(); + case DAMAGE -> perk == ModPerks.MONSTER_HUNTER.get() || perk == ModPerks.KILLING_TALLY.get(); + }; + } + + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + return Optional.of(new BocekImageComponent(pStack)); + } + + @Override + public boolean useBackpackAmmo(ItemStack stack) { + return true; + } + + + @Override + public void fireOnRelease(Player player) { + if (player.level().isClientSide()) return; + + ItemStack stack = player.getMainHandItem(); + + // TODO perk +// var perk = PerkHelper.getPerkByType(stack, Perk.Type.AMMO); + + if (player instanceof ServerPlayer serverPlayer) { + SoundTool.stopSound(serverPlayer, ModSounds.BOCEK_PULL_1P.getId(), SoundSource.PLAYERS); + SoundTool.stopSound(serverPlayer, ModSounds.BOCEK_PULL_3P.getId(), SoundSource.PLAYERS); + + // TODO shoot client msg +// ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShootClientMessage(10)); + } + + if (GunsTool.getGunDoubleTag(stack, "Power") >= 6) { + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + if (cap != null && cap.zoom) { + // TODO FireMessage.spawnBullet +// spawnBullet(player); + + SoundTool.playLocalSound(player, ModSounds.BOCEK_ZOOM_FIRE_1P.get(), 10, 1); + player.playSound(ModSounds.BOCEK_ZOOM_FIRE_3P.get(), 2, 1); + } else { +// for (int i = 0; i < (perk instanceof AmmoPerk ammoPerk && ammoPerk.slug ? 1 : 10); i++) { +// spawnBullet(player); +// } + + SoundTool.playLocalSound(player, ModSounds.BOCEK_SHATTER_CAP_FIRE_1P.get(), 10, 1); + player.playSound(ModSounds.BOCEK_SHATTER_CAP_FIRE_3P.get(), 2, 1); + } + +// if (perk == ModPerks.BEAST_BULLET.get()) { +// player.playSound(ModSounds.HENG.get(), 4f, 1f); +// +// if (player instanceof ServerPlayer serverPlayer) { +// SoundTool.playLocalSound(serverPlayer, ModSounds.HENG.get(), 4f, 1f); +// } +// } + + player.getCooldowns().addCooldown(stack.getItem(), 7); + GunsTool.setGunIntTag(stack, "ArrowEmpty", 7); + GunsTool.setGunDoubleTag(stack, "Power", 0); + + if (!InventoryTool.hasCreativeAmmoBox(player) && !player.isCreative()) { + player.getInventory().clearOrCountMatchingItems(p -> Items.ARROW == p.getItem(), 1, player.inventoryMenu.getCraftSlots()); + } + } + } + + @Override + public void fireOnPress(Player player) { + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + if (cap != null) { + cap.bowPullHold = true; + cap.syncPlayerVariables(player); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java new file mode 100644 index 000000000..4cf3e3375 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/special/TaserItem.java @@ -0,0 +1,279 @@ +package com.atsuishio.superbwarfare.item.gun.special; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.capability.ModCapabilities; +import com.atsuishio.superbwarfare.client.renderer.item.TaserItemRenderer; +import com.atsuishio.superbwarfare.client.tooltip.component.EnergyImageComponent; +import com.atsuishio.superbwarfare.event.ClientEventHandler; +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModPerks; +import com.atsuishio.superbwarfare.init.ModSounds; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.gun.GunItem; +import com.atsuishio.superbwarfare.item.gun.SpecialFireWeapon; +import com.atsuishio.superbwarfare.perk.Perk; +import com.atsuishio.superbwarfare.tools.GunsTool; +import com.atsuishio.superbwarfare.tools.NBTTool; +import com.atsuishio.superbwarfare.tools.SoundTool; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.capabilities.Capabilities; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.*; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.Optional; +import java.util.Set; +import java.util.function.Supplier; + +public class TaserItem extends GunItem implements GeoItem, SpecialFireWeapon { + + public static final int MAX_ENERGY = 6000; + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + public static ItemDisplayContext transformType; + private final Supplier energyCapacity; + + public TaserItem() { + super(new Properties().stacksTo(1).rarity(Rarity.COMMON)); + this.energyCapacity = () -> MAX_ENERGY; + } + + @Override + public boolean isBarVisible(ItemStack stack) { + var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); + return cap != null && cap.getEnergyStored() > 0 && cap.getEnergyStored() < MAX_ENERGY; + } + + @Override + public int getBarWidth(ItemStack stack) { + var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); + return Math.round((float) (cap != null ? cap.getEnergyStored() : 0) * 13.0F / MAX_ENERGY); + } + + // TODO register cap +// @Override +// public ICapabilityProvider initCapabilities(ItemStack stack, CompoundTag tag) { +// return new ItemEnergyProvider(stack, energyCapacity.get()); +// } + + @Override + public int getBarColor(@NotNull ItemStack pStack) { + return 0xFFFF00; + } + + @Override + public Set getReloadSound() { + return Set.of(ModSounds.TASER_RELOAD_EMPTY.get()); + } + + @Override + public GeoItemRenderer getRenderer() { + return new TaserItemRenderer(); + } + + public void getTransformType(ItemDisplayContext type) { + transformType = type; + } + + private PlayState idlePredicate(AnimationState event) { + LocalPlayer player = Minecraft.getInstance().player; + if (player == null) return PlayState.STOP; + ItemStack stack = player.getMainHandItem(); + if (!stack.is(ModTags.Items.GUN)) return PlayState.STOP; + + if (NBTTool.getOrCreateTag(stack).getBoolean("is_empty_reloading")) { + return event.setAndContinue(RawAnimation.begin().thenPlay("animation.taser.reload")); + } + + if (player.isSprinting() && player.onGround() && player.getPersistentData().getDouble("noRun") == 0 && ClientEventHandler.drawTime < 0.01) { + if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.taser.run_fast")); + } else { + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.taser.run")); + } + } + + return event.setAndContinue(RawAnimation.begin().thenLoop("animation.taser.idle")); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + AnimationController idleController = new AnimationController<>(this, "idleController", 3, this::idlePredicate); + data.add(idleController); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } + + public static int getAmmoCount(Player player) { + int count = 0; + for (var inv : player.getInventory().items) { + if (inv.is(ModItems.CREATIVE_AMMO_BOX.get())) { + count++; + } + } + + if (count == 0) { + int sum = 0; + for (int i = 0; i < player.getInventory().getContainerSize(); ++i) { + ItemStack itemstack = player.getInventory().getItem(i); + if (check(itemstack)) { + sum += itemstack.getCount(); + } + } + return sum; + } + return (int) Double.POSITIVE_INFINITY; + } + + @Override + public void inventoryTick(ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + super.inventoryTick(stack, world, entity, slot, selected); + + if (entity instanceof Player player) { + GunsTool.setGunIntTag(stack, "MaxAmmo", getAmmoCount(player)); + } + + // TODO perk +// int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.REGENERATION.get(), stack); + + var stackStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); +// if (stackStorage != null) { +// stackStorage.receiveEnergy(perkLevel, false); +// } + + if (entity instanceof Player player) { + for (var cell : player.getInventory().items) { + if (cell.is(ModItems.CELL.get())) { + if (stackStorage == null) continue; + int stackMaxEnergy = stackStorage.getMaxEnergyStored(); + int stackEnergy = stackStorage.getEnergyStored(); + + var cellStorage = cell.getCapability(Capabilities.EnergyStorage.ITEM); + if (cellStorage == null) continue; + int cellEnergy = cellStorage.getEnergyStored(); + + int stackEnergyNeed = Math.min(cellEnergy, stackMaxEnergy - stackEnergy); + + if (cellEnergy > 0) { + stackStorage.receiveEnergy(stackEnergyNeed, false); + } + cellStorage.extractEnergy(stackEnergyNeed, false); + } + } + } + } + + protected static boolean check(ItemStack stack) { + return stack.getItem() == ModItems.TASER_ELECTRODE.get(); + } + + public static ItemStack getGunInstance() { + ItemStack stack = new ItemStack(ModItems.TASER.get()); + GunsTool.initCreativeGun(stack, ModItems.TASER.getId().getPath()); + var cap = stack.getCapability(Capabilities.EnergyStorage.ITEM); + if (cap != null) { + cap.receiveEnergy(MAX_ENERGY, false); + } + return stack; + } + + @Override + public ResourceLocation getGunIcon() { + return ModUtils.loc("textures/gun_icon/taser_icon.png"); + } + + @Override + public String getGunDisplayName() { + return "TASER"; + } + + @Override + public boolean canApplyPerk(Perk perk) { + return switch (perk.type) { + case AMMO -> perk == ModPerks.LONGER_WIRE.get(); + case FUNCTIONAL -> + perk == ModPerks.REGENERATION.get() || perk == ModPerks.POWERFUL_ATTRACTION.get() || perk == ModPerks.INTELLIGENT_CHIP.get(); + case DAMAGE -> perk == ModPerks.VOLT_OVERLOAD.get(); + }; + } + + @Override + public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { + return Optional.of(new EnergyImageComponent(pStack)); + } + + @Override + public boolean isMagazineReload(ItemStack stack) { + return true; + } + + @Override + public void fireOnPress(Player player) { + ItemStack stack = player.getMainHandItem(); + if (GunsTool.getGunBooleanTag(stack, "Reloading")) return; + + // TODO perk +// int perkLevel = PerkHelper.getItemPerkLevel(ModPerks.VOLT_OVERLOAD.get(), stack); + int perkLevel = 0; + var energyStorage = stack.getCapability(Capabilities.EnergyStorage.ITEM); + var hasEnoughEnergy = energyStorage != null && energyStorage.getEnergyStored() >= 400 + 100 * perkLevel; + + if (player.getCooldowns().isOnCooldown(stack.getItem()) + || GunsTool.getGunIntTag(stack, "Ammo", 0) <= 0 + || !hasEnoughEnergy + ) return; + + player.getCooldowns().addCooldown(stack.getItem(), 5); + + if (player instanceof ServerPlayer serverPlayer) { + var cap = player.getCapability(ModCapabilities.PLAYER_VARIABLE); + boolean zoom = cap != null && cap.zoom; + double spread = GunsTool.getGunDoubleTag(stack, "Spread"); + + // TODO perk +// int volt = PerkHelper.getItemPerkLevel(ModPerks.VOLT_OVERLOAD.get(), stack); +// int wireLength = PerkHelper.getItemPerkLevel(ModPerks.LONGER_WIRE.get(), stack); + int volt = 0; + int wireLength = 0; + + SoundTool.playLocalSound(serverPlayer, ModSounds.TASER_FIRE_1P.get(), 1, 1); + serverPlayer.level().playSound(null, serverPlayer.getOnPos(), ModSounds.TASER_FIRE_3P.get(), SoundSource.PLAYERS, 1, 1); + + var level = serverPlayer.level(); + + // TODO taser bullet +// TaserBulletEntity taserBulletProjectile = new TaserBulletEntity(player, level, +// (float) GunsTool.getGunDoubleTag(stack, "Damage", 0), volt, wireLength); +// +// taserBulletProjectile.setPos(player.getX(), player.getEyeY() - 0.1, player.getZ()); +// taserBulletProjectile.shoot(player.getLookAngle().x, player.getLookAngle().y, player.getLookAngle().z, (float) GunsTool.getGunDoubleTag(stack, "Velocity", 0), +// (float) (zoom ? 0.1 : spread)); +// level.addFreshEntity(taserBulletProjectile); +// +// ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> serverPlayer), new ShootClientMessage(10)); + } + + GunsTool.setGunIntTag(stack, "Ammo", GunsTool.getGunIntTag(stack, "Ammo", 0) - 1); + energyStorage.extractEnergy(400 + 100 * perkLevel, false); + NBTTool.getOrCreateTag(stack).putBoolean("shoot", true); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/ShakeClientMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/ShakeClientMessage.java index aa58ceece..3c6559b07 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/ShakeClientMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/ShakeClientMessage.java @@ -71,7 +71,7 @@ public record ShakeClientMessage( ItemStack stack = living.getMainHandItem(); // if (level != null && -// (stack.is(ModItems.MONITOR.get()) && stack.getOrCreateTag().getBoolean("Using") && stack.getOrCreateTag().getBoolean("Linked"))) { +// (stack.is(ModItems.MONITOR.get()) && NBTTool.getOrCreateTag(stack).getBoolean("Using") && NBTTool.getOrCreateTag(stack).getBoolean("Linked"))) { // handleDroneCamera(event, living); // } else { // var effect = Minecraft.getInstance().gameRenderer.currentEffect(); diff --git a/src/main/java/com/atsuishio/superbwarfare/procedures/WelcomeProcedure.java b/src/main/java/com/atsuishio/superbwarfare/procedures/WelcomeProcedure.java index 2f45b0b81..94c0df8cf 100644 --- a/src/main/java/com/atsuishio/superbwarfare/procedures/WelcomeProcedure.java +++ b/src/main/java/com/atsuishio/superbwarfare/procedures/WelcomeProcedure.java @@ -31,7 +31,7 @@ public class WelcomeProcedure { Logger logger = null; if ((logger == null ? logger = ModUtils.LOGGER : LogManager.getLogger(ModUtils.class)) instanceof Logger) { { - Logger _lgr = ((Logger) (logger == null ? logger = ModUtils.LOGGER : LogManager.getLogger(ModUtils.class))); + Logger _lgr = logger == null ? logger = ModUtils.LOGGER : LogManager.getLogger(ModUtils.class); _lgr.info("This Mod used to be made by MCreator!"); } }