1
0
mirror of https://github.com/essentials/Essentials.git synced 2025-02-24 16:32:35 +01:00

Enchantments in CraftBukkit are still broken, but it works with Essentials :)

This commit is contained in:
snowleo 2011-11-27 10:02:41 +01:00
parent 77c283f47e
commit fc201c8b77
8 changed files with 83 additions and 10 deletions

View File

@ -1,5 +1,6 @@
package com.earth2me.essentials;
import com.earth2me.essentials.craftbukkit.EnchantmentFix;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.textreader.IText;
import com.earth2me.essentials.textreader.KeywordReplacer;
@ -114,7 +115,7 @@ public class EssentialsPlayerListener extends PlayerListener
}
if (user.getSavedInventory() != null)
{
user.getInventory().setContents(user.getSavedInventory());
EnchantmentFix.setContents(user.getInventory(), user.getSavedInventory());
user.setSavedInventory(null);
}
user.updateActivity(false);

View File

@ -1,5 +1,6 @@
package com.earth2me.essentials;
import com.earth2me.essentials.craftbukkit.EnchantmentFix;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Location;
@ -145,13 +146,13 @@ public final class InventoryWorkaround
{
ItemStack stack = item.clone();
stack.setAmount(item.getType().getMaxStackSize());
cinventory.setItem(firstFree, stack);
EnchantmentFix.setItem(cinventory, firstFree, stack);
item.setAmount(item.getAmount() - item.getType().getMaxStackSize());
}
else
{
// Just store it
cinventory.setItem(firstFree, item);
EnchantmentFix.setItem(cinventory, firstFree, item);
break;
}
}
@ -230,7 +231,7 @@ public final class InventoryWorkaround
{
// split the stack and store
itemStack.setAmount(amount - toDelete);
cinventory.setItem(first, itemStack);
EnchantmentFix.setItem(cinventory, first, itemStack);
toDelete = 0;
}
}

View File

@ -2,6 +2,7 @@ package com.earth2me.essentials.commands;
import com.earth2me.essentials.User;
import com.earth2me.essentials.Util;
import com.earth2me.essentials.craftbukkit.EnchantmentFix;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
@ -97,7 +98,7 @@ public class Commandenchant extends EssentialsCommand
level = enchantment.getMaxLevel();
}
stack.addEnchantment(enchantment, level);
user.setItemInHand(stack);
EnchantmentFix.setItemInHand(user.getInventory(), stack);
user.updateInventory();
final String enchantmentName = enchantment.getName().toLowerCase(Locale.ENGLISH);
user.sendMessage(_("enchantmentApplied", enchantmentName.replace('_', ' ')));

View File

@ -1,5 +1,6 @@
package com.earth2me.essentials.commands;
import com.earth2me.essentials.InventoryWorkaround;
import com.earth2me.essentials.User;
import java.util.Locale;
import org.bukkit.ChatColor;
@ -76,7 +77,7 @@ public class Commandgive extends EssentialsCommand
final User giveTo = getPlayer(server, args, 0);
final String itemName = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace('_', ' ');
sender.sendMessage(ChatColor.BLUE + "Giving " + stack.getAmount() + " of " + itemName + " to " + giveTo.getDisplayName() + ".");
giveTo.getInventory().addItem(stack);
InventoryWorkaround.addItem(giveTo.getInventory(), true, stack);
giveTo.updateInventory();
}
}

View File

