diff --git a/src/main/java/com/sekwah/narutomod/NarutoMod.java b/src/main/java/com/sekwah/narutomod/NarutoMod.java index cd36a454..71d419b2 100644 --- a/src/main/java/com/sekwah/narutomod/NarutoMod.java +++ b/src/main/java/com/sekwah/narutomod/NarutoMod.java @@ -9,7 +9,7 @@ import com.sekwah.narutomod.client.keybinds.NarutoKeyHandler; import com.sekwah.narutomod.client.renderer.NarutoRenderEvents; import com.sekwah.narutomod.commands.NarutoCommands; -import com.sekwah.narutomod.config.NarutoConfig; +import com.sekwah.narutomod.client.renderer.entity.config.NarutoConfig; import com.sekwah.narutomod.entity.NarutoDataSerialisers; import com.sekwah.narutomod.entity.NarutoEntities; import com.sekwah.narutomod.item.NarutoDispenseItemBehavior; diff --git a/src/main/java/com/sekwah/narutomod/abilities/Ability.java b/src/main/java/com/sekwah/narutomod/abilities/Ability.java index 83573e73..ffc9ced1 100644 --- a/src/main/java/com/sekwah/narutomod/abilities/Ability.java +++ b/src/main/java/com/sekwah/narutomod/abilities/Ability.java @@ -141,6 +141,14 @@ default boolean useChargedMessages() { return false; } + /** + * In case of other use cases where you don't want the messages. for custom states e.g. substitution. + * @return + */ + default boolean hideChannelMessages() { + return false; + } + /** * Call every tick handleCost passes on server side. * diff --git a/src/main/java/com/sekwah/narutomod/abilities/NarutoAbilities.java b/src/main/java/com/sekwah/narutomod/abilities/NarutoAbilities.java index 14b1174d..2bf5d096 100644 --- a/src/main/java/com/sekwah/narutomod/abilities/NarutoAbilities.java +++ b/src/main/java/com/sekwah/narutomod/abilities/NarutoAbilities.java @@ -2,6 +2,7 @@ import com.sekwah.narutomod.NarutoMod; import com.sekwah.narutomod.abilities.jutsus.FireballJutsuAbility; +import com.sekwah.narutomod.abilities.jutsus.SubstitutionJutsuAbility; import com.sekwah.narutomod.abilities.jutsus.WaterBulletJutsuAbility; import com.sekwah.narutomod.abilities.utility.*; import com.sekwah.narutomod.network.PacketHandler; @@ -45,6 +46,8 @@ public class NarutoAbilities { public static final RegistryObject DOUBLE_JUMP = ABILITY.register("double_jump", DoubleJumpAbility::new); + public static final RegistryObject SUBSTITUTION = ABILITY.register("substitution", SubstitutionJutsuAbility::new); + public static void register(IEventBus eventBus) { ABILITY.register(eventBus); } diff --git a/src/main/java/com/sekwah/narutomod/abilities/jutsus/SubstitutionJutsuAbility.java b/src/main/java/com/sekwah/narutomod/abilities/jutsus/SubstitutionJutsuAbility.java new file mode 100644 index 00000000..5f7924ec --- /dev/null +++ b/src/main/java/com/sekwah/narutomod/abilities/jutsus/SubstitutionJutsuAbility.java @@ -0,0 +1,49 @@ +package com.sekwah.narutomod.abilities.jutsus; + +import com.sekwah.narutomod.abilities.Ability; +import com.sekwah.narutomod.capabilities.INinjaData; +import com.sekwah.narutomod.sounds.NarutoSounds; +import com.sekwah.sekclib.player.PlayerUtil; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; + +public class SubstitutionJutsuAbility extends Ability implements Ability.Channeled { + @Override + public ActivationType activationType() { + return ActivationType.CHANNELED; + } + + @Override + public long defaultCombo() { + return 12; + } + + @Override + public boolean handleCost(Player player, INinjaData ninjaData, int chargeAmount) { + return true; + } + + /** + * Due to the nature of this ability all costs and other things will be handled here. + */ + @Override + public void performServer(Player player, INinjaData ninjaData, int ticksActive) { + if(ticksActive == 0) { + player.displayClientMessage(new TranslatableComponent("jutsu.cast.substitution"), false); + // Activate + ninjaData.useSubstitution(1); + } else { + player.displayClientMessage(new TranslatableComponent("jutsu.cast.substitution_mark"), false); + // Mark + } + } + + @Override + public boolean hideChannelMessages() { + return true; + } +} diff --git a/src/main/java/com/sekwah/narutomod/capabilities/NinjaData.java b/src/main/java/com/sekwah/narutomod/capabilities/NinjaData.java index b722ebf7..af340df4 100644 --- a/src/main/java/com/sekwah/narutomod/capabilities/NinjaData.java +++ b/src/main/java/com/sekwah/narutomod/capabilities/NinjaData.java @@ -4,7 +4,7 @@ import com.sekwah.narutomod.abilities.Ability; import com.sekwah.narutomod.abilities.NarutoAbilities; import com.sekwah.narutomod.capabilities.toggleabilitydata.ToggleAbilityData; -import com.sekwah.narutomod.config.NarutoConfig; +import com.sekwah.narutomod.client.renderer.entity.config.NarutoConfig; import com.sekwah.sekclib.capabilitysync.capabilitysync.annotation.Sync; import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; @@ -208,10 +208,13 @@ public void setCurrentlyChanneledAbility(Player player, Ability ability) { if (ability.castingSound() != null) { player.getLevel().playSound(null, player, ability.castingSound(), SoundSource.PLAYERS, 0.5f, 1.0f); } - if (ability instanceof Ability.Channeled channeled && channeled.useChargedMessages()) { - player.sendMessage(new TranslatableComponent("jutsu.charge.start", new TranslatableComponent(ability.getTranslationKey()).withStyle(ChatFormatting.YELLOW)).withStyle(ChatFormatting.GREEN), player.getUUID()); - } else { - player.sendMessage(new TranslatableComponent("jutsu.channel.start", new TranslatableComponent(ability.getTranslationKey()).withStyle(ChatFormatting.YELLOW)).withStyle(ChatFormatting.GREEN), player.getUUID()); + + if(!(ability instanceof Ability.Channeled channeled && channeled.hideChannelMessages())) { + if (ability instanceof Ability.Channeled channeled && channeled.useChargedMessages()) { + player.sendMessage(new TranslatableComponent("jutsu.charge.start", new TranslatableComponent(ability.getTranslationKey()).withStyle(ChatFormatting.YELLOW)).withStyle(ChatFormatting.GREEN), player.getUUID()); + } else { + player.sendMessage(new TranslatableComponent("jutsu.channel.start", new TranslatableComponent(ability.getTranslationKey()).withStyle(ChatFormatting.YELLOW)).withStyle(ChatFormatting.GREEN), player.getUUID()); + } } this.currentlyChanneled = ability.getRegistryName(); @@ -219,10 +222,12 @@ public void setCurrentlyChanneledAbility(Player player, Ability ability) { if (this.currentlyChanneled != null) { Ability currentAbility = NarutoAbilities.ABILITY_REGISTRY.getValue(this.currentlyChanneled); if( currentAbility != null) { - if (currentAbility instanceof Ability.Channeled channeled && channeled.useChargedMessages()) { - player.sendMessage(new TranslatableComponent("jutsu.cast", new TranslatableComponent(currentAbility.getTranslationKey()).withStyle(ChatFormatting.YELLOW)).withStyle(ChatFormatting.GREEN), player.getUUID()); - } else { - player.sendMessage(new TranslatableComponent("jutsu.channel.stop", new TranslatableComponent(currentAbility.getTranslationKey()).withStyle(ChatFormatting.YELLOW)).withStyle(ChatFormatting.RED), player.getUUID()); + if(!(currentAbility instanceof Ability.Channeled channeled && channeled.hideChannelMessages())) { + if (currentAbility instanceof Ability.Channeled channeled && channeled.useChargedMessages()) { + player.sendMessage(new TranslatableComponent("jutsu.cast", new TranslatableComponent(currentAbility.getTranslationKey()).withStyle(ChatFormatting.YELLOW)).withStyle(ChatFormatting.GREEN), player.getUUID()); + } else { + player.sendMessage(new TranslatableComponent("jutsu.channel.stop", new TranslatableComponent(currentAbility.getTranslationKey()).withStyle(ChatFormatting.YELLOW)).withStyle(ChatFormatting.RED), player.getUUID()); + } } } } diff --git a/src/main/java/com/sekwah/narutomod/capabilities/lingerabilitydata/LingerAbilityData.java b/src/main/java/com/sekwah/narutomod/capabilities/lingerabilitydata/LingerAbilityData.java new file mode 100644 index 00000000..8247d639 --- /dev/null +++ b/src/main/java/com/sekwah/narutomod/capabilities/lingerabilitydata/LingerAbilityData.java @@ -0,0 +1,72 @@ +package com.sekwah.narutomod.capabilities.lingerabilitydata; + +import com.sekwah.narutomod.abilities.Ability; +import com.sekwah.narutomod.capabilities.INinjaData; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; + +import java.util.HashSet; +import java.util.Objects; + +/** + * Tracks ability references and other information for the server side. + * + * On client side the ticks tracked will be since the client knows the ability is active. + * Do not use it for reliable triggering for effects or behavior when the user is not the player itssself. + * + * Try to keep as much behavior solely to server side as you can. + */ +public class LingerAbilityData { + + private HashSet abilities; + + public LingerAbilityData(int size) { + this.abilities = new HashSet<>(size); + } + + public LingerAbilityData() { + this.abilities = new HashSet<>(); + } + + public boolean addAbility(ResourceLocation ability) { + return this.abilities.add(ability); + } + + public boolean addAbilityStarted(Player player, INinjaData ninjaData, Ability ability) { + if (ability.activationType() == Ability.ActivationType.TOGGLE && ability.logInChat()) { + player.sendMessage(new TranslatableComponent("jutsu.toggle.enabled", new TranslatableComponent(ability.getTranslationKey()).withStyle(ChatFormatting.YELLOW)).withStyle(ChatFormatting.GREEN), player.getUUID()); + } + return this.addAbility(ability.getRegistryName()); + } + + public boolean removeAbilityEnded(Player player, INinjaData ninjaData, Ability ability) { + if(ability instanceof Ability.HandleEnded endedAbility) endedAbility.handleAbilityEnded(player, ninjaData, 0); + if (ability.activationType() == Ability.ActivationType.TOGGLE && ability.logInChat()) { + player.sendMessage(new TranslatableComponent("jutsu.toggle.disabled", new TranslatableComponent(ability.getTranslationKey()).withStyle(ChatFormatting.YELLOW)).withStyle(ChatFormatting.RED), player.getUUID()); + } + return this.removeAbility(ability.getRegistryName()); + } + + public boolean removeAbility(ResourceLocation ability) { + return this.abilities.remove(ability); + } + + public HashSet getAbilitiesHashSet() { + return abilities; + } + + @Override + public int hashCode() { + return Objects.hash(abilities); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof LingerAbilityData)) return false; + LingerAbilityData that = (LingerAbilityData) o; + return abilities.equals(that.abilities); + } +} diff --git a/src/main/java/com/sekwah/narutomod/client/gui/ChakraAndStaminaGUI.java b/src/main/java/com/sekwah/narutomod/client/gui/ChakraAndStaminaGUI.java index ee45cad1..c23aacd3 100644 --- a/src/main/java/com/sekwah/narutomod/client/gui/ChakraAndStaminaGUI.java +++ b/src/main/java/com/sekwah/narutomod/client/gui/ChakraAndStaminaGUI.java @@ -2,15 +2,13 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import com.sekwah.narutomod.NarutoMod; import com.sekwah.narutomod.capabilities.NinjaCapabilityHandler; -import com.sekwah.narutomod.config.NarutoConfig; +import com.sekwah.narutomod.client.renderer.entity.config.NarutoConfig; import com.sekwah.narutomod.util.ColorUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import java.awt.*; diff --git a/src/main/java/com/sekwah/narutomod/client/gui/SubstitutionGUI.java b/src/main/java/com/sekwah/narutomod/client/gui/SubstitutionGUI.java index e9c57c3d..9f54648c 100644 --- a/src/main/java/com/sekwah/narutomod/client/gui/SubstitutionGUI.java +++ b/src/main/java/com/sekwah/narutomod/client/gui/SubstitutionGUI.java @@ -4,7 +4,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.sekwah.narutomod.NarutoMod; import com.sekwah.narutomod.capabilities.NinjaCapabilityHandler; -import com.sekwah.narutomod.config.NarutoConfig; import com.sekwah.narutomod.util.ColorUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; diff --git a/src/main/java/com/sekwah/narutomod/client/keybinds/NarutoKeyHandler.java b/src/main/java/com/sekwah/narutomod/client/keybinds/NarutoKeyHandler.java index 2531c82e..789beb57 100644 --- a/src/main/java/com/sekwah/narutomod/client/keybinds/NarutoKeyHandler.java +++ b/src/main/java/com/sekwah/narutomod/client/keybinds/NarutoKeyHandler.java @@ -3,7 +3,7 @@ import com.sekwah.narutomod.NarutoMod; import com.sekwah.narutomod.abilities.Ability; import com.sekwah.narutomod.abilities.NarutoAbilities; -import com.sekwah.narutomod.config.NarutoConfig; +import com.sekwah.narutomod.client.renderer.entity.config.NarutoConfig; import com.sekwah.narutomod.network.PacketHandler; import com.sekwah.narutomod.network.c2s.ServerAbilityChannelPacket; import com.sekwah.narutomod.network.c2s.ServerJutsuCastingPacket; diff --git a/src/main/java/com/sekwah/narutomod/client/renderer/NarutoRenderEvents.java b/src/main/java/com/sekwah/narutomod/client/renderer/NarutoRenderEvents.java index dd6e195a..d0559c48 100644 --- a/src/main/java/com/sekwah/narutomod/client/renderer/NarutoRenderEvents.java +++ b/src/main/java/com/sekwah/narutomod/client/renderer/NarutoRenderEvents.java @@ -9,15 +9,18 @@ import com.sekwah.narutomod.client.model.item.model.HeadbandModel; import com.sekwah.narutomod.client.renderer.entity.jutsuprojectile.FireballJutsuRenderer; import com.sekwah.narutomod.client.renderer.entity.jutsuprojectile.WaterBulletJutsuRenderer; +import com.sekwah.narutomod.client.renderer.worldinfo.SubstitutionWorldMarkerRenderer; import com.sekwah.narutomod.entity.NarutoEntities; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.RegisterClientReloadListenersEvent; +import net.minecraftforge.client.event.RenderLevelLastEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; diff --git a/src/main/java/com/sekwah/narutomod/config/NarutoConfig.java b/src/main/java/com/sekwah/narutomod/client/renderer/entity/config/NarutoConfig.java similarity index 99% rename from src/main/java/com/sekwah/narutomod/config/NarutoConfig.java rename to src/main/java/com/sekwah/narutomod/client/renderer/entity/config/NarutoConfig.java index eed4cd5c..50339fae 100644 --- a/src/main/java/com/sekwah/narutomod/config/NarutoConfig.java +++ b/src/main/java/com/sekwah/narutomod/client/renderer/entity/config/NarutoConfig.java @@ -1,4 +1,4 @@ -package com.sekwah.narutomod.config; +package com.sekwah.narutomod.client.renderer.entity.config; import com.sekwah.narutomod.NarutoMod; import com.sekwah.narutomod.client.gui.BarDesigns; diff --git a/src/main/java/com/sekwah/narutomod/client/renderer/worldinfo/SubstitutionWorldMarkerRenderer.java b/src/main/java/com/sekwah/narutomod/client/renderer/worldinfo/SubstitutionWorldMarkerRenderer.java new file mode 100644 index 00000000..ab1f83f2 --- /dev/null +++ b/src/main/java/com/sekwah/narutomod/client/renderer/worldinfo/SubstitutionWorldMarkerRenderer.java @@ -0,0 +1,7 @@ +package com.sekwah.narutomod.client.renderer.worldinfo; + +public class SubstitutionWorldMarkerRenderer { + public static void render() { + + } +} diff --git a/src/main/java/com/sekwah/narutomod/datagen/RecipeGen.java b/src/main/java/com/sekwah/narutomod/datagen/RecipeGen.java index 653b4eaf..33aa6dbe 100644 --- a/src/main/java/com/sekwah/narutomod/datagen/RecipeGen.java +++ b/src/main/java/com/sekwah/narutomod/datagen/RecipeGen.java @@ -3,10 +3,7 @@ import com.sekwah.narutomod.block.NarutoBlocks; import com.sekwah.narutomod.item.NarutoItems; import net.minecraft.data.DataGenerator; -import net.minecraft.data.recipes.FinishedRecipe; -import net.minecraft.data.recipes.RecipeProvider; -import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.data.recipes.ShapelessRecipeBuilder; +import net.minecraft.data.recipes.*; import net.minecraft.world.item.Items; import java.util.function.Consumer; @@ -110,6 +107,5 @@ protected void buildCraftingRecipes(Consumer recipeConsumer) { .unlockedBy("has_gunpowder", has(Items.GUNPOWDER)) .save(recipeConsumer); - } } diff --git a/src/main/java/com/sekwah/narutomod/entity/item/PaperBombEntity.java b/src/main/java/com/sekwah/narutomod/entity/item/PaperBombEntity.java index a9c72eca..d41db999 100644 --- a/src/main/java/com/sekwah/narutomod/entity/item/PaperBombEntity.java +++ b/src/main/java/com/sekwah/narutomod/entity/item/PaperBombEntity.java @@ -1,7 +1,7 @@ package com.sekwah.narutomod.entity.item; import com.sekwah.narutomod.block.NarutoBlocks; -import com.sekwah.narutomod.config.NarutoConfig; +import com.sekwah.narutomod.client.renderer.entity.config.NarutoConfig; import com.sekwah.narutomod.entity.NarutoDataSerialisers; import com.sekwah.narutomod.entity.NarutoEntities; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/sekwah/narutomod/entity/projectile/ExplosiveKunaiEntity.java b/src/main/java/com/sekwah/narutomod/entity/projectile/ExplosiveKunaiEntity.java index a0517838..3ce9ac28 100644 --- a/src/main/java/com/sekwah/narutomod/entity/projectile/ExplosiveKunaiEntity.java +++ b/src/main/java/com/sekwah/narutomod/entity/projectile/ExplosiveKunaiEntity.java @@ -1,6 +1,6 @@ package com.sekwah.narutomod.entity.projectile; -import com.sekwah.narutomod.config.NarutoConfig; +import com.sekwah.narutomod.client.renderer.entity.config.NarutoConfig; import com.sekwah.narutomod.entity.NarutoEntities; import com.sekwah.narutomod.item.NarutoItems; import com.sekwah.narutomod.sounds.NarutoSounds; diff --git a/src/main/java/com/sekwah/narutomod/network/c2s/ServerAbilityChannelPacket.java b/src/main/java/com/sekwah/narutomod/network/c2s/ServerAbilityChannelPacket.java index 3141b50d..6e088083 100644 --- a/src/main/java/com/sekwah/narutomod/network/c2s/ServerAbilityChannelPacket.java +++ b/src/main/java/com/sekwah/narutomod/network/c2s/ServerAbilityChannelPacket.java @@ -70,6 +70,7 @@ public static void handle(ServerAbilityChannelPacket msg, Supplier