1.0.3
All checks were successful
SorceryCraft/pipeline/head This commit looks good

Tweak Loot Tables
Fix Dispenser Bugs
Fix Inward Bugs
This commit is contained in:
TheBrokenRail 2020-03-03 18:08:22 -05:00
parent cdaac350db
commit 28fa7115c6
27 changed files with 194 additions and 213 deletions

View File

@ -1,5 +1,10 @@
### Changelog
**1.0.3**
* Tweak Loot Tables
* Fix Dispenser Bugs
* Fix Inward Bugs
**1.0.2**
* Add Inward Spell
* Tweak Rebound Mechanic

View File

@ -1,14 +1,15 @@
plugins {
id 'fabric-loom' version '0.2.6-SNAPSHOT'
id 'maven-publish'
}
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
compileJava {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
archivesBaseName = project.archives_base_name
version = project.mod_version
group = project.maven_group
version = project.mod_version as Object
group = project.maven_group as Object
minecraft {
}
@ -22,11 +23,13 @@ dependencies {
}
processResources {
inputs.property "version", project.version
inputs.property "version", version
inputs.property "modid", archivesBaseName
from(sourceSets.main.resources.srcDirs) {
include "fabric.mod.json"
expand "version": project.version
expand "version": version
expand "modid": archivesBaseName
}
from(sourceSets.main.resources.srcDirs) {
@ -52,24 +55,3 @@ task sourcesJar(type: Jar, dependsOn: classes) {
jar {
from "LICENSE"
}
// configure the maven publication
publishing {
publications {
mavenJava(MavenPublication) {
// add all the jars that should be included when publishing to maven
artifact(remapJar) {
builtBy remapJar
}
artifact(sourcesJar) {
builtBy remapSourcesJar
}
}
}
// select the repositories you want to publish to
repositories {
// uncomment to publish to the local maven
// mavenLocal()
}
}

View File

@ -8,7 +8,7 @@ org.gradle.jvmargs = -Xmx1G
loader_version = 0.7.8+build.184
# Mod Properties
mod_version = 1.0.2
mod_version = 1.0.3
maven_group = com.thebrokenrail
archives_base_name = sorcerycraft

View File

@ -7,11 +7,10 @@ import com.thebrokenrail.sorcerycraft.client.entity.SpellEntityRenderer;
import com.thebrokenrail.sorcerycraft.command.SpellCommand;
import com.thebrokenrail.sorcerycraft.entity.SpellEntity;
import com.thebrokenrail.sorcerycraft.item.SpellItem;
import com.thebrokenrail.sorcerycraft.packet.LearnedNewSpellS2CPacket;
import com.thebrokenrail.sorcerycraft.packet.SelectSpellC2SPacket;
import com.thebrokenrail.sorcerycraft.packet.UpdateKnownSpellsS2CPacket;
import com.thebrokenrail.sorcerycraft.spell.RandomSpellLootTableFunction;
import com.thebrokenrail.sorcerycraft.spell.SpellRegistry;
import com.thebrokenrail.sorcerycraft.spell.Spells;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder;
@ -39,6 +38,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.loot.BinomialLootTableRange;
import net.minecraft.loot.LootTables;
import net.minecraft.loot.entry.ItemEntry;
import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvent;
import net.minecraft.sound.SoundEvents;
import net.minecraft.text.TranslatableText;
@ -69,7 +69,7 @@ public class SorceryCraft implements ModInitializer, ClientModInitializer {
LootTables.STRONGHOLD_LIBRARY_CHEST
};
public static final double SPELL_FAILURE_CHANCE = 0.3;
public static final double SPELL_FAILURE_CHANCE = 0.3d;
private boolean isSelectedLootTable(Identifier lootTable) {
for (Identifier id : LOOT_TABLES) {
@ -82,6 +82,8 @@ public class SorceryCraft implements ModInitializer, ClientModInitializer {
@Override
public void onInitialize() {
new Spells();
ITEM_GROUP = FabricItemGroupBuilder.create(
new Identifier(NAMESPACE, "spells"))
.icon(() -> new ItemStack(SPELL_ITEM))
@ -98,8 +100,6 @@ public class SorceryCraft implements ModInitializer, ClientModInitializer {
Registry.register(Registry.ITEM, new Identifier(NAMESPACE, "casting_table"), CASTING_TABLE_BLOCK_ITEM);
Registry.register(Registry.ENTITY_TYPE, new Identifier(NAMESPACE, "spell"), SPELL_ENTITY);
SpellRegistry.init();
ContainerProviderRegistry.INSTANCE.registerFactory(new Identifier(NAMESPACE, "casting_table"), (syncId, identifier, player, buf) -> {
final World world = player.world;
final BlockPos pos = buf.readBlockPos();
@ -110,7 +110,6 @@ public class SorceryCraft implements ModInitializer, ClientModInitializer {
ServerSidePacketRegistryImpl.INSTANCE.register(new Identifier(NAMESPACE, "select_spell"), SelectSpellC2SPacket::handle);
ClientSidePacketRegistryImpl.INSTANCE.register(new Identifier(NAMESPACE, "update_known_spells"), UpdateKnownSpellsS2CPacket::handle);
ClientSidePacketRegistryImpl.INSTANCE.register(new Identifier(NAMESPACE, "learned_new_spell"), LearnedNewSpellS2CPacket::handle);
LootTableLoadingCallback.EVENT.register((resourceManager, lootManager, id, supplier, setter) -> {
if (isSelectedLootTable(id)) {
@ -130,13 +129,22 @@ public class SorceryCraft implements ModInitializer, ClientModInitializer {
entity.setItem(itemStack);
return entity;
}
@Override
protected void playSound(BlockPointer pointer) {
playSpellSound(pointer);
}
});
}
private static final SoundEvent SPELL_SOUND_EFFECT = SoundEvents.BLOCK_ENCHANTMENT_TABLE_USE;
public static void playSpellSound(BlockPointer block) {
block.getWorld().playSound(null, block.getBlockPos(), SPELL_SOUND_EFFECT, SoundCategory.BLOCKS, 1.0f, 1.0f);
}
public static void playSpellSound(PlayerEntity player) {
player.playSound(SPELL_SOUND_EFFECT, 1.0f, 1.0f);
player.playSound(SPELL_SOUND_EFFECT, SoundCategory.PLAYERS, 1.0f, 1.0f);
}
@Override
@ -144,7 +152,7 @@ public class SorceryCraft implements ModInitializer, ClientModInitializer {
EntityRendererRegistry.INSTANCE.register(SPELL_ENTITY, (entityRenderDispatcher, context) -> new SpellEntityRenderer(entityRenderDispatcher));
ScreenProviderRegistry.INSTANCE.<CastingTableContainer>registerFactory(new Identifier(NAMESPACE, "casting_table"), (container) -> {
assert MinecraftClient.getInstance().player != null;
return new CastingTableScreen(container, MinecraftClient.getInstance().player.inventory, new TranslatableText("block.sorcerycraft.casting_table"));
return new CastingTableScreen(container, MinecraftClient.getInstance().player.inventory, new TranslatableText("block." + SorceryCraft.NAMESPACE + ".casting_table"));
});
}
}

View File

@ -34,6 +34,6 @@ public class CastingTableBlock extends Block {
@Override
public NameableContainerFactory createContainerFactory(BlockState state, World world, BlockPos pos) {
return new SimpleNamedContainerFactory((i, playerInventory, playerEntity) -> new CastingTableContainer(i, playerInventory, BlockContext.create(world, pos)), new TranslatableText("container.sorcerycraft.casting_table"));
return new SimpleNamedContainerFactory((i, playerInventory, playerEntity) -> new CastingTableContainer(i, playerInventory, BlockContext.create(world, pos)), new TranslatableText("container." + SorceryCraft.NAMESPACE + ".casting_table"));
}
}

View File

@ -15,7 +15,7 @@ import net.minecraft.inventory.BasicInventory;
import net.minecraft.inventory.CraftingResultInventory;
import net.minecraft.inventory.Inventory;
import net.minecraft.item.ItemStack;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.Identifier;
import java.util.ArrayList;
import java.util.List;
@ -44,7 +44,7 @@ public class CastingTableContainer extends Container {
spells = SpellRegistry.getSpells();
} else {
SpellPlayerEntity spellPlayer = (SpellPlayerEntity) playerInventory.player;
Map<String, Integer> spellsMap = spellPlayer.getSpells();
Map<Identifier, Integer> spellsMap = spellPlayer.getSpells();
List<Spell> spellsArray = new ArrayList<>();
Spell[] allSpells = SpellRegistry.getSpells();
@ -149,7 +149,7 @@ public class CastingTableContainer extends Container {
cost.getItem() == spells[index].getItemCost().getItem() &&
cost.getCount() >= spells[index].getItemCost().getCount()) {
ItemStack resultItem = item.copy();
Map<String, Integer> resultSpells = SpellTag.getSpells(resultItem);
Map<Identifier, Integer> resultSpells = SpellTag.getSpells(resultItem);
if (!resultSpells.containsKey(spells[index].getID()) || resultSpells.get(spells[index].getID()) <= spells[index].getLevel()) {
resultSpells.put(spells[index].getID(), spells[index].getLevel());
}

View File

@ -1,6 +1,7 @@
package com.thebrokenrail.sorcerycraft.client.block;
import com.mojang.blaze3d.systems.RenderSystem;
import com.thebrokenrail.sorcerycraft.SorceryCraft;
import com.thebrokenrail.sorcerycraft.block.CastingTableContainer;
import com.thebrokenrail.sorcerycraft.packet.SelectSpellC2SPacket;
import com.thebrokenrail.sorcerycraft.spell.Spell;
@ -34,7 +35,7 @@ public class CastingTableScreen extends ContainerScreen<CastingTableContainer> {
int j = containerHeight - 94;
font.draw(title.asFormattedString(), (float) (49 + this.containerWidth / 2 - font.getStringWidth(title.asFormattedString()) / 2), 6.0F, 4210752);
font.draw(playerInventory.getDisplayName().asFormattedString(), 107.0F, (float) j, 4210752);
String spells = new TranslatableText("container.sorcerycraft.spells").getString();
String spells = new TranslatableText("container." + SorceryCraft.NAMESPACE + ".spells").getString();
font.draw(spells, (float) (5 - font.getStringWidth(spells) / 2 + 48), 6.0F, 4210752);
renderXPCost();
}

View File

@ -1,10 +1,7 @@
package com.thebrokenrail.sorcerycraft.command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.suggestion.SuggestionProvider;
import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import com.thebrokenrail.sorcerycraft.SorceryCraft;
import com.thebrokenrail.sorcerycraft.spell.SpellPlayerEntity;
import com.thebrokenrail.sorcerycraft.spell.SpellTag;
import net.minecraft.command.arguments.EntityArgumentType;
@ -13,62 +10,37 @@ import net.minecraft.server.command.CommandManager;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
public class SpellCommand {
public static SuggestionProvider<ServerCommandSource> getOptions() {
return (ctx, builder) -> getSuggestionsBuilder(builder, new String[]{"clear", "list"});
}
private static CompletableFuture<Suggestions> getSuggestionsBuilder(SuggestionsBuilder builder, String[] list) {
String remaining = builder.getRemaining().toLowerCase(Locale.ROOT);
if (list.length < 1) {
return Suggestions.empty();
}
for (String str : list) {
if (str.toLowerCase(Locale.ROOT).startsWith(remaining)) {
builder.suggest(str);
}
}
return builder.buildFuture();
}
public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
dispatcher.register(CommandManager.literal("spell")
.requires(source -> source.hasPermissionLevel(4))
.then(CommandManager.argument("action", StringArgumentType.word())
.suggests(getOptions())
.then(CommandManager.literal("list")
.then(CommandManager.argument("player", EntityArgumentType.player())
.executes(ctx -> {
PlayerEntity player = EntityArgumentType.getPlayer(ctx, "player");
ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.listing_spells", player.getDisplayName()), false);
SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player;
Map<Identifier, Integer> spells = spellPlayer.getSpells();
for (Map.Entry<Identifier, Integer> entry : spells.entrySet()) {
ctx.getSource().sendFeedback(SpellTag.getTranslatedSpell(entry.getKey(), entry.getValue()).formatted(Formatting.YELLOW), false);
}
return 0;
})
)
)
.then(CommandManager.literal("clear")
.then(CommandManager.argument("player", EntityArgumentType.player())
.executes(ctx -> {
String action = StringArgumentType.getString(ctx, "action");
PlayerEntity player = EntityArgumentType.getPlayer(ctx, "player");
switch (action) {
case "clear": {
SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player;
spellPlayer.setSpells(new HashMap<>());
ctx.getSource().sendFeedback(new TranslatableText("command.sorcerycraft.spell.cleared_spells", player.getDisplayName()), true);
return 1;
}
case "list": {
ctx.getSource().sendFeedback(new TranslatableText("command.sorcerycraft.spell.listing_spells", player.getDisplayName()), false);
SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player;
Map<String, Integer> spells = spellPlayer.getSpells();
for (Map.Entry<String, Integer> entry : spells.entrySet()) {
ctx.getSource().sendFeedback(SpellTag.getTranslatedSpell(entry.getKey(), entry.getValue()).formatted(Formatting.YELLOW), false);
}
return 0;
}
default: {
ctx.getSource().sendFeedback(new TranslatableText("command.sorcerycraft.spell.invalid_action", action).formatted(Formatting.RED), true);
return -1;
}
}
SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player;
spellPlayer.setSpells(new HashMap<>());
ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.cleared_spells", player.getDisplayName()), true);
return 1;
})
)
)

View File

@ -4,6 +4,7 @@ import com.thebrokenrail.sorcerycraft.SorceryCraft;
import com.thebrokenrail.sorcerycraft.spell.Spell;
import com.thebrokenrail.sorcerycraft.spell.SpellRegistry;
import com.thebrokenrail.sorcerycraft.spell.SpellTag;
import com.thebrokenrail.sorcerycraft.spell.Spells;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.entity.Entity;
@ -15,6 +16,7 @@ import net.minecraft.network.Packet;
import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.Identifier;
import net.minecraft.util.hit.EntityHitResult;
import net.minecraft.util.hit.HitResult;
import net.minecraft.world.World;
@ -30,43 +32,40 @@ public class SpellEntity extends ThrownItemEntity {
super(SorceryCraft.SPELL_ENTITY, owner, world);
}
private boolean firstTick = false;
private boolean firstTick = true;
public SpellEntity(World world, double x, double y, double z) {
super(SorceryCraft.SPELL_ENTITY, x, y, z, world);
}
private boolean didSpellSucceed(Map<String, Integer> spells) {
return Math.random() > SorceryCraft.SPELL_FAILURE_CHANCE || spells.containsKey("steadfast_spell");
private boolean didSpellSucceed(Map<Identifier, Integer> spells) {
return Math.random() > SorceryCraft.SPELL_FAILURE_CHANCE || spells.containsKey(Spells.STEADFAST_SPELL);
}
@Override
protected void onCollision(HitResult hitResult) {
boolean remove = false;
if (hitResult.getType() == HitResult.Type.BLOCK) {
remove = true;
} else if (hitResult.getType() == HitResult.Type.ENTITY) {
Entity entity = ((EntityHitResult) hitResult).getEntity();
Map<Identifier, Integer> spells = SpellTag.getSpells(getItem());
if (!spells.containsKey(Spells.INWARD_SPELL)) {
if (hitResult.getType() == HitResult.Type.BLOCK) {
remove();
} else if (hitResult.getType() == HitResult.Type.ENTITY) {
Entity entity = ((EntityHitResult) hitResult).getEntity();
Map<String, Integer> spells = SpellTag.getSpells(getItem());
boolean success = didSpellSucceed(spells);
for (Map.Entry<String, Integer> entry : spells.entrySet()) {
Spell spell = SpellRegistry.getSpell(entry.getKey(), entry.getValue());
if (spell != null) {
if (success) {
spell.execute(entity, this, getOwner());
} else if (getOwner() != null) {
getOwner().playSound(SoundEvents.ENCHANT_THORNS_HIT, 1.0f, 1.0f);
spell.execute(getOwner(), this, getOwner());
boolean success = didSpellSucceed(spells);
for (Map.Entry<Identifier, Integer> entry : spells.entrySet()) {
Spell spell = SpellRegistry.getSpell(entry.getKey(), entry.getValue());
if (spell != null) {
if (success) {
spell.execute(entity, this, getOwner());
} else if (getOwner() != null) {
getOwner().playSound(SoundEvents.ENCHANT_THORNS_HIT, 1.0f, 1.0f);
spell.execute(getOwner(), this, getOwner());
}
}
}
}
remove = true;
}
if (remove && !getEntityWorld().isClient()) {
remove();
remove();
}
}
}
@ -85,15 +84,18 @@ public class SpellEntity extends ThrownItemEntity {
super.tick();
if (firstTick) {
firstTick = false;
Map<String, Integer> spells = SpellTag.getSpells(getItem());
if (spells.containsKey("inward_spell")) {
boolean success = didSpellSucceed(spells);
for (Map.Entry<String, Integer> entry : spells.entrySet()) {
Spell spell = SpellRegistry.getSpell(entry.getKey(), entry.getValue());
if (spell != null && success) {
spell.execute(getOwner(), this, getOwner());
Map<Identifier, Integer> spells = SpellTag.getSpells(getItem());
if (spells.containsKey(Spells.INWARD_SPELL)) {
if (getOwner() != null) {
boolean success = didSpellSucceed(spells);
for (Map.Entry<Identifier, Integer> entry : spells.entrySet()) {
Spell spell = SpellRegistry.getSpell(entry.getKey(), entry.getValue());
if (spell != null && success) {
spell.execute(getOwner(), this, getOwner());
}
}
}
remove();
return;
}
}

View File

@ -2,20 +2,16 @@ 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.Spell;
import com.thebrokenrail.sorcerycraft.spell.SpellPlayerEntity;
import com.thebrokenrail.sorcerycraft.spell.SpellRegistry;
import com.thebrokenrail.sorcerycraft.spell.SpellTag;
import net.minecraft.block.dispenser.ProjectileDispenserBehavior;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.sound.SoundEvents;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
@ -23,6 +19,7 @@ import net.minecraft.util.ActionResult;
import net.minecraft.util.DefaultedList;
import net.minecraft.util.Formatting;
import net.minecraft.util.Hand;
import net.minecraft.util.Identifier;
import net.minecraft.util.Rarity;
import net.minecraft.util.TypedActionResult;
import net.minecraft.world.World;
@ -40,7 +37,7 @@ public class SpellItem extends Item {
public TypedActionResult<ItemStack> use(World world, PlayerEntity playerEntity, Hand hand) {
ItemStack itemStack = playerEntity.getStackInHand(hand);
Map<String, Integer> spells = SpellTag.getSpells(itemStack);
Map<Identifier, Integer> spells = SpellTag.getSpells(itemStack);
if (spells.size() > 0) {
SorceryCraft.playSpellSound(playerEntity);
@ -64,14 +61,14 @@ public class SpellItem extends Item {
@Override
public boolean hasEnchantmentGlint(ItemStack stack) {
Map<String, Integer> spells = SpellTag.getSpells(stack);
Map<Identifier, Integer> spells = SpellTag.getSpells(stack);
return spells.size() > 0;
}
@Override
public void appendTooltip(ItemStack itemStack, World world, List<Text> tooltip, TooltipContext tooltipContext) {
Map<String, Integer> spells = SpellTag.getSpells(itemStack);
for (Map.Entry<String, Integer> entry : spells.entrySet()) {
Map<Identifier, Integer> spells = SpellTag.getSpells(itemStack);
for (Map.Entry<Identifier, Integer> entry : spells.entrySet()) {
tooltip.add(SpellTag.getTranslatedSpell(entry.getKey(), entry.getValue()));
}
}
@ -83,7 +80,7 @@ public class SpellItem extends Item {
Spell[] spells = SpellRegistry.getSpells();
for (Spell value : spells) {
ItemStack item = new ItemStack(this);
Map<String, Integer> spell = new HashMap<>();
Map<Identifier, Integer> spell = new HashMap<>();
spell.put(value.getID(), value.getLevel());
SpellTag.setSpells(item, spell);
stacks.add(item);
@ -103,12 +100,12 @@ public class SpellItem extends Item {
PlayerEntity player = (PlayerEntity) entity;
SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player;
Map<String, Integer> playerSpells = spellPlayer.getSpells();
Map<String, Integer> itemSpells = SpellTag.getSpells(player.inventory.getInvStack(slot));
Map<Identifier, Integer> playerSpells = spellPlayer.getSpells();
Map<Identifier, Integer> itemSpells = SpellTag.getSpells(player.inventory.getInvStack(slot));
boolean changed = false;
for (Map.Entry<String, Integer> entry : itemSpells.entrySet()) {
for (Map.Entry<Identifier, Integer> entry : itemSpells.entrySet()) {
Spell spell = SpellRegistry.getSpell(entry.getKey(), entry.getValue());
if (spell != null) {
if (spell.getLevel() >= spell.getMaxLevel()) {
@ -121,13 +118,14 @@ public class SpellItem extends Item {
playerSpells.put(spell.getID(), spell.getLevel());
assert world.getServer() != null;
Text text = new LiteralText("[").append(SpellTag.getTranslatedSpell(spell.getID(), spell.getLevel()).getString()).append("]").formatted(Formatting.GREEN);
world.getServer().getPlayerManager().sendToAll(new TranslatableText("chat.sorcerycraft.new_spell", player.getDisplayName(), text));
world.getServer().getPlayerManager().sendToAll(new TranslatableText("chat." + SorceryCraft.NAMESPACE + ".new_spell", player.getDisplayName(), text));
}
}
}
if (changed) {
LearnedNewSpellS2CPacket.send((ServerPlayerEntity) player);
//LearnedNewSpellS2CPacket.send((ServerPlayerEntity) player);
SorceryCraft.playSpellSound(player);
spellPlayer.setSpells(playerSpells);
}
}

View File

@ -4,6 +4,7 @@ import com.thebrokenrail.sorcerycraft.spell.SpellPlayerEntity;
import com.thebrokenrail.sorcerycraft.spell.SpellTag;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Identifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@ -15,7 +16,7 @@ import java.util.Map;
@SuppressWarnings("unused")
@Mixin(PlayerEntity.class)
public class MixinPlayerEntity implements SpellPlayerEntity {
private Map<String, Integer> spells = new HashMap<>();
private Map<Identifier, Integer> spells = new HashMap<>();
@Inject(at = @At("HEAD"), method = "readCustomDataFromTag")
public void readCustomDataFromTag(CompoundTag tag, CallbackInfo info) {
@ -28,12 +29,12 @@ public class MixinPlayerEntity implements SpellPlayerEntity {
}
@Override
public void setSpells(Map<String, Integer> spells) {
public void setSpells(Map<Identifier, Integer> spells) {
this.spells = spells;
}
@Override
public Map<String, Integer> getSpells() {
public Map<Identifier, Integer> getSpells() {
return spells;
}
}

View File

@ -1,23 +0,0 @@
package com.thebrokenrail.sorcerycraft.packet;
import com.thebrokenrail.sorcerycraft.SorceryCraft;
import io.netty.buffer.Unpooled;
import net.fabricmc.fabric.api.network.PacketContext;
import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.Identifier;
import net.minecraft.util.PacketByteBuf;
public class LearnedNewSpellS2CPacket {
@SuppressWarnings("unused")
public static void handle(PacketContext context, PacketByteBuf bytes) {
if (context.getPlayer() != null) {
SorceryCraft.playSpellSound(context.getPlayer());
}
}
public static void send(ServerPlayerEntity player) {
PacketByteBuf bytes = new PacketByteBuf(Unpooled.buffer());
player.networkHandler.sendPacket(new CustomPayloadS2CPacket(new Identifier(SorceryCraft.NAMESPACE, "learned_new_spell"), bytes));
}
}

View File

@ -5,9 +5,10 @@ import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
public class DamageSpell extends Spell {
public DamageSpell(String id, int level) {
public DamageSpell(Identifier id, int level) {
super(id, level);
}

View File

@ -4,9 +4,10 @@ import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
public class DissolveSpell extends Spell {
public DissolveSpell(String id, int level) {
public DissolveSpell(Identifier id, int level) {
super(id, level);
}

View File

@ -3,9 +3,10 @@ package com.thebrokenrail.sorcerycraft.spell;
import net.minecraft.entity.Entity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
public class FlameSpell extends Spell {
public FlameSpell(String id, int level) {
public FlameSpell(Identifier id, int level) {
super(id, level);
}

View File

@ -5,9 +5,10 @@ import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
public class HealSpell extends Spell {
public HealSpell(String id, int level) {
public HealSpell(Identifier id, int level) {
super(id, level);
}

View File

@ -3,14 +3,16 @@ package com.thebrokenrail.sorcerycraft.spell;
import net.minecraft.entity.Entity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
public class InwardSpell extends Spell {
public InwardSpell(String id, int level) {
public InwardSpell(Identifier id, int level) {
super(id, level);
}
@Override
public void execute(Entity target, Entity source, Entity attacker) {
// NOOP
}
@Override
@ -20,7 +22,7 @@ public class InwardSpell extends Spell {
@Override
public ItemStack getItemCost() {
return new ItemStack(Items.BLAZE_ROD);
return new ItemStack(Items.ENDER_EYE);
}
@Override

View File

@ -6,9 +6,10 @@ import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
public class LevitateSpell extends Spell {
public LevitateSpell(String id, int level) {
public LevitateSpell(Identifier id, int level) {
super(id, level);
}

View File

@ -5,8 +5,8 @@ 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 net.minecraft.util.Identifier;
import java.util.HashMap;
import java.util.Map;
public class RandomSpellLootTableFunction extends ConditionalLootFunction {
@ -15,11 +15,15 @@ public class RandomSpellLootTableFunction extends ConditionalLootFunction {
}
public ItemStack process(ItemStack stack, LootContext context) {
Spell[] spells = SpellRegistry.getSpells();
int index = context.getRandom().nextInt(spells.length);
Map<String, Integer> spell = new HashMap<>();
spell.put(spells[index].getID(), spells[index].getLevel());
SpellTag.setSpells(stack, spell);
double chance = 1.0d;
while (!(context.getRandom().nextDouble() > chance)) {
Spell[] spells = SpellRegistry.getSpells();
int index = context.getRandom().nextInt(spells.length);
Map<Identifier, Integer> spell = SpellTag.getSpells(stack);
spell.put(spells[index].getID(), spells[index].getLevel());
SpellTag.setSpells(stack, spell);
chance = chance * 0.25d;
}
return stack;
}

View File

@ -2,17 +2,18 @@ package com.thebrokenrail.sorcerycraft.spell;
import net.minecraft.entity.Entity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
public abstract class Spell {
private final String id;
private final Identifier id;
private final int level;
public Spell(String id, int level) {
public Spell(Identifier id, int level) {
this.id = id;
this.level = level;
}
public String getID() {
public Identifier getID() {
return id;
}

View File

@ -1,9 +1,11 @@
package com.thebrokenrail.sorcerycraft.spell;
import net.minecraft.util.Identifier;
import java.util.Map;
public interface SpellPlayerEntity {
void setSpells(Map<String, Integer> spells);
void setSpells(Map<Identifier, Integer> spells);
Map<String, Integer> getSpells();
Map<Identifier, Integer> getSpells();
}

View File

@ -1,5 +1,7 @@
package com.thebrokenrail.sorcerycraft.spell;
import net.minecraft.util.Identifier;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
@ -7,21 +9,21 @@ import java.util.List;
import java.util.Map;
public class SpellRegistry {
private static final Map<String, Class<?>> spells = new HashMap<>();
private static final Map<Identifier, Class<?>> spells = new HashMap<>();
public static Spell getSpell(String id, int level) {
public static Spell getSpell(Identifier id, int level) {
if (!spells.containsKey(id)) {
return null;
}
try {
return (Spell) spells.get(id).getConstructor(String.class, int.class).newInstance(id, level);
return (Spell) spells.get(id).getConstructor(Identifier.class, int.class).newInstance(id, level);
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
return null;
}
}
public static int getMaxLevel(String id) {
public static int getMaxLevel(Identifier id) {
Spell tempSpell = getSpell(id, 0);
if (tempSpell == null) {
return -1;
@ -31,7 +33,7 @@ public class SpellRegistry {
public static Spell[] getSpells() {
List<Spell> out = new ArrayList<>();
for (Map.Entry<String, Class<?>> entry : spells.entrySet()) {
for (Map.Entry<Identifier, Class<?>> entry : spells.entrySet()) {
int maxLevel = getMaxLevel(entry.getKey());
if (maxLevel == -1) {
continue;
@ -46,18 +48,8 @@ public class SpellRegistry {
return out.toArray(new Spell[0]);
}
private static void registerSpell(String id, Class<?> spell) {
public static Identifier registerSpell(Identifier id, Class<?> spell) {
spells.put(id, spell);
}
public static void init() {
SpellRegistry.registerSpell("heal_spell", HealSpell.class);
SpellRegistry.registerSpell("damage_spell", DamageSpell.class);
SpellRegistry.registerSpell("dissolve_spell", DissolveSpell.class);
SpellRegistry.registerSpell("steadfast_spell", SteadfastSpell.class);
SpellRegistry.registerSpell("flame_spell", FlameSpell.class);
SpellRegistry.registerSpell("levitate_spell", LevitateSpell.class);
SpellRegistry.registerSpell("teleport_spell", TeleportSpell.class);
SpellRegistry.registerSpell("inward_spell", InwardSpell.class);
return id;
}
}

View File

@ -1,6 +1,5 @@
package com.thebrokenrail.sorcerycraft.spell;
import com.thebrokenrail.sorcerycraft.SorceryCraft;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
@ -8,6 +7,7 @@ import net.minecraft.nbt.Tag;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import java.util.HashMap;
import java.util.Map;
@ -15,7 +15,7 @@ import java.util.Map;
public class SpellTag {
public static final String SPELL_TAG = "Spells";
public static void setSpells(ItemStack itemStack, Map<String, Integer> map) {
public static void setSpells(ItemStack itemStack, Map<Identifier, Integer> map) {
CompoundTag tag;
if (itemStack.hasTag()) {
tag = itemStack.getTag();
@ -30,12 +30,12 @@ public class SpellTag {
itemStack.setTag(tag);
}
public static ListTag createSpellsTag(Map<String, Integer> map) {
public static ListTag createSpellsTag(Map<Identifier, Integer> map) {
ListTag spells = new ListTag();
for (Map.Entry<String, Integer> entry : map.entrySet()) {
for (Map.Entry<Identifier, Integer> entry : map.entrySet()) {
CompoundTag spell = new CompoundTag();
spell.putString("id", entry.getKey());
spell.putString("id", entry.getKey().toString());
spell.putInt("level", entry.getValue());
spells.add(spell);
}
@ -43,11 +43,11 @@ public class SpellTag {
return spells;
}
public static Map<String, Integer> getSpells(ItemStack itemStack) {
public static Map<Identifier, Integer> getSpells(ItemStack itemStack) {
return getSpells(itemStack.getTag());
}
public static Map<String, Integer> getSpells(CompoundTag tag) {
public static Map<Identifier, Integer> getSpells(CompoundTag tag) {
if (tag == null) {
tag = new CompoundTag();
tag.put(SPELL_TAG, new ListTag());
@ -60,11 +60,11 @@ public class SpellTag {
spells = new ListTag();
}
Map<String, Integer> map = new HashMap<>();
Map<Identifier, Integer> map = new HashMap<>();
for (int i = 0; i < spells.size(); i++) {
CompoundTag spell = spells.getCompound(i);
String id = spell.getString("id");
Identifier id = new Identifier(spell.getString("id"));
int level = spell.getInt("level");
if (map.get(id) == null || map.get(id) < level) {
map.put(id, level);
@ -74,8 +74,8 @@ public class SpellTag {
return map;
}
public static Text getTranslatedSpell(String id, int level) {
Text text = new TranslatableText("spell." + SorceryCraft.NAMESPACE + '.' + id);
public static Text getTranslatedSpell(Identifier id, int level) {
Text text = new TranslatableText("spell." + id.getNamespace() + '.' + id.getPath());
text.formatted(Formatting.GRAY);
if (level != 0 || SpellRegistry.getMaxLevel(id) != 1) {
text.append(" ").append(new TranslatableText("enchantment.level." + (level + 1)));

View File

@ -0,0 +1,27 @@
package com.thebrokenrail.sorcerycraft.spell;
import com.thebrokenrail.sorcerycraft.SorceryCraft;
import net.minecraft.util.Identifier;
@SuppressWarnings("unused")
public class Spells {
public static final Identifier HEAL_SPELL;
public static final Identifier DAMAGE_SPELL;
public static final Identifier DISSOLVE_SPELL;
public static final Identifier STEADFAST_SPELL;
public static final Identifier FLAME_SPELL;
public static final Identifier LEVITATE_SPELL;
public static final Identifier TELEPORT_SPELL;
public static final Identifier INWARD_SPELL;
static {
HEAL_SPELL = SpellRegistry.registerSpell(new Identifier(SorceryCraft.NAMESPACE, "heal_spell"), HealSpell.class);
DAMAGE_SPELL = SpellRegistry.registerSpell(new Identifier(SorceryCraft.NAMESPACE, "damage_spell"), DamageSpell.class);
DISSOLVE_SPELL = SpellRegistry.registerSpell(new Identifier(SorceryCraft.NAMESPACE, "dissolve_spell"), DissolveSpell.class);
STEADFAST_SPELL = SpellRegistry.registerSpell(new Identifier(SorceryCraft.NAMESPACE, "steadfast_spell"), SteadfastSpell.class);
FLAME_SPELL = SpellRegistry.registerSpell(new Identifier(SorceryCraft.NAMESPACE, "flame_spell"), FlameSpell.class);
LEVITATE_SPELL = SpellRegistry.registerSpell(new Identifier(SorceryCraft.NAMESPACE, "levitate_spell"), LevitateSpell.class);
TELEPORT_SPELL = SpellRegistry.registerSpell(new Identifier(SorceryCraft.NAMESPACE, "teleport_spell"), TeleportSpell.class);
INWARD_SPELL = SpellRegistry.registerSpell(new Identifier(SorceryCraft.NAMESPACE, "inward_spell"), InwardSpell.class);
}
}

View File

@ -3,14 +3,16 @@ package com.thebrokenrail.sorcerycraft.spell;
import net.minecraft.entity.Entity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
public class SteadfastSpell extends Spell {
public SteadfastSpell(String id, int level) {
public SteadfastSpell(Identifier id, int level) {
super(id, level);
}
@Override
public void execute(Entity target, Entity source, Entity attacker) {
// NOOP
}
@Override

View File

@ -2,16 +2,16 @@ 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.Identifier;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
public class TeleportSpell extends Spell {
public TeleportSpell(String id, int level) {
public TeleportSpell(Identifier id, int level) {
super(id, level);
}

View File

@ -6,7 +6,6 @@
"container.sorcerycraft.spells": "Spells",
"chat.sorcerycraft.new_spell": "%s has learned the spell %s",
"entity.sorcerycraft.spell": "Spell",
"command.sorcerycraft.spell.invalid_action": "Invalid sub-command \"%s\"",
"command.sorcerycraft.spell.cleared_spells": "All spells cleared from %s",
"command.sorcerycraft.spell.listing_spells": "%s knows the following spells:",
"spell.sorcerycraft.damage_spell": "Damage",
@ -15,5 +14,6 @@
"spell.sorcerycraft.steadfast_spell": "Steadfast",
"spell.sorcerycraft.flame_spell": "Flame",
"spell.sorcerycraft.levitate_spell": "Levitate",
"spell.sorcerycraft.teleport_spell": "Teleport"
"spell.sorcerycraft.teleport_spell": "Teleport",
"spell.sorcerycraft.inward_spell": "Inward"
}