@ -2,6 +2,7 @@ package com.earth2me.essentials.commands;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.User;
import com.earth2me.essentials.craftbukkit.EnchantmentFix;
import java.util.Arrays;
import org.bukkit.Server;
import org.bukkit.inventory.ItemStack;
@ -29,7 +30,7 @@ public class Commandinvsee extends EssentialsCommand
}
if (invUser == user && user.getSavedInventory() != null)
{
invUser.getInventory().setContents(user.getSavedInventory());
EnchantmentFix.setContents(invUser.getInventory(), user.getSavedInventory());
user.setSavedInventory(null);
user.sendMessage(_("invRestored"));
throw new NoChargeException();
@ -49,7 +50,7 @@ public class Commandinvsee extends EssentialsCommand
{
throw new Exception(_("invBigger"));
}
user.getInventory().setContents(invUserStack);
EnchantmentFix.setContents(user.getInventory(), invUserStack);
user.sendMessage(_("invSee", invUser.getDisplayName()));
user.sendMessage(_("invSeeHelp"));
throw new NoChargeException();

View File

@ -1,5 +1,6 @@
package com.earth2me.essentials.commands;
import com.earth2me.essentials.InventoryWorkaround;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.User;
import java.util.Locale;
@ -71,7 +72,7 @@ public class Commanditem extends EssentialsCommand
final String displayName = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace('_', ' ');
user.sendMessage(_("itemSpawn", stack.getAmount(), displayName));
user.getInventory().addItem(stack);
InventoryWorkaround.addItem(user.getInventory(), true, stack);
user.updateInventory();
}
}

View File

@ -1,5 +1,6 @@
package com.earth2me.essentials.commands;
import com.earth2me.essentials.InventoryWorkaround;
import static com.earth2me.essentials.I18n._;
import com.earth2me.essentials.Trade;
import com.earth2me.essentials.User;
@ -113,7 +114,7 @@ public class Commandkit extends EssentialsCommand
final int id = Material.getMaterial(Integer.parseInt(parts[0])).getId();
final int amount = parts.length > 1 ? Integer.parseInt(parts[parts.length > 2 ? 2 : 1]) : 1;
final short data = parts.length > 2 ? Short.parseShort(parts[1]) : 0;
final HashMap<Integer, ItemStack> overfilled = user.getInventory().addItem(new ItemStack(id, amount, data));
final Map<Integer, ItemStack> overfilled = InventoryWorkaround.addItem(user.getInventory(), true, new ItemStack(id, amount, data));
for (ItemStack itemStack : overfilled.values())
{
user.getWorld().dropItemNaturally(user.getLocation(), itemStack);

View File

@ -0,0 +1,66 @@
package com.earth2me.essentials.craftbukkit;
import org.bukkit.craftbukkit.inventory.CraftInventory;
import org.bukkit.craftbukkit.inventory.CraftInventoryPlayer;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
public class EnchantmentFix
{
public static void setContents(Inventory inventory, ItemStack[] items)
{
CraftInventory cInventory = (CraftInventory)inventory;
if (cInventory.getContents().length != items.length)
{
throw new IllegalArgumentException("Invalid inventory size; expected " + cInventory.getContents().length);
}
net.minecraft.server.ItemStack[] mcItems = cInventory.getInventory().getContents();
for (int i = 0; i < items.length; i++)
{
ItemStack item = items[i];
if (item == null || item.getTypeId() <= 0)
{
mcItems[i] = null;
}
else
{
mcItems[i] = new net.minecraft.server.ItemStack(item.getTypeId(), item.getAmount(), item.getDurability());
new CraftItemStack(mcItems[i]).addUnsafeEnchantments(item.getEnchantments());
}
}
}
public static void setItem(Inventory inventory, int index, ItemStack item)
{
CraftInventory cInventory = (CraftInventory)inventory;
if (item == null)
{
cInventory.getInventory().setItem(index, null);
}
else
{
net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(item.getTypeId(), item.getAmount(), item.getDurability());
new CraftItemStack(stack).addUnsafeEnchantments(item.getEnchantments());
cInventory.getInventory().setItem(index, stack);
}
}
public static void setItemInHand(Inventory inventory, ItemStack item)
{
CraftInventoryPlayer cInventory = (CraftInventoryPlayer)inventory;
if (item == null)
{
cInventory.getInventory().setItem(cInventory.getInventory().itemInHandIndex, null);
}
else
{
net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(item.getTypeId(), item.getAmount(), item.getDurability());
new CraftItemStack(stack).addUnsafeEnchantments(item.getEnchantments());
cInventory.getInventory().setItem(cInventory.getInventory().itemInHandIndex, stack);
}
}
}