This commit is contained in:
Jenny committed 2025-02-06 07:30:17 +01:00
commit 3cfed03bcd
36 files changed
+1338

No files matched your search

@@ -0,0 +1,54 @@
package com.jenny.advancedarrows;
import com.jenny.advancedarrows.config.*;
import com.jenny.advancedarrows.entities.entities;
import com.jenny.advancedarrows.items.items;
import com.mojang.logging.LogUtils;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.server.ServerStartingEvent;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.config.ModConfig;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.slf4j.Logger;
// The value here should match an entry in the META-INF/mods.toml file
@Mod(advancedArrows.MODID)
public class advancedArrows {
public static final String MODID = "advancedarrows";
private static final Logger LOGGER = LogUtils.getLogger();
public advancedArrows() {
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
modEventBus.addListener(this::commonSetup);
items.register(modEventBus);
creativeTab.register(modEventBus);
entities.register(modEventBus);
MinecraftForge.EVENT_BUS.register(this);
ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, ConfigClient.SPEC);
}
private void commonSetup(final FMLCommonSetupEvent event) {}
@SubscribeEvent
public void onServerStarting(ServerStartingEvent event) {}
@Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
public static class ClientModEvents {
@SubscribeEvent
public static void onClientSetup(FMLClientSetupEvent event) {
entities.registerRenderers();
}
}
}
@@ -0,0 +1,31 @@
package com.jenny.advancedarrows.config;
import net.minecraftforge.common.ForgeConfigSpec;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.config.ModConfigEvent;
import static com.jenny.advancedarrows.advancedArrows.MODID;
@Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class ConfigClient {
private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder();
private static final ForgeConfigSpec.ConfigValue<Double> C_PARTICLE_PERCENT =
BUILDER.comment("amount of particles to spawn (0.0 = None, 1.0 = normal, values higher are valid too)")
.define("arrowParticleCount", 1.0D);
public static final ForgeConfigSpec SPEC = BUILDER.build();
public static float particlePercent;
@SubscribeEvent
static void onLoad(final ModConfigEvent event)
{
particlePercent = C_PARTICLE_PERCENT.get().floatValue();
}
public static int calcPCount(int pCount) {
return Math.round(pCount * particlePercent);
}
}
@@ -0,0 +1,38 @@
package com.jenny.advancedarrows;
import com.jenny.advancedarrows.items.items;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.CreativeModeTabs;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.RegistryObject;
import java.util.Arrays;
import static com.jenny.advancedarrows.advancedArrows.MODID;
public class creativeTab {
public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MODID);
public static final RegistryObject<CreativeModeTab> CREATIVE_TAB = CREATIVE_MODE_TABS.register("advanced_arrows", () -> CreativeModeTab.builder().withTabsBefore(CreativeModeTabs.COMBAT).icon(() -> items.ARROW_INCENDIARY.get().getDefaultInstance()).displayItems((parameters, output) -> {
output.acceptAll(Arrays.stream(getItems()).toList());
}).title(Component.literal("Advanced Arrows")).build());
public static void register(IEventBus bus) {
CREATIVE_MODE_TABS.register(bus);
}
public static ItemStack[] getItems() {
ItemStack[] ret = new ItemStack[items.ITEMS.getEntries().size()];
int i = 0;
for (RegistryObject<Item> item : items.ITEMS.getEntries()) {
ret[i] = item.get().getDefaultInstance();
i++;
}
return ret;
}
}
@@ -0,0 +1,27 @@
package com.jenny.advancedarrows.datagen;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.PackOutput;
import net.minecraftforge.common.data.ExistingFileHelper;
import net.minecraftforge.data.event.GatherDataEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.CompletableFuture;
import static com.jenny.advancedarrows.advancedArrows.MODID;
@Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class DataGenerators {
@SubscribeEvent
public static void gatherData(@NotNull GatherDataEvent event) {
DataGenerator generator = event.getGenerator();
PackOutput packOutput = generator.getPackOutput();
ExistingFileHelper existingFileHelper = event.getExistingFileHelper();
CompletableFuture<HolderLookup.Provider> lookupProvider = event.getLookupProvider();
generator.addProvider(event.includeClient(), new ModItemModelProvider(packOutput, existingFileHelper));
}
}
@@ -0,0 +1,31 @@
package com.jenny.advancedarrows.datagen;
import com.jenny.advancedarrows.items.items;
import net.minecraft.data.PackOutput;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.minecraftforge.client.model.generators.ItemModelBuilder;
import net.minecraftforge.client.model.generators.ItemModelProvider;
import net.minecraftforge.common.data.ExistingFileHelper;
import net.minecraftforge.registries.RegistryObject;
import static com.jenny.advancedarrows.advancedArrows.MODID;
public class ModItemModelProvider extends ItemModelProvider {
public ModItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) {
super(output, MODID, existingFileHelper);
}
@Override
protected void registerModels() {
for (RegistryObject<Item> item : items.ITEMS.getEntries()) {
simpleItem(item);
}
}
private ItemModelBuilder simpleItem(RegistryObject<Item> item) {
return withExistingParent(item.getId().getPath(),
new ResourceLocation("item/generated")).texture("layer0",
new ResourceLocation(MODID,"item/" + item.getId().getPath()));
}
}
@@ -0,0 +1,257 @@
package com.jenny.advancedarrows.entities;
import com.google.common.collect.Sets;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.entity.projectile.Arrow;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.alchemy.Potion;
import net.minecraft.world.item.alchemy.PotionUtils;
import net.minecraft.world.item.alchemy.Potions;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.Set;
public class baseArrow extends AbstractArrow {
private static final int EXPOSED_POTION_DECAY_TIME = 600;
private static final int NO_EFFECT_COLOR = -1;
private static final EntityDataAccessor<Integer> ID_EFFECT_COLOR = SynchedEntityData.defineId(Arrow.class, EntityDataSerializers.INT);
private static final byte EVENT_POTION_PUFF = 0;
private Potion potion = Potions.EMPTY;
private final Set<MobEffectInstance> effects = Sets.newHashSet();
private boolean fixedColor;
private int tick = 0;
public baseArrow(EntityType<? extends baseArrow> pEntityType, Level pLevel) {
super(pEntityType, pLevel);
}
public baseArrow(Level pLevel, double pX, double pY, double pZ, EntityType<? extends baseArrow> pEntityType) {
super(pEntityType, pX, pY, pZ, pLevel);
}
public baseArrow(Level pLevel, LivingEntity pShooter, EntityType<? extends baseArrow> pEntityType) {
super(pEntityType, pShooter, pLevel);
}
public void setEffectsFromItem(ItemStack pStack) {
if (pStack.is(Items.TIPPED_ARROW)) {
this.potion = PotionUtils.getPotion(pStack);
Collection<MobEffectInstance> collection = PotionUtils.getCustomEffects(pStack);
if (!collection.isEmpty()) {
for(MobEffectInstance mobeffectinstance : collection) {
this.effects.add(new MobEffectInstance(mobeffectinstance));
}
}
int i = getCustomColor(pStack);
if (i == -1) {
this.updateColor();
} else {
this.setFixedColor(i);
}
} else if (pStack.is(Items.ARROW)) {
this.potion = Potions.EMPTY;
this.effects.clear();
this.entityData.set(ID_EFFECT_COLOR, -1);
}
}
public static int getCustomColor(ItemStack pStack) {
CompoundTag compoundtag = pStack.getTag();
return compoundtag != null && compoundtag.contains("CustomPotionColor", 99) ? compoundtag.getInt("CustomPotionColor") : -1;
}
private void updateColor() {
this.fixedColor = false;
if (this.potion == Potions.EMPTY && this.effects.isEmpty()) {
this.entityData.set(ID_EFFECT_COLOR, -1);
} else {
this.entityData.set(ID_EFFECT_COLOR, PotionUtils.getColor(PotionUtils.getAllEffects(this.potion, this.effects)));
}
}
public void addEffect(MobEffectInstance pEffectInstance) {
this.effects.add(pEffectInstance);
this.getEntityData().set(ID_EFFECT_COLOR, PotionUtils.getColor(PotionUtils.getAllEffects(this.potion, this.effects)));
}
protected void defineSynchedData() {
super.defineSynchedData();
this.entityData.define(ID_EFFECT_COLOR, -1);
}
public void tick() {
super.tick();
if (this.level().isClientSide) {
if (this.inGround) {
if (this.inGroundTime % 5 == 0) {
this.makeParticle(1);
}
} else {
spawnParticles();
}
this.tick++;
} else if (this.inGround && this.inGroundTime != 0 && !this.effects.isEmpty() && this.inGroundTime >= 600) {
this.level().broadcastEntityEvent(this, (byte)0);
this.potion = Potions.EMPTY;
this.effects.clear();
this.entityData.set(ID_EFFECT_COLOR, -1);
}
}
private void makeParticle(int pParticleAmount) {
int i = this.getColor();
if (i != -1 && pParticleAmount > 0) {
double d0 = (double)(i >> 16 & 255) / 255.0D;
double d1 = (double)(i >> 8 & 255) / 255.0D;
double d2 = (double)(i >> 0 & 255) / 255.0D;
for(int j = 0; j < pParticleAmount; ++j) {
this.level().addParticle(ParticleTypes.ENTITY_EFFECT, this.getRandomX(0.5D), this.getRandomY(), this.getRandomZ(0.5D), d0, d1, d2);
}
}
}
public int getColor() {
return this.entityData.get(ID_EFFECT_COLOR);
}
private void setFixedColor(int pFixedColor) {
this.fixedColor = true;
this.entityData.set(ID_EFFECT_COLOR, pFixedColor);
}
public void addAdditionalSaveData(@NotNull CompoundTag pCompound) {
super.addAdditionalSaveData(pCompound);
if (this.potion != Potions.EMPTY) {
pCompound.putString("Potion", BuiltInRegistries.POTION.getKey(this.potion).toString());
}
if (this.fixedColor) {
pCompound.putInt("Color", this.getColor());
}
if (!this.effects.isEmpty()) {
ListTag listtag = new ListTag();
for(MobEffectInstance mobeffectinstance : this.effects) {
listtag.add(mobeffectinstance.save(new CompoundTag()));
}
pCompound.put("CustomPotionEffects", listtag);
}
}
public void readAdditionalSaveData(@NotNull CompoundTag pCompound) {
super.readAdditionalSaveData(pCompound);
if (pCompound.contains("Potion", 8)) {
this.potion = PotionUtils.getPotion(pCompound);
}
for(MobEffectInstance mobeffectinstance : PotionUtils.getCustomEffects(pCompound)) {
this.addEffect(mobeffectinstance);
}
if (pCompound.contains("Color", 99)) {
this.setFixedColor(pCompound.getInt("Color"));
} else {
this.updateColor();
}
}
protected void doPostHurtEffects(@NotNull LivingEntity pLiving) {
super.doPostHurtEffects(pLiving);
Entity entity = this.getEffectSource();
for(MobEffectInstance mobeffectinstance : this.potion.getEffects()) {
pLiving.addEffect(new MobEffectInstance(mobeffectinstance.getEffect(), Math.max(mobeffectinstance.mapDuration((p_268168_) -> {
return p_268168_ / 8;
}), 1), mobeffectinstance.getAmplifier(), mobeffectinstance.isAmbient(), mobeffectinstance.isVisible()), entity);
}
if (!this.effects.isEmpty()) {
for(MobEffectInstance mobeffectinstance1 : this.effects) {
pLiving.addEffect(mobeffectinstance1, entity);
}
}
}
@NotNull
protected ItemStack getPickupItem() {
if (this.effects.isEmpty() && this.potion == Potions.EMPTY) {
return new ItemStack(Items.ARROW);
} else {
ItemStack itemstack = new ItemStack(Items.TIPPED_ARROW);
PotionUtils.setPotion(itemstack, this.potion);
PotionUtils.setCustomEffects(itemstack, this.effects);
if (this.fixedColor) {
itemstack.getOrCreateTag().putInt("CustomPotionColor", this.getColor());
}
return itemstack;
}
}
public void handleEntityEvent(byte pId) {
if (pId == 0) {
int i = this.getColor();
if (i != -1) {
double d0 = (double)(i >> 16 & 255) / 255.0D;
double d1 = (double)(i >> 8 & 255) / 255.0D;
double d2 = (double)(i >> 0 & 255) / 255.0D;
for(int j = 0; j < 20; ++j) {
this.level().addParticle(ParticleTypes.ENTITY_EFFECT, this.getRandomX(0.5D), this.getRandomY(), this.getRandomZ(0.5D), d0, d1, d2);
}
}
} else {
super.handleEntityEvent(pId);
}
}
public Vec3 createParticlePos(float range) {
return new Vec3(
(double) level().getRandom().nextIntBetweenInclusive(-100, 100) / 100,
(double) level().getRandom().nextIntBetweenInclusive(-100, 100) / 100,
(double) level().getRandom().nextIntBetweenInclusive(-100, 100) / 100
).normalize().scale(range).add(position());
}
public Vec3 createParticlePos(Entity entity, float range) {
return new Vec3(
(double) level().getRandom().nextIntBetweenInclusive(-100, 100) / 100,
(double) level().getRandom().nextIntBetweenInclusive(-100, 100) / 100,
(double) level().getRandom().nextIntBetweenInclusive(-100, 100) / 100
).normalize().scale(range).add(entity.position());
}
public void spawnParticles() {
}
public int getTick() {
return this.tick;
}
}
@@ -0,0 +1,55 @@
package com.jenny.advancedarrows.entities;
import com.jenny.advancedarrows.config.ConfigClient;
import com.jenny.advancedarrows.items.items;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.EntityHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
public class breachingArrow extends baseArrow{
public breachingArrow(EntityType<breachingArrow> pEntityType, Level pLevel) {
super(pEntityType, pLevel);
}
public breachingArrow(Level pLevel, LivingEntity pShooter) {
super(pLevel, pShooter, entities.ARROW_BREACHING.get());
}
@Override
protected void onHit(@NotNull HitResult pResult) {
for (Entity entity : getEntities()) {
onHitEntity(new EntityHitResult(entity));
}
super.onHit(pResult);
}
protected List<Entity> getEntities() {
List<Entity> ret_list = new ArrayList<>();
Vec3 corner1 = position().subtract(4, 4, 4);
Vec3 corner2 = position().add(4, 4, 4);
AABB boundingBox = new AABB(corner1, corner2);
for (Entity entity : level().getEntitiesOfClass(LivingEntity.class, boundingBox)) {
if (entity.getBoundingBox().intersects(position(), position().add(getDeltaMovement().normalize().scale(10)))) {
ret_list.add(entity);
}
}
return ret_list;
}
@NotNull
protected ItemStack getPickupItem() {
return new ItemStack(items.ARROW_BREACHING.get());
}
}
@@ -0,0 +1,20 @@
package com.jenny.advancedarrows.entities.client;
import net.minecraft.client.renderer.entity.ArrowRenderer;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.projectile.AbstractArrow;
import org.jetbrains.annotations.NotNull;
import static net.minecraft.client.renderer.entity.TippableArrowRenderer.NORMAL_ARROW_LOCATION;
public class baseArrowRenderer extends ArrowRenderer<AbstractArrow> {
public baseArrowRenderer(EntityRendererProvider.Context pContext) {
super(pContext);
}
@NotNull
public ResourceLocation getTextureLocation(@NotNull AbstractArrow pEntity) {
return NORMAL_ARROW_LOCATION;
}
}
@@ -0,0 +1,59 @@
package com.jenny.advancedarrows.entities;
import com.jenny.advancedarrows.entities.client.*;
import net.minecraft.client.renderer.entity.EntityRenderers;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MobCategory;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
import static com.jenny.advancedarrows.advancedArrows.MODID;
public class entities {
private static int tr = 16;
private static float w = 0.5f;
private static float h = 0.5f;
public static final DeferredRegister<EntityType<?>> ENTITY_TYPES =
DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, MODID);
public static final RegistryObject<EntityType<incendiaryArrow>> ARROW_INCENDIARY =
ENTITY_TYPES.register("arrow_incendiary", () -> EntityType.Builder.<incendiaryArrow>of(incendiaryArrow::new, MobCategory.MISC)
.sized(w, h).fireImmune().clientTrackingRange(tr).build("arrow_incendiary"));
public static final RegistryObject<EntityType<ricochetArrow>> ARROW_RICOCHET =
ENTITY_TYPES.register("arrow_ricochet", () -> EntityType.Builder.<ricochetArrow>of(ricochetArrow::new, MobCategory.MISC)
.sized(w, h).fireImmune().clientTrackingRange(tr).build("arrow_ricochet"));
public static final RegistryObject<EntityType<kineticArrow>> ARROW_KINETIC =
ENTITY_TYPES.register("arrow_kinetic", () -> EntityType.Builder.<kineticArrow>of(kineticArrow::new, MobCategory.MISC)
.sized(w, h).fireImmune().clientTrackingRange(tr).build("arrow_kinetic"));
public static final RegistryObject<EntityType<sharpenedArrow>> ARROW_SHARPENED =
ENTITY_TYPES.register("arrow_sharpened", () -> EntityType.Builder.<sharpenedArrow>of(sharpenedArrow::new, MobCategory.MISC)
.sized(w, h).fireImmune().clientTrackingRange(tr).build("arrow_sharpened"));
public static final RegistryObject<EntityType<switchArrow>> ARROW_SWITCH =
ENTITY_TYPES.register("arrow_switch", () -> EntityType.Builder.<switchArrow>of(switchArrow::new, MobCategory.MISC)
.sized(w, h).fireImmune().clientTrackingRange(tr).build("arrow_switch"));
public static final RegistryObject<EntityType<breachingArrow>> ARROW_BREACHING =
ENTITY_TYPES.register("arrow_breaching", () -> EntityType.Builder.<breachingArrow>of(breachingArrow::new, MobCategory.MISC)
.sized(w, h).fireImmune().clientTrackingRange(tr).build("arrow_breaching"));
public static void register(IEventBus eventBus) {
ENTITY_TYPES.register(eventBus);
}
public static void registerRenderers () {
EntityRenderers.register(ARROW_INCENDIARY.get(), baseArrowRenderer::new);
EntityRenderers.register(ARROW_RICOCHET.get(), baseArrowRenderer::new);
EntityRenderers.register(ARROW_KINETIC.get(), baseArrowRenderer::new);
EntityRenderers.register(ARROW_SHARPENED.get(), baseArrowRenderer::new);
EntityRenderers.register(ARROW_SWITCH.get(), baseArrowRenderer::new);
EntityRenderers.register(ARROW_BREACHING.get(), baseArrowRenderer::new);
}
}
@@ -0,0 +1,42 @@
package com.jenny.advancedarrows.entities;
import com.jenny.advancedarrows.config.ConfigClient;
import com.jenny.advancedarrows.items.items;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
public class incendiaryArrow extends baseArrow{
public incendiaryArrow(EntityType<incendiaryArrow> pEntityType, Level pLevel) {
super(pEntityType, pLevel);
}
public incendiaryArrow(Level pLevel, LivingEntity pShooter) {
super(pLevel, pShooter, entities.ARROW_INCENDIARY.get());
}
@Override
protected void doPostHurtEffects(@NotNull LivingEntity pTarget) {
pTarget.setSecondsOnFire(5);
}
@NotNull
protected ItemStack getPickupItem() {
return new ItemStack(items.ARROW_INCENDIARY.get());
}
@Override
public void spawnParticles() {
for (int i = 1; i <= ConfigClient.calcPCount(5); i++) {
double m = (double) level().getRandom().nextIntBetweenInclusive(- 100, 100) / 100;
Vec3 DeltaMovement = getDeltaMovement();
Vec3 pos = createParticlePos(1f);
level().addParticle(ParticleTypes.FLAME, pos.x, pos.y, pos.z, DeltaMovement.x, DeltaMovement.y, DeltaMovement.z);
}
}
}
@@ -0,0 +1,48 @@
package com.jenny.advancedarrows.entities;
import com.jenny.advancedarrows.config.ConfigClient;
import com.jenny.advancedarrows.items.items;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.EntityHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
public class kineticArrow extends baseArrow{
public kineticArrow(EntityType<kineticArrow> pEntityType, Level pLevel) {
super(pEntityType, pLevel);
}
public kineticArrow(Level pLevel, LivingEntity pShooter) {
super(pLevel, pShooter, entities.ARROW_KINETIC.get());
}
@Override
protected void onHitEntity(@NotNull EntityHitResult pTarget) {
super.onHitEntity(pTarget);
Entity target = pTarget.getEntity();
target.addDeltaMovement(getDeltaMovement().multiply(1.5, 0.2, 1.5));
}
@NotNull
protected ItemStack getPickupItem() {
return new ItemStack(items.ARROW_KINETIC.get());
}
@Override
public void spawnParticles() {
for (int i = 1; i <= ConfigClient.calcPCount(5); i++) {
Vec3 pos = createParticlePos(1f);
level().addParticle(ParticleTypes.ELECTRIC_SPARK, pos.x, pos.y, pos.z, 0, 0, 0);
}
}
}
@@ -0,0 +1,44 @@
package com.jenny.advancedarrows.entities;
import com.jenny.advancedarrows.items.items;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
public class ricochetArrow extends baseArrow{
public ricochetArrow(EntityType<ricochetArrow> pEntityType, Level pLevel) {
super(pEntityType, pLevel);
}
public ricochetArrow(Level pLevel, LivingEntity pShooter) {
super(pLevel, pShooter, entities.ARROW_RICOCHET.get());
}
@Override
public void tick() {
Vec3 pos = position();
Vec3 delta = getDeltaMovement();
super.tick();
if (this.inGround && !level().isClientSide) {
if (delta.length() > 0.5) {
//setOnGround(false);
setPos(pos);
setDeltaMovement(delta.scale(-7).multiply(
(double) level().random.nextIntBetweenInclusive(90, 100) / 100,
(double) level().random.nextIntBetweenInclusive(90, 100) / 100,
(double) level().random.nextIntBetweenInclusive(90, 100) / 100));
}
}
}
@NotNull
protected ItemStack getPickupItem() {
return new ItemStack(items.ARROW_RICOCHET.get());
}
}
@@ -0,0 +1,57 @@
package com.jenny.advancedarrows.entities;
import com.jenny.advancedarrows.config.ConfigClient;
import com.jenny.advancedarrows.items.items;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.EntityHitResult;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
public class sharpenedArrow extends baseArrow{
public sharpenedArrow(EntityType<sharpenedArrow> pEntityType, Level pLevel) {
super(pEntityType, pLevel);
}
public sharpenedArrow(Level pLevel, LivingEntity pShooter) {
super(pLevel, pShooter, entities.ARROW_SHARPENED.get());
}
@Override
protected void onHitEntity(@NotNull EntityHitResult pTarget) {
super.onHitEntity(pTarget);
System.out.println("a");
Entity entity1 = this.getOwner();
Entity target = pTarget.getEntity();
DamageSource damagesource;
if (entity1 == null) {
damagesource = this.damageSources().arrow(this, this);
} else {
damagesource = this.damageSources().arrow(this, entity1);
if (entity1 instanceof LivingEntity) {
((LivingEntity)entity1).setLastHurtMob(target);
}
}
target.hurt(damagesource, 5);
}
@NotNull
protected ItemStack getPickupItem() {
return new ItemStack(items.ARROW_SHARPENED.get());
}
@Override
public void spawnParticles() {
for (int i = 1; i <= ConfigClient.calcPCount(5); i++) {
Vec3 pos = createParticlePos(1f);
level().addParticle(ParticleTypes.END_ROD, pos.x, pos.y, pos.z, 0, 0, 0);
}
}
}
@@ -0,0 +1,55 @@
package com.jenny.advancedarrows.entities;
import com.jenny.advancedarrows.config.ConfigClient;
import com.jenny.advancedarrows.items.items;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.EntityHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
public class switchArrow extends baseArrow{
public switchArrow(EntityType<switchArrow> pEntityType, Level pLevel) {
super(pEntityType, pLevel);
}
public switchArrow(Level pLevel, LivingEntity pShooter) {
super(pLevel, pShooter, entities.ARROW_SWITCH.get());
}
@Override
protected void onHitEntity(@NotNull EntityHitResult pTarget) {
super.onHitEntity(pTarget);
Entity owner = this.getOwner();
if (owner != null) {
Vec3 targetPos = owner.position();
Vec3 ownerPos = pTarget.getEntity().position();
pTarget.getEntity().setPos(targetPos);
//owner.setPos(ownerPos) doesn't work somehow, idk why
level().getPlayerByUUID(owner.getUUID()).teleportTo(ownerPos.x, ownerPos.y, ownerPos.z);
}
}
@NotNull
protected ItemStack getPickupItem() {
return new ItemStack(items.ARROW_SWITCH.get());
}
@Override
public void spawnParticles() {
for (int i = 1; i <= ConfigClient.calcPCount(5); i++) {
Vec3 pos = createParticlePos(1f);
level().addParticle(ParticleTypes.GLOW, pos.x, pos.y, pos.z, 0, 0, 0);
}
}
}
@@ -0,0 +1,37 @@
package com.jenny.advancedarrows.items;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.item.ArrowItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import static com.jenny.advancedarrows.advancedArrows.MODID;
public abstract class ArrowAbstract extends ArrowItem {
public ArrowAbstract(Properties properties){
super(properties);
}
@Override
public void appendHoverText(@NotNull ItemStack pStack, @Nullable Level pLevel, @NotNull List<Component> pTooltipComponents, @NotNull TooltipFlag pIsAdvanced) {
String key = String.format("tooltip.%s.%s", MODID, this);
MutableComponent toolTip = Component.translatable(key);
if (!toolTip.getString().equals(key)) {
pTooltipComponents.add(toolTip.withStyle(ChatFormatting.DARK_BLUE));
super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced);
}
}
@Override
@NotNull
public abstract AbstractArrow createArrow(@NotNull Level pLevel, @NotNull ItemStack pStack, @NotNull LivingEntity pShooter);
}
@@ -0,0 +1,21 @@
package com.jenny.advancedarrows.items;
import com.jenny.advancedarrows.entities.breachingArrow;
import com.jenny.advancedarrows.entities.switchArrow;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
public class ArrowBreaching extends ArrowAbstract {
public ArrowBreaching(Properties properties){
super(properties);
}
@Override
@NotNull
public AbstractArrow createArrow(@NotNull Level pLevel, @NotNull ItemStack pStack, @NotNull LivingEntity pShooter) {
return new breachingArrow(pLevel, pShooter);
}
}
@@ -0,0 +1,21 @@
package com.jenny.advancedarrows.items;
import com.jenny.advancedarrows.entities.incendiaryArrow;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
public class ArrowIncendiary extends ArrowAbstract {
public ArrowIncendiary(Properties properties){
super(properties);
}
@Override
@NotNull
public AbstractArrow createArrow(@NotNull Level pLevel, @NotNull ItemStack pStack, @NotNull LivingEntity pShooter) {
return new incendiaryArrow(pLevel, pShooter);
}
}
@@ -0,0 +1,21 @@
package com.jenny.advancedarrows.items;
import com.jenny.advancedarrows.entities.incendiaryArrow;
import com.jenny.advancedarrows.entities.kineticArrow;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
public class ArrowKinetic extends ArrowAbstract {
public ArrowKinetic(Properties properties){
super(properties);
}
@Override
@NotNull
public AbstractArrow createArrow(@NotNull Level pLevel, @NotNull ItemStack pStack, @NotNull LivingEntity pShooter) {
return new kineticArrow(pLevel, pShooter);
}
}
@@ -0,0 +1,21 @@
package com.jenny.advancedarrows.items;
import com.jenny.advancedarrows.entities.incendiaryArrow;
import com.jenny.advancedarrows.entities.ricochetArrow;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
public class ArrowRicochet extends ArrowAbstract {
public ArrowRicochet(Properties properties){
super(properties);
}
@Override
@NotNull
public AbstractArrow createArrow(@NotNull Level pLevel, @NotNull ItemStack pStack, @NotNull LivingEntity pShooter) {
return new ricochetArrow(pLevel, pShooter);
}
}
@@ -0,0 +1,21 @@
package com.jenny.advancedarrows.items;
import com.jenny.advancedarrows.entities.ricochetArrow;
import com.jenny.advancedarrows.entities.sharpenedArrow;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
public class ArrowSharpened extends ArrowAbstract {
public ArrowSharpened(Properties properties){
super(properties);
}
@Override
@NotNull
public AbstractArrow createArrow(@NotNull Level pLevel, @NotNull ItemStack pStack, @NotNull LivingEntity pShooter) {
return new sharpenedArrow(pLevel, pShooter);
}
}
@@ -0,0 +1,21 @@
package com.jenny.advancedarrows.items;
import com.jenny.advancedarrows.entities.sharpenedArrow;
import com.jenny.advancedarrows.entities.switchArrow;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
public class ArrowSwitch extends ArrowAbstract {
public ArrowSwitch(Properties properties){
super(properties);
}
@Override
@NotNull
public AbstractArrow createArrow(@NotNull Level pLevel, @NotNull ItemStack pStack, @NotNull LivingEntity pShooter) {
return new switchArrow(pLevel, pShooter);
}
}
@@ -0,0 +1,25 @@
package com.jenny.advancedarrows.items;
import net.minecraft.world.item.Item;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
import static com.jenny.advancedarrows.advancedArrows.MODID;
public class items {
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID);
public static final RegistryObject<Item> ARROW_INCENDIARY = ITEMS.register("arrow_incendiary", () -> new ArrowIncendiary(new Item.Properties()));
public static final RegistryObject<Item> ARROW_RICOCHET = ITEMS.register("arrow_ricochet", () -> new ArrowRicochet(new Item.Properties()));
public static final RegistryObject<Item> ARROW_KINETIC = ITEMS.register("arrow_kinetic", () -> new ArrowKinetic(new Item.Properties()));
public static final RegistryObject<Item> ARROW_SHARPENED = ITEMS.register("arrow_sharpened", () -> new ArrowSharpened(new Item.Properties()));
public static final RegistryObject<Item> ARROW_SWITCH = ITEMS.register("arrow_switch", () -> new ArrowSwitch(new Item.Properties()));
public static final RegistryObject<Item> ARROW_BREACHING = ITEMS.register("arrow_breaching", () -> new ArrowBreaching(new Item.Properties()));
public static void register(IEventBus bus) {
ITEMS.register(bus);
}
}
+63
View File
@@ -0,0 +1,63 @@
# This is an example mods.toml file. It contains the data relating to the loading mods.
# There are several mandatory fields (#mandatory), and many more that are optional (#optional).
# The overall format is standard TOML format, v0.5.0.
# Note that there are a couple of TOML lists in this file.
# Find more information on toml format here: https://github.com/toml-lang/toml
# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml
modLoader = "javafml" #mandatory
# A version range to match for said mod loader - for regular FML @Mod it will be the forge version
loaderVersion = "${loader_version_range}" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions.
# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties.
# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here.
license = "${mod_license}"
# A URL to refer people to when problems occur with this mod
#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional
# A list of mods - how many allowed here is determined by the individual mod loader
[[mods]] #mandatory
# The modid of the mod
modId = "${mod_id}" #mandatory
# The version number of the mod
version = "${mod_version}" #mandatory
# A display name for the mod
displayName = "${mod_name}" #mandatory
# A URL to query for updates for this mod. See the JSON update specification https://docs.minecraftforge.net/en/latest/misc/updatechecker/
#updateJSONURL="https://change.me.example.invalid/updates.json" #optional
# A URL for the "homepage" for this mod, displayed in the mod UI
#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional
# A file name (in the root of the mod JAR) containing a logo for display
#logoFile="advancedarrows.png" #optional
# A text field displayed in the mod UI
#credits="Thanks for this example mod goes to Java" #optional
# A text field displayed in the mod UI
authors = "${mod_authors}" #optional
# Display Test controls the display for your mod in the server connection screen
# MATCH_VERSION means that your mod will cause a red X if the versions on client and server differ. This is the default behaviour and should be what you choose if you have server and client elements to your mod.
# IGNORE_SERVER_VERSION means that your mod will not cause a red X if it's present on the server but not on the client. This is what you should use if you're a server only mod.
# IGNORE_ALL_VERSION means that your mod will not cause a red X if it's present on the client or the server. This is a special case and should only be used if your mod has no server component.
# NONE means that no display test is set on your mod. You need to do this yourself, see IExtensionPoint.DisplayTest for more information. You can define any scheme you wish with this value.
# IMPORTANT NOTE: this is NOT an instruction as to which environments (CLIENT or DEDICATED SERVER) your mod loads on. Your mod should load (and maybe do nothing!) whereever it finds itself.
#displayTest="MATCH_VERSION" # MATCH_VERSION is the default if nothing is specified (#optional)
# The description text for the mod (multi line!) (#mandatory)
description = '''${mod_description}'''
# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional.
[[dependencies."${mod_id}"]] #optional
# the modid of the dependency
modId = "forge" #mandatory
# Does this dependency have to exist - if not, ordering below must be specified
mandatory = true #mandatory
# The version range of the dependency
versionRange = "${forge_version_range}" #mandatory
# An ordering relationship for the dependency - BEFORE or AFTER required if the dependency is not mandatory
# BEFORE - This mod is loaded BEFORE the dependency
# AFTER - This mod is loaded AFTER the dependency
ordering = "NONE"
# Side this dependency is applied on - BOTH, CLIENT, or SERVER
side = "BOTH"# Here's another dependency
[[dependencies."${mod_id}"]]
modId = "minecraft"
mandatory = true
# This version range declares a minimum of the current minecraft version up to but not including the next major version
versionRange = "${minecraft_version_range}"
ordering = "NONE"
side = "BOTH"
Whitespace-only changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 B

@@ -0,0 +1,10 @@
{
"values": [
"advancedarrows:arrow_incendiary",
"advancedarrows:arrow_ricochet",
"advancedarrows:arrow_kinetic",
"advancedarrows:arrow_sharpened",
"advancedarrows:arrow_switch",
"advancedarrows:arrow_breaching"
]
}
+6
View File
@@ -0,0 +1,6 @@
{
"pack": {
"description": "advancedarrows resources",
"pack_format": 15
}
}