From 32f73712910b212aafdb569ea241e6cd8cae0500 Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Mon, 2 Mar 2020 17:11:37 -0500 Subject: [PATCH] Fix Crash Add Teleport Spell --- .../sorcerycraft/SorceryCraft.java | 7 +- .../block/CastingTableContainer.java | 13 ++- .../client/block/CastingTableScreen.java | 4 +- .../sorcerycraft/entity/SpellEntity.java | 4 +- .../sorcerycraft/item/SpellItem.java | 14 +++- .../mixin/MixinClientPlayNetworkHandler.java | 3 +- .../sorcerycraft/mixin/MixinPlayerEntity.java | 3 +- .../spell/RandomSpellLootTableFunction.java | 6 +- .../sorcerycraft/spell/SpellRegistry.java | 1 + .../sorcerycraft/spell/TeleportSpell.java | 81 +++++++++++++++++++ .../assets/sorcerycraft/lang/en_us.json | 3 +- 11 files changed, 122 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/thebrokenrail/sorcerycraft/spell/TeleportSpell.java diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/SorceryCraft.java b/src/main/java/com/thebrokenrail/sorcerycraft/SorceryCraft.java index 2be39f8..a310136 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/SorceryCraft.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/SorceryCraft.java @@ -28,7 +28,10 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.entity.EntityCategory; import net.minecraft.entity.EntityDimensions; import net.minecraft.entity.EntityType; -import net.minecraft.item.*; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; import net.minecraft.loot.BinomialLootTableRange; import net.minecraft.loot.LootTables; import net.minecraft.loot.entry.ItemEntry; @@ -47,7 +50,7 @@ public class SorceryCraft implements ModInitializer, ClientModInitializer { public static BlockItem CASTING_TABLE_BLOCK_ITEM; public static ItemGroup ITEM_GROUP; public static EntityType SPELL_ENTITY; - public static final Identifier[] LOOT_TABLES = new Identifier[] { + public static final Identifier[] LOOT_TABLES = new Identifier[]{ LootTables.SIMPLE_DUNGEON_CHEST, LootTables.END_CITY_TREASURE_CHEST, LootTables.NETHER_BRIDGE_CHEST, diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/block/CastingTableContainer.java b/src/main/java/com/thebrokenrail/sorcerycraft/block/CastingTableContainer.java index 0218f45..ccb6128 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/block/CastingTableContainer.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/block/CastingTableContainer.java @@ -5,7 +5,10 @@ import com.thebrokenrail.sorcerycraft.spell.Spell; import com.thebrokenrail.sorcerycraft.spell.SpellPlayerEntity; import com.thebrokenrail.sorcerycraft.spell.SpellRegistry; import com.thebrokenrail.sorcerycraft.spell.SpellTag; -import net.minecraft.container.*; +import net.minecraft.container.BlockContext; +import net.minecraft.container.Container; +import net.minecraft.container.ContainerType; +import net.minecraft.container.Slot; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.BasicInventory; @@ -101,7 +104,7 @@ public class CastingTableContainer extends Container { int k; for (k = 0; k < 3; ++k) { - for(int j = 0; j < 9; ++j) { + for (int j = 0; j < 9; ++j) { addSlot(new Slot(playerInventory, j + k * 9 + 9, 108 + j * 18, 84 + k * 18)); } } @@ -162,7 +165,7 @@ public class CastingTableContainer extends Container { if (!stack.isEmpty()) { for (int i = 3; i < 39; ++i) { ItemStack itemStack = slots.get(i).getStack(); - if (!itemStack.isEmpty() && stack.getItem() == itemStack.getItem()) { + if (!itemStack.isEmpty() && itemCompatible(stack, itemStack)) { ItemStack invSlot = inventory.getInvStack(slot); int count = invSlot.isEmpty() ? 0 : invSlot.getCount(); int requiredCount = Math.min((onlyOne ? 1 : stack.getMaxCount()) - count, itemStack.getCount()); @@ -179,6 +182,10 @@ public class CastingTableContainer extends Container { } } + private boolean itemCompatible(ItemStack itemStack, ItemStack otherItemStack) { + return itemStack.getItem() == otherItemStack.getItem(); + } + @Override public boolean canUse(PlayerEntity player) { return true; diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/client/block/CastingTableScreen.java b/src/main/java/com/thebrokenrail/sorcerycraft/client/block/CastingTableScreen.java index 189dc68..fa7a455 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/client/block/CastingTableScreen.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/client/block/CastingTableScreen.java @@ -155,7 +155,7 @@ public class CastingTableScreen extends ContainerScreen { int k = j + 139; int l = i - 7; float f = ((float) mouseY - (float) j - 13.5F) / ((float) (k - j) - 27.0F); - f = f * (float)l + 0.5F; + f = f * (float) l + 0.5F; indexStartOffset = MathHelper.clamp((int) f, 0, l); return true; } else { @@ -168,7 +168,7 @@ public class CastingTableScreen extends ContainerScreen { scrolling = false; int i = (width - containerWidth) / 2; int j = (height - containerHeight) / 2; - if (this.canScroll(container.getRecipes().length) && mouseX > (double)(i + 94) && mouseX < (double) (i + 94 + 6) && mouseY > (double) (j + 18) && mouseY <= (double) (j + 18 + 139 + 1)) { + if (this.canScroll(container.getRecipes().length) && mouseX > (double) (i + 94) && mouseX < (double) (i + 94 + 6) && mouseY > (double) (j + 18) && mouseY <= (double) (j + 18 + 139 + 1)) { scrolling = true; } diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/entity/SpellEntity.java b/src/main/java/com/thebrokenrail/sorcerycraft/entity/SpellEntity.java index 7fca56e..4981a09 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/entity/SpellEntity.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/entity/SpellEntity.java @@ -6,7 +6,9 @@ import com.thebrokenrail.sorcerycraft.spell.SpellRegistry; import com.thebrokenrail.sorcerycraft.spell.SpellTag; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.entity.*; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.thrown.ThrownItemEntity; import net.minecraft.item.Item; import net.minecraft.network.Packet; diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/item/SpellItem.java b/src/main/java/com/thebrokenrail/sorcerycraft/item/SpellItem.java index faaa6d6..1dde1b0 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/item/SpellItem.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/item/SpellItem.java @@ -3,7 +3,10 @@ package com.thebrokenrail.sorcerycraft.item; import com.thebrokenrail.sorcerycraft.SorceryCraft; import com.thebrokenrail.sorcerycraft.entity.SpellEntity; import com.thebrokenrail.sorcerycraft.packet.LearnedNewSpellS2CPacket; -import com.thebrokenrail.sorcerycraft.spell.*; +import com.thebrokenrail.sorcerycraft.spell.Spell; +import com.thebrokenrail.sorcerycraft.spell.SpellPlayerEntity; +import com.thebrokenrail.sorcerycraft.spell.SpellRegistry; +import com.thebrokenrail.sorcerycraft.spell.SpellTag; import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; @@ -15,7 +18,12 @@ import net.minecraft.sound.SoundEvents; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; -import net.minecraft.util.*; +import net.minecraft.util.ActionResult; +import net.minecraft.util.DefaultedList; +import net.minecraft.util.Formatting; +import net.minecraft.util.Hand; +import net.minecraft.util.Rarity; +import net.minecraft.util.TypedActionResult; import net.minecraft.world.World; import java.util.HashMap; @@ -28,7 +36,7 @@ public class SpellItem extends Item { } @Override - public TypedActionResult use(World world, PlayerEntity playerEntity, Hand hand) { + public TypedActionResult use(World world, PlayerEntity playerEntity, Hand hand) { ItemStack itemStack = playerEntity.getStackInHand(hand); Map spells = SpellTag.getSpells(itemStack); diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinClientPlayNetworkHandler.java b/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinClientPlayNetworkHandler.java index 52bea0e..f10855c 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinClientPlayNetworkHandler.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinClientPlayNetworkHandler.java @@ -16,7 +16,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @SuppressWarnings("unused") @Mixin(ClientPlayNetworkHandler.class) public class MixinClientPlayNetworkHandler { - @Shadow private ClientWorld world; + @Shadow + private ClientWorld world; @Inject(method = "onEntitySpawn", at = @At(value = "TAIL")) public void onEntitySpawn(EntitySpawnS2CPacket packet, CallbackInfo callbackInfo) { diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinPlayerEntity.java b/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinPlayerEntity.java index 43e012a..85c0a82 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinPlayerEntity.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/mixin/MixinPlayerEntity.java @@ -9,12 +9,13 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.HashMap; import java.util.Map; @SuppressWarnings("unused") @Mixin(PlayerEntity.class) public class MixinPlayerEntity implements SpellPlayerEntity { - private Map spells; + private Map spells = new HashMap<>(); @Inject(at = @At("HEAD"), method = "readCustomDataFromTag") public void readCustomDataFromTag(CompoundTag tag, CallbackInfo info) { diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/spell/RandomSpellLootTableFunction.java b/src/main/java/com/thebrokenrail/sorcerycraft/spell/RandomSpellLootTableFunction.java index ef03f83..4fec1bb 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/spell/RandomSpellLootTableFunction.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/spell/RandomSpellLootTableFunction.java @@ -1,14 +1,14 @@ package com.thebrokenrail.sorcerycraft.spell; -import java.util.HashMap; -import java.util.Map; - import net.minecraft.item.ItemStack; import net.minecraft.loot.condition.LootCondition; import net.minecraft.loot.context.LootContext; import net.minecraft.loot.function.ConditionalLootFunction; import net.minecraft.loot.function.LootFunction; +import java.util.HashMap; +import java.util.Map; + public class RandomSpellLootTableFunction extends ConditionalLootFunction { private RandomSpellLootTableFunction(LootCondition[] conditions) { super(conditions); diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/spell/SpellRegistry.java b/src/main/java/com/thebrokenrail/sorcerycraft/spell/SpellRegistry.java index 42fc731..e16c5ae 100644 --- a/src/main/java/com/thebrokenrail/sorcerycraft/spell/SpellRegistry.java +++ b/src/main/java/com/thebrokenrail/sorcerycraft/spell/SpellRegistry.java @@ -57,5 +57,6 @@ public class SpellRegistry { SpellRegistry.registerSpell("steadfast_spell", SteadfastSpell.class); SpellRegistry.registerSpell("flame_spell", FlameSpell.class); SpellRegistry.registerSpell("levitate_spell", LevitateSpell.class); + SpellRegistry.registerSpell("teleport_spell", TeleportSpell.class); } } diff --git a/src/main/java/com/thebrokenrail/sorcerycraft/spell/TeleportSpell.java b/src/main/java/com/thebrokenrail/sorcerycraft/spell/TeleportSpell.java new file mode 100644 index 0000000..d6cda71 --- /dev/null +++ b/src/main/java/com/thebrokenrail/sorcerycraft/spell/TeleportSpell.java @@ -0,0 +1,81 @@ +package com.thebrokenrail.sorcerycraft.spell; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; + +public class TeleportSpell extends Spell { + public TeleportSpell(String id, int level) { + super(id, level); + } + + private int getMaxTeleport(World world) { + return world.getDimension().isNether() ? 128 : 256; + } + + @Override + public void execute(Entity target, Entity source, Entity attacker) { + World world = target.getEntityWorld(); + int range = 16 + (8 * getLevel()); + if (target instanceof LivingEntity) { + LivingEntity user = (LivingEntity) target; + if (!world.isClient()) { + double d = user.getX(); + double e = user.getY(); + double f = user.getZ(); + + for (int i = 0; i < range; ++i) { + double x = user.getX() + (user.getRandom().nextDouble() - 0.5D) * range; + double y = MathHelper.clamp(user.getY() + (double) (user.getRandom().nextInt(range) - (range / 2)), 0d, getMaxTeleport(world) - 1); + double z = user.getZ() + (user.getRandom().nextDouble() - 0.5D) * range; + if (user.hasVehicle()) { + user.stopRiding(); + } + + if (user.teleport(x, y, z, true)) { + world.playSound(null, d, e, f, SoundEvents.ITEM_CHORUS_FRUIT_TELEPORT, SoundCategory.PLAYERS, 1.0F, 1.0F); + user.playSound(SoundEvents.ITEM_CHORUS_FRUIT_TELEPORT, 1.0F, 1.0F); + break; + } + } + } + } + } + + @Override + public int getXPCost() { + switch (getLevel()) { + case 0: { + return 12; + } + case 1: { + return 18; + } + } + return -1; + } + + @Override + public ItemStack getItemCost() { + switch (getLevel()) { + case 0: { + return new ItemStack(Items.ENDER_PEARL); + } + case 1: { + return new ItemStack(Items.CHORUS_FRUIT); + } + } + return ItemStack.EMPTY; + } + + @Override + public int getMaxLevel() { + return 2; + } +} diff --git a/src/main/resources/assets/sorcerycraft/lang/en_us.json b/src/main/resources/assets/sorcerycraft/lang/en_us.json index 6013d28..19ea7e5 100644 --- a/src/main/resources/assets/sorcerycraft/lang/en_us.json +++ b/src/main/resources/assets/sorcerycraft/lang/en_us.json @@ -14,5 +14,6 @@ "spell.sorcerycraft.dissolve_spell": "Dissolve", "spell.sorcerycraft.steadfast_spell": "Steadfast", "spell.sorcerycraft.flame_spell": "Flame", - "spell.sorcerycraft.levitate_spell": "Levitate" + "spell.sorcerycraft.levitate_spell": "Levitate", + "spell.sorcerycraft.teleport_spell": "Teleport" } \ No newline at end of file