Add ability to restore ruined spell books with the imbuement altar
For now this ignores dust elements but may change this in future
This commit is contained in:
@@ -139,6 +139,7 @@ public class BlockImbuementAltar extends Block implements ITileEntityProvider {
|
|||||||
ItemStack stack = toInsert.copy();
|
ItemStack stack = toInsert.copy();
|
||||||
stack.setCount(1);
|
stack.setCount(1);
|
||||||
((TileEntityImbuementAltar)tileEntity).setStack(stack);
|
((TileEntityImbuementAltar)tileEntity).setStack(stack);
|
||||||
|
((TileEntityImbuementAltar)tileEntity).setLastUser(player);
|
||||||
if(!player.isCreative()) toInsert.shrink(1);
|
if(!player.isCreative()) toInsert.shrink(1);
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
@@ -150,6 +151,7 @@ public class BlockImbuementAltar extends Block implements ITileEntityProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
((TileEntityImbuementAltar)tileEntity).setStack(ItemStack.EMPTY);
|
((TileEntityImbuementAltar)tileEntity).setStack(ItemStack.EMPTY);
|
||||||
|
((TileEntityImbuementAltar)tileEntity).setLastUser(null);
|
||||||
|
|
||||||
if(currentStack.getItem() instanceof ItemWizardArmour && ((ItemWizardArmour)currentStack.getItem()).element != null){
|
if(currentStack.getItem() instanceof ItemWizardArmour && ((ItemWizardArmour)currentStack.getItem()).element != null){
|
||||||
// Not perfect since we don't know if the player actually imbued the armour, but it's good enough for now
|
// Not perfect since we don't know if the player actually imbued the armour, but it's good enough for now
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ public final class WizardryLoot {
|
|||||||
|
|
||||||
//public static final String FROM_SPAWNER_NBT_FLAG = "fromSpawner";
|
//public static final String FROM_SPAWNER_NBT_FLAG = "fromSpawner";
|
||||||
|
|
||||||
|
public static final ResourceLocation RUINED_SPELL_BOOK_LOOT_TABLE = new ResourceLocation(Wizardry.MODID, "gameplay/imbuement_altar/ruined_spell_book");
|
||||||
|
|
||||||
private WizardryLoot(){} // No instances!
|
private WizardryLoot(){} // No instances!
|
||||||
|
|
||||||
/** Called from the preInit method in the main mod class to register the custom dungeon loot. */
|
/** Called from the preInit method in the main mod class to register the custom dungeon loot. */
|
||||||
@@ -69,6 +71,7 @@ public final class WizardryLoot {
|
|||||||
LootTableList.register(new ResourceLocation(Wizardry.MODID, "entities/mob_additions"));
|
LootTableList.register(new ResourceLocation(Wizardry.MODID, "entities/mob_additions"));
|
||||||
LootTableList.register(new ResourceLocation(Wizardry.MODID, "gameplay/fishing/junk_additions"));
|
LootTableList.register(new ResourceLocation(Wizardry.MODID, "gameplay/fishing/junk_additions"));
|
||||||
LootTableList.register(new ResourceLocation(Wizardry.MODID, "gameplay/fishing/treasure_additions"));
|
LootTableList.register(new ResourceLocation(Wizardry.MODID, "gameplay/fishing/treasure_additions"));
|
||||||
|
LootTableList.register(RUINED_SPELL_BOOK_LOOT_TABLE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,10 +6,12 @@ import electroblob.wizardry.item.IManaStoringItem;
|
|||||||
import electroblob.wizardry.item.ItemWizardArmour;
|
import electroblob.wizardry.item.ItemWizardArmour;
|
||||||
import electroblob.wizardry.registry.WizardryBlocks;
|
import electroblob.wizardry.registry.WizardryBlocks;
|
||||||
import electroblob.wizardry.registry.WizardryItems;
|
import electroblob.wizardry.registry.WizardryItems;
|
||||||
|
import electroblob.wizardry.registry.WizardryLoot;
|
||||||
import electroblob.wizardry.registry.WizardrySounds;
|
import electroblob.wizardry.registry.WizardrySounds;
|
||||||
import electroblob.wizardry.util.GeometryUtils;
|
import electroblob.wizardry.util.GeometryUtils;
|
||||||
import electroblob.wizardry.util.ParticleBuilder;
|
import electroblob.wizardry.util.ParticleBuilder;
|
||||||
import electroblob.wizardry.util.ParticleBuilder.Type;
|
import electroblob.wizardry.util.ParticleBuilder.Type;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
@@ -20,9 +22,14 @@ import net.minecraft.util.EnumFacing;
|
|||||||
import net.minecraft.util.ITickable;
|
import net.minecraft.util.ITickable;
|
||||||
import net.minecraft.util.SoundCategory;
|
import net.minecraft.util.SoundCategory;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
import net.minecraft.world.WorldServer;
|
||||||
|
import net.minecraft.world.storage.loot.LootContext;
|
||||||
|
import net.minecraft.world.storage.loot.LootTable;
|
||||||
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class TileEntityImbuementAltar extends TileEntity implements ITickable {
|
public class TileEntityImbuementAltar extends TileEntity implements ITickable {
|
||||||
|
|
||||||
@@ -31,6 +38,7 @@ public class TileEntityImbuementAltar extends TileEntity implements ITickable {
|
|||||||
private ItemStack stack;
|
private ItemStack stack;
|
||||||
private int imbuementTimer;
|
private int imbuementTimer;
|
||||||
private Element displayElement;
|
private Element displayElement;
|
||||||
|
private EntityPlayer lastUser;
|
||||||
|
|
||||||
public TileEntityImbuementAltar(){
|
public TileEntityImbuementAltar(){
|
||||||
stack = ItemStack.EMPTY;
|
stack = ItemStack.EMPTY;
|
||||||
@@ -41,6 +49,10 @@ public class TileEntityImbuementAltar extends TileEntity implements ITickable {
|
|||||||
checkRecipe();
|
checkRecipe();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setLastUser(EntityPlayer player){
|
||||||
|
this.lastUser = player;
|
||||||
|
}
|
||||||
|
|
||||||
public void checkRecipe(){
|
public void checkRecipe(){
|
||||||
|
|
||||||
if(getResult().isEmpty()){
|
if(getResult().isEmpty()){
|
||||||
@@ -144,6 +156,26 @@ public class TileEntityImbuementAltar extends TileEntity implements ITickable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(stack.getItem() == WizardryItems.ruined_spell_book){
|
||||||
|
|
||||||
|
if(!ArrayUtils.contains(getReceptacleElements(), null)){ // All receptacles filled (any element)
|
||||||
|
|
||||||
|
if(imbuementTimer >= IMBUEMENT_DURATION - 1 && world instanceof WorldServer){
|
||||||
|
|
||||||
|
LootTable table = this.world.getLootTableManager().getLootTableFromLocation(WizardryLoot.RUINED_SPELL_BOOK_LOOT_TABLE);
|
||||||
|
LootContext context = new LootContext.Builder((WorldServer)world).withPlayer(lastUser)
|
||||||
|
.withLuck(lastUser == null ? 0 : lastUser.getLuck()).build();
|
||||||
|
|
||||||
|
List<ItemStack> stacks = table.generateLootForPools(world.rand, context);
|
||||||
|
return stacks.isEmpty() ? ItemStack.EMPTY : stacks.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
displayElement = Element.MAGIC;
|
||||||
|
|
||||||
|
return new ItemStack(WizardryItems.spell_book); // No point generating loot every tick just to check the recipe
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
displayElement = null;
|
displayElement = null;
|
||||||
return ItemStack.EMPTY;
|
return ItemStack.EMPTY;
|
||||||
}
|
}
|
||||||
@@ -187,6 +219,7 @@ public class TileEntityImbuementAltar extends TileEntity implements ITickable {
|
|||||||
stack.writeToNBT(itemTag);
|
stack.writeToNBT(itemTag);
|
||||||
nbt.setTag("item", itemTag);
|
nbt.setTag("item", itemTag);
|
||||||
nbt.setInteger("imbuementTimer", imbuementTimer);
|
nbt.setInteger("imbuementTimer", imbuementTimer);
|
||||||
|
if(lastUser != null) nbt.setUniqueId("lastUser", lastUser.getUniqueID());
|
||||||
return nbt;
|
return nbt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,6 +229,7 @@ public class TileEntityImbuementAltar extends TileEntity implements ITickable {
|
|||||||
NBTTagCompound itemTag = nbt.getCompoundTag("item");
|
NBTTagCompound itemTag = nbt.getCompoundTag("item");
|
||||||
this.stack = new ItemStack(itemTag);
|
this.stack = new ItemStack(itemTag);
|
||||||
this.imbuementTimer = nbt.getInteger("imbuementTimer");
|
this.imbuementTimer = nbt.getInteger("imbuementTimer");
|
||||||
|
this.lastUser = world.getPlayerEntityByUUID(nbt.getUniqueId("lastUser"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"display": {
|
||||||
|
"title": {
|
||||||
|
"translate": "advancement.ebwizardry:restore_ruined_book"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"translate": "advancement.ebwizardry:restore_ruined_book.desc"
|
||||||
|
},
|
||||||
|
"icon": {
|
||||||
|
"item": "ebwizardry:ruined_spell_book"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"parent": "ebwizardry:restore_imbuement_altar",
|
||||||
|
"criteria": {
|
||||||
|
"criteria_0": {
|
||||||
|
"trigger": "ebwizardry:restore_ruined_book"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -693,6 +693,8 @@ advancement.ebwizardry\:restore_imbuement_altar=Good As New
|
|||||||
advancement.ebwizardry\:restore_imbuement_altar.desc=Restore an imbuement altar to its former glory
|
advancement.ebwizardry\:restore_imbuement_altar.desc=Restore an imbuement altar to its former glory
|
||||||
advancement.ebwizardry\:create_elemental_armour=Changing Clothes
|
advancement.ebwizardry\:create_elemental_armour=Changing Clothes
|
||||||
advancement.ebwizardry\:create_elemental_armour.desc=Imbue a piece of wizard armour with spectral dust of one of the arcane elements
|
advancement.ebwizardry\:create_elemental_armour.desc=Imbue a piece of wizard armour with spectral dust of one of the arcane elements
|
||||||
|
advancement.ebwizardry\:restore_ruined_book=Arcane Archaeologist
|
||||||
|
advancement.ebwizardry\:restore_ruined_book.desc=Restore a ruined spell book at an imbuement altar
|
||||||
advancement.ebwizardry\:craft_lectern=Arcane Encyclopaedia
|
advancement.ebwizardry\:craft_lectern=Arcane Encyclopaedia
|
||||||
advancement.ebwizardry\:craft_lectern.desc=Craft a lectern to keep track of your spell library
|
advancement.ebwizardry\:craft_lectern.desc=Craft a lectern to keep track of your spell library
|
||||||
|
|
||||||
|
|||||||
@@ -693,6 +693,8 @@ advancement.ebwizardry\:restore_imbuement_altar=Good As New
|
|||||||
advancement.ebwizardry\:restore_imbuement_altar.desc=Restore an imbuement altar to its former glory
|
advancement.ebwizardry\:restore_imbuement_altar.desc=Restore an imbuement altar to its former glory
|
||||||
advancement.ebwizardry\:create_elemental_armour=Changing Clothes
|
advancement.ebwizardry\:create_elemental_armour=Changing Clothes
|
||||||
advancement.ebwizardry\:create_elemental_armour.desc=Imbue a piece of wizard armor with spectral dust of one of the arcane elements
|
advancement.ebwizardry\:create_elemental_armour.desc=Imbue a piece of wizard armor with spectral dust of one of the arcane elements
|
||||||
|
advancement.ebwizardry\:restore_ruined_book=Arcane Archaeologist
|
||||||
|
advancement.ebwizardry\:restore_ruined_book.desc=Restore a ruined spell book at an imbuement altar
|
||||||
advancement.ebwizardry\:craft_lectern=Arcane Encyclopedia
|
advancement.ebwizardry\:craft_lectern=Arcane Encyclopedia
|
||||||
advancement.ebwizardry\:craft_lectern.desc=Craft a lectern to keep track of your spell library
|
advancement.ebwizardry\:craft_lectern.desc=Craft a lectern to keep track of your spell library
|
||||||
|
|
||||||
|
|||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"pools": [
|
||||||
|
{
|
||||||
|
"name": "spell_book",
|
||||||
|
"rolls": 1,
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "item",
|
||||||
|
"name": "ebwizardry:spell_book",
|
||||||
|
"weight": 1,
|
||||||
|
"functions": [
|
||||||
|
{
|
||||||
|
"function": "ebwizardry:random_spell",
|
||||||
|
"undiscovered_bias": 0.3
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user