Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# This is required to provide enough memory for the Minecraft decompilation process.
org.gradle.jvmargs=-Xmx4G
name=RockyTweaks
mod_version=0.6.1-SNAPSHOT
mod_version=0.7.0
mc_version=1.12.2
mcp_mappings=20171003-1.12
forge_version=14.23.5.2855
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,24 @@
import com.google.common.collect.Lists;
import crafttweaker.CraftTweakerAPI;
import crafttweaker.mc1120.commands.CraftTweakerCommand;

import java.lang.reflect.Field;
import java.util.List;
import javax.annotation.Nullable;
import net.minecraft.command.ICommandSender;
import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.world.storage.MapDecoration;
import net.minecraftforge.fml.common.registry.VillagerRegistry;
import org.apache.commons.lang3.text.StrBuilder;

import static rocks.gameonthe.rockytweaks.crafttweaker.merchant.VillagerHelper.TREASURE_MAP_TRADE;

public class MerchantCommand extends CraftTweakerCommand {

private final List<String> arguments = Lists.newArrayList("professions", "careers"); // TODO: Add "trades"
private final List<String> arguments = Lists.newArrayList("professions", "careers", "trades");

public MerchantCommand() {
super("merchant");
Expand Down Expand Up @@ -54,11 +60,11 @@ public void executeCommand(MinecraftServer server, ICommandSender sender, String
if (profession == null) {
VillagerHelper.getVillagerProfessions().forEach(p -> {
builder.append(p.getRegistryName()).appendNewLine();
VillagerHelper.getVillagerCareers(p).forEach(c -> builder.append(" - ").append(c.getName()).appendNewLine());
VillagerHelper.getProfessionCareers(p).forEach(c -> builder.append(" - ").append(c.getName()).appendNewLine());
});
} else {
builder.append(profession.getRegistryName()).appendNewLine();
VillagerHelper.getVillagerCareers(profession).forEach(c -> builder.append(" - ").append(c.getName()).appendNewLine());
VillagerHelper.getProfessionCareers(profession).forEach(c -> builder.append(" - ").append(c.getName()).appendNewLine());
}
CraftTweakerAPI.logCommand(builder.build());
sender.sendMessage(new TextComponentString("List generated; see crafttweaker.log in your minecraft dir."));
Expand All @@ -79,18 +85,115 @@ public void executeCommand(MinecraftServer server, ICommandSender sender, String
sender.sendMessage(new TextComponentString("Invalid career."));
}
}
if (profession == null) {
VillagerHelper.getVillagerProfessions().forEach(p -> {
VillagerHelper.getVillagerCareers(p).forEach(c -> {
// TODO: Get the Merchant Recipes ¯\_(ツ)_/¯
}
if (profession == null) {
VillagerHelper.getVillagerProfessions().forEach(p -> {
builder.append(p.getRegistryName()).appendNewLine();
VillagerHelper.getProfessionCareers(p).forEach(c -> {
builder.append(" - ").append(c.getName()).appendNewLine();

int idx = 1;
for (List<EntityVillager.ITradeList> levelTrades : VillagerHelper.getCareerTrades(c)) {
if (!levelTrades.isEmpty()) builder.append(" - Level ").append(idx++).appendNewLine();

levelTrades.forEach(tradeItem -> {
builder.append(" * ").append(buildTradeString(tradeItem)).appendNewLine();
});
}
});
});
} else if (career == null) {
builder.append(profession.getRegistryName()).appendNewLine();
VillagerHelper.getProfessionCareers(profession).forEach(c -> {
builder.append(" - ").append(c.getName()).appendNewLine();

int idx = 1;
for (List<EntityVillager.ITradeList> levelTrades : VillagerHelper.getCareerTrades(c)) {
if (!levelTrades.isEmpty()) builder.append(" - Level ").append(idx++).appendNewLine();

levelTrades.forEach(tradeItem -> {
builder.append(" * ").append(buildTradeString(tradeItem)).appendNewLine();
});
}
});
} else {
builder.append(profession.getRegistryName()).appendNewLine();
builder.append(" - ").append(career.getName()).appendNewLine();

int idx = 1;
for (List<EntityVillager.ITradeList> levelTrades : VillagerHelper.getCareerTrades(career)) {
if (!levelTrades.isEmpty()) builder.append(" - Level ").append(idx++).appendNewLine();

levelTrades.forEach(tradeItem -> {
builder.append(" * ").append(buildTradeString(tradeItem)).appendNewLine();
});
}
}
CraftTweakerAPI.logCommand(builder.build());
sender.sendMessage(new TextComponentString("List generated; see crafttweaker.log in your minecraft dir."));
} else {
sender.sendMessage(new TextComponentString("I can't even... (╯°□°)╯︵ ┻━┻"));
}
}
}

private String buildTradeString(EntityVillager.ITradeList tradeItem) {
if(tradeItem instanceof EntityVillager.EmeraldForItems) {
EntityVillager.EmeraldForItems specialized = (EntityVillager.EmeraldForItems) tradeItem;
return "[EmeraldForItems] buy: " + specialized.buyingItem.getRegistryName().toString() +
", emeralds: " + specialized.price.getFirst() + "/" + specialized.price.getSecond();
}

if(tradeItem instanceof MerchantTradeItem) {
MerchantTradeItem specialized = (MerchantTradeItem) tradeItem;
return "[MerchantTradeItem] chance: " + specialized.chance +
", buy1: " + specialized.recipe.getItemToBuy().serializeNBT().toString() +
", buy2: " + (specialized.recipe.hasSecondItemToBuy()?specialized.recipe.getSecondItemToBuy().serializeNBT().toString():"null") +
", sell: " + specialized.recipe.getItemToSell().serializeNBT().toString();
}

if(tradeItem instanceof EntityVillager.ItemAndEmeraldToItem) {
EntityVillager.ItemAndEmeraldToItem specialized = (EntityVillager.ItemAndEmeraldToItem) tradeItem;
return "[ItemAndEmeraldToItem] buy: " + specialized.buyingItemStack.serializeNBT().toString() +
", buyEmeralds: " + specialized.buyingPriceInfo.getFirst() + "/" + specialized.buyingPriceInfo.getSecond() +
", sell: " + specialized.sellingItemstack.serializeNBT().toString() +
", sellEmeralds: " + specialized.sellingPriceInfo.getFirst() + "/" + specialized.sellingPriceInfo.getSecond();
}

if(tradeItem instanceof EntityVillager.ListEnchantedBookForEmeralds) {
return "[ListEnchantedBookForEmeralds] fixedBuy: book + emeralds" +
", fixedSell: enchanted_book + enchantment?";
}

if(tradeItem instanceof EntityVillager.ListEnchantedItemForEmeralds) {
EntityVillager.ListEnchantedItemForEmeralds specialized = (EntityVillager.ListEnchantedItemForEmeralds) tradeItem;
return "[ListEnchantedItemForEmeralds] emeralds: " + specialized.priceInfo.getFirst() + "/" + specialized.priceInfo.getSecond() +
", sell: " + specialized.enchantedItemStack.serializeNBT().toString() + " + enchantment?";
}

if(tradeItem instanceof EntityVillager.ListItemForEmeralds) {
EntityVillager.ListItemForEmeralds specialized = (EntityVillager.ListItemForEmeralds) tradeItem;
return "[ListItemForEmeralds] buy: " + specialized.itemToBuy.serializeNBT().toString() +
", emeralds: " + specialized.priceInfo.getFirst() + "/" + specialized.priceInfo.getSecond();
}

if(TREASURE_MAP_TRADE.isInstance(tradeItem)) {
try {
Field value = tradeItem.getClass().getDeclaredField("value");
value.setAccessible(true);
EntityVillager.PriceInfo price = (EntityVillager.PriceInfo) value.get(tradeItem);

Field destinationType = tradeItem.getClass().getDeclaredField("destinationType");
destinationType.setAccessible(true);
MapDecoration.Type mapType = (MapDecoration.Type) destinationType.get(tradeItem);
return "[TreasureMapForEmeralds] emeralds: " + price.getFirst() + "/" + price.getSecond() +
", fixedSell: minecraft:compass" +
", buyMapFilled: " + mapType.name();
} catch (Exception e) {
return "[TreasureMapForEmeralds] Malformed???";
}
}

return "[Unknown Type] " + tradeItem.getClass().getCanonicalName();
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,27 @@
package rocks.gameonthe.rockytweaks.crafttweaker.merchant;

import com.blamejared.mtlib.helpers.LogHelper;
import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.MathHelper;
import net.minecraft.village.MerchantRecipe;
import net.minecraftforge.fml.common.registry.VillagerRegistry;


import java.util.Random;

public class MerchantTrade {

private VillagerRegistry.VillagerProfession profession;
private VillagerRegistry.VillagerCareer career;
private MerchantRecipe recipe;
public final MerchantRecipe recipe;
private int level;
private float chance;

public MerchantTrade(VillagerRegistry.VillagerProfession profession, VillagerRegistry.VillagerCareer career, ItemStack buy1, ItemStack buy2,
ItemStack sell, int level, float chance) {
this(profession, career, new MerchantRecipe(buy1, buy2, sell), level, chance);
}

public MerchantTrade(VillagerRegistry.VillagerProfession profession, VillagerRegistry.VillagerCareer career, ItemStack buy1, ItemStack buy2,
ItemStack sell, int level) {
Expand All @@ -22,26 +33,31 @@ public MerchantTrade(VillagerRegistry.VillagerProfession profession, VillagerReg
this.career = career;
this.recipe = recipe;
this.level = level;
this.chance = 100.0f;
}

public VillagerRegistry.VillagerProfession getProfession() {
return profession;
}

public VillagerRegistry.VillagerCareer getCareer() {
return career;
}

public MerchantRecipe getRecipe() {
return recipe;
public MerchantTrade(VillagerRegistry.VillagerProfession profession, VillagerRegistry.VillagerCareer career, MerchantRecipe recipe, int level, float chance) {
this.profession = profession;
this.career = career;
this.recipe = recipe;
this.level = level;
this.chance = chance;
}

public int getLevel() {
return level;
}

public void register() {
profession.getCareer(VillagerHelper.getVillagerCareers(profession).indexOf(career))
.addTrade(getLevel(), (EntityVillager.ITradeList) (merchant, recipeList, random) -> recipeList.add(getRecipe()));
try {
VillagerHelper.getCareerRef(VillagerHelper.getProfessionName(profession).toString(), career.getName())
.addTrade(getLevel(), toTradeItem());
} catch (NullPointerException e) {
LogHelper.logError(String.format("Got invalid career: %s", e.getMessage()));
}
}

private EntityVillager.ITradeList toTradeItem() {
return (EntityVillager.ITradeList) new MerchantTradeItem(this.recipe, this.chance);
}
}
Loading