SPIGOT-2272: Add API for virtual Merchants
By: Lukas Hennig <lukas@wirsindwir.de>
This commit is contained in:
@@ -8,8 +8,10 @@ import net.minecraft.server.*;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.inventory.MainHand;
|
||||
import org.bukkit.inventory.Merchant;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
import org.bukkit.entity.Villager;
|
||||
import org.bukkit.event.inventory.InventoryType;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryView;
|
||||
@@ -22,8 +24,8 @@ import org.bukkit.craftbukkit.inventory.CraftInventory;
|
||||
import org.bukkit.craftbukkit.inventory.CraftInventoryPlayer;
|
||||
import org.bukkit.craftbukkit.inventory.CraftInventoryView;
|
||||
import org.bukkit.craftbukkit.inventory.CraftItemStack;
|
||||
import org.bukkit.craftbukkit.inventory.CraftMerchant;
|
||||
import org.bukkit.craftbukkit.CraftServer;
|
||||
import org.bukkit.entity.Villager;
|
||||
import org.bukkit.inventory.EntityEquipment;
|
||||
import org.bukkit.permissions.PermissibleBase;
|
||||
import org.bukkit.permissions.Permission;
|
||||
@@ -357,16 +359,32 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
|
||||
@Override
|
||||
public InventoryView openMerchant(Villager villager, boolean force) {
|
||||
Preconditions.checkNotNull(villager, "villager cannot be null");
|
||||
if (!force && villager.isTrading()) {
|
||||
|
||||
return this.openMerchant(villager, force);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InventoryView openMerchant(Merchant merchant, boolean force) {
|
||||
Preconditions.checkNotNull(merchant, "merchant cannot be null");
|
||||
|
||||
if (!force && merchant.isTrading()) {
|
||||
return null;
|
||||
} else if (villager.isTrading()) {
|
||||
// we're not supposed to have multiple people using the same villager, so we have to close it.
|
||||
villager.getTrader().closeInventory();
|
||||
} else if (merchant.isTrading()) {
|
||||
// we're not supposed to have multiple people using the same merchant, so we have to close it.
|
||||
merchant.getTrader().closeInventory();
|
||||
}
|
||||
|
||||
EntityVillager ev = ((CraftVillager) villager).getHandle();
|
||||
ev.setTradingPlayer(this.getHandle());
|
||||
this.getHandle().openTrade(ev);
|
||||
IMerchant mcMerchant;
|
||||
if (merchant instanceof CraftVillager) {
|
||||
mcMerchant = ((CraftVillager) merchant).getHandle();
|
||||
} else if (merchant instanceof CraftMerchant) {
|
||||
mcMerchant = ((CraftMerchant) merchant).getMerchant();
|
||||
} else {
|
||||
throw new IllegalArgumentException("Can't open merchant " + merchant.toString());
|
||||
}
|
||||
|
||||
mcMerchant.setTradingPlayer(this.getHandle());
|
||||
this.getHandle().openTrade(mcMerchant);
|
||||
|
||||
return this.getHandle().activeContainer.getBukkitView();
|
||||
}
|
||||
|
||||
@@ -1,16 +1,11 @@
|
||||
package org.bukkit.craftbukkit.entity;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.Lists;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import net.minecraft.server.EntityHuman;
|
||||
import net.minecraft.server.EntityVillager;
|
||||
import net.minecraft.server.MerchantRecipeList;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.craftbukkit.CraftServer;
|
||||
import org.bukkit.craftbukkit.inventory.CraftInventory;
|
||||
import org.bukkit.craftbukkit.inventory.CraftMerchantRecipe;
|
||||
import org.bukkit.craftbukkit.inventory.CraftMerchant;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
import org.bukkit.entity.Villager;
|
||||
@@ -20,6 +15,8 @@ import org.bukkit.inventory.MerchantRecipe;
|
||||
|
||||
public class CraftVillager extends CraftAgeable implements Villager, InventoryHolder {
|
||||
|
||||
private CraftMerchant merchant;
|
||||
|
||||
public CraftVillager(CraftServer server, EntityVillager entity) {
|
||||
super(server, entity);
|
||||
}
|
||||
@@ -53,38 +50,33 @@ public class CraftVillager extends CraftAgeable implements Villager, InventoryHo
|
||||
return new CraftInventory(getHandle().inventory);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MerchantRecipe> getRecipes() {
|
||||
return Collections.unmodifiableList(Lists.transform(getHandle().getOffers(null), new Function<net.minecraft.server.MerchantRecipe, MerchantRecipe>() {
|
||||
@Override
|
||||
public MerchantRecipe apply(net.minecraft.server.MerchantRecipe recipe) {
|
||||
return recipe.asBukkit();
|
||||
}
|
||||
}));
|
||||
private CraftMerchant getMerchant() {
|
||||
return (merchant == null) ? merchant = new CraftMerchant(getHandle()) : merchant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRecipes(List<MerchantRecipe> list) {
|
||||
MerchantRecipeList recipes = getHandle().getOffers(null);
|
||||
recipes.clear();
|
||||
for (MerchantRecipe m : list) {
|
||||
recipes.add(CraftMerchantRecipe.fromBukkit(m).toMinecraft());
|
||||
}
|
||||
public List<MerchantRecipe> getRecipes() {
|
||||
return getMerchant().getRecipes();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRecipes(List<MerchantRecipe> recipes) {
|
||||
this.getMerchant().setRecipes(recipes);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MerchantRecipe getRecipe(int i) {
|
||||
return getHandle().getOffers(null).get(i).asBukkit();
|
||||
return getMerchant().getRecipe(i);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRecipe(int i, MerchantRecipe merchantRecipe) {
|
||||
getHandle().getOffers(null).set(i, CraftMerchantRecipe.fromBukkit(merchantRecipe).toMinecraft());
|
||||
getMerchant().setRecipe(i, merchantRecipe);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRecipeCount() {
|
||||
return getHandle().getOffers(null).size();
|
||||
return getMerchant().getRecipeCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -94,8 +86,7 @@ public class CraftVillager extends CraftAgeable implements Villager, InventoryHo
|
||||
|
||||
@Override
|
||||
public HumanEntity getTrader() {
|
||||
EntityHuman eh = getHandle().getTrader();
|
||||
return eh == null ? null : eh.getBukkitEntity();
|
||||
return getMerchant().getTrader();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user