Migrate the Carpet codebase to Mojang Mappings

This commit is contained in:
altrisi committed 2022-01-24 20:33:16 +01:00
1 parent a1a2488bc3
commit 06af9ce8b1
346 files changed
+8353 -8492

No files matched your search

@@ -23,70 +23,69 @@ import carpet.script.value.Value;
import carpet.script.value.ValueConversions;
import com.google.common.collect.Sets;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.command.argument.ItemStackArgument;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket;
import net.minecraft.recipe.AbstractCookingRecipe;
import net.minecraft.recipe.CuttingRecipe;
import net.minecraft.recipe.Recipe;
import net.minecraft.recipe.RecipeType;
import net.minecraft.recipe.ShapedRecipe;
import net.minecraft.recipe.ShapelessRecipe;
import net.minecraft.recipe.SpecialCraftingRecipe;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.tag.TagManager;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.registry.Registry;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import net.minecraft.commands.arguments.item.ItemInput;
import net.minecraft.core.Registry;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.tags.TagContainer;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.AbstractCookingRecipe;
import net.minecraft.world.item.crafting.CustomRecipe;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.item.crafting.ShapedRecipe;
import net.minecraft.world.item.crafting.ShapelessRecipe;
import net.minecraft.world.item.crafting.SingleItemRecipe;
import net.minecraft.world.phys.Vec3;
public class Inventories {
public static void apply(Expression expression)
{
expression.addUnaryFunction("stack_limit", v ->
new NumericValue(NBTSerializableValue.parseItem(v.getString()).getItem().getMaxCount()));
new NumericValue(NBTSerializableValue.parseItem(v.getString()).getItem().getMaxStackSize()));
expression.addUnaryFunction("item_category", v ->
{
ItemStackArgument item = NBTSerializableValue.parseItem(v.getString());
ItemGroup ig = item.getItem().getGroup();
return (ig==null)?Value.NULL:new StringValue(ig.getName());
ItemInput item = NBTSerializableValue.parseItem(v.getString());
CreativeModeTab ig = item.getItem().getItemCategory();
return (ig==null)?Value.NULL:new StringValue(ig.getRecipeFolderName());
});
expression.addContextFunction("item_list", -1, (c, t, lv) ->
{
if (lv.size() == 0)
return ListValue.wrap(Registry.ITEM.getIds().stream().map(ValueConversions::of).collect(Collectors.toList()));
return ListValue.wrap(Registry.ITEM.keySet().stream().map(ValueConversions::of).collect(Collectors.toList()));
CarpetContext cc = (CarpetContext)c;
TagManager tagManager = cc.s.getServer().getTagManager();
TagContainer tagManager = cc.s.getServer().getTags();
String tag = lv.get(0).getString();
net.minecraft.tag.Tag<Item> itemTag = tagManager.getOrCreateTagGroup(Registry.ITEM_KEY).getTag(InputValidator.identifierOf(tag));
net.minecraft.tags.Tag<Item> itemTag = tagManager.getOrEmpty(Registry.ITEM_REGISTRY).getTag(InputValidator.identifierOf(tag));
if (itemTag == null) return Value.NULL;
return ListValue.wrap(itemTag.values().stream().map(b -> ValueConversions.of(Registry.ITEM.getId(b))).collect(Collectors.toList()));
return ListValue.wrap(itemTag.getValues().stream().map(b -> ValueConversions.of(Registry.ITEM.getKey(b))).collect(Collectors.toList()));
});
expression.addContextFunction("item_tags", -1, (c, t, lv) ->
{
CarpetContext cc = (CarpetContext)c;
TagManager tagManager = cc.s.getServer().getTagManager();
TagContainer tagManager = cc.s.getServer().getTags();
if (lv.size() == 0)
return ListValue.wrap(tagManager.getOrCreateTagGroup(Registry.ITEM_KEY).getTagIds().stream().map(ValueConversions::of).collect(Collectors.toList()));
return ListValue.wrap(tagManager.getOrEmpty(Registry.ITEM_REGISTRY).getAvailableTags().stream().map(ValueConversions::of).collect(Collectors.toList()));
Item item = NBTSerializableValue.parseItem(lv.get(0).getString()).getItem();
if (lv.size() == 1)
return ListValue.wrap(tagManager.getOrCreateTagGroup(Registry.ITEM_KEY).getTags().entrySet().stream().filter(e -> e.getValue().contains(item)).map(e -> ValueConversions.of(e.getKey())).collect(Collectors.toList()));
return ListValue.wrap(tagManager.getOrEmpty(Registry.ITEM_REGISTRY).getAllTags().entrySet().stream().filter(e -> e.getValue().contains(item)).map(e -> ValueConversions.of(e.getKey())).collect(Collectors.toList()));
String tag = lv.get(1).getString();
net.minecraft.tag.Tag<Item> itemTag = tagManager.getOrCreateTagGroup(Registry.ITEM_KEY).getTag(InputValidator.identifierOf(tag));
net.minecraft.tags.Tag<Item> itemTag = tagManager.getOrEmpty(Registry.ITEM_REGISTRY).getTag(InputValidator.identifierOf(tag));
if (itemTag == null) return Value.NULL;
return BooleanValue.of(itemTag.contains(item));
});
@@ -109,7 +108,7 @@ public class Inventories {
List<Value> recipesOutput = new ArrayList<>();
for (Recipe<?> recipe: recipes)
{
ItemStack result = recipe.getOutput();
ItemStack result = recipe.getResultItem();
List<Value> ingredientValue = new ArrayList<>();
recipe.getIngredients().forEach(
ingredient ->
@@ -147,15 +146,15 @@ public class Inventories {
{
recipeSpec = ListValue.of(
new StringValue("smelting"),
new NumericValue(((AbstractCookingRecipe) recipe).getCookTime()),
new NumericValue(((AbstractCookingRecipe) recipe).getCookingTime()),
new NumericValue(((AbstractCookingRecipe) recipe).getExperience())
);
}
else if (recipe instanceof CuttingRecipe)
else if (recipe instanceof SingleItemRecipe)
{
recipeSpec = ListValue.of(new StringValue("cutting"));
}
else if (recipe instanceof SpecialCraftingRecipe)
else if (recipe instanceof CustomRecipe)
{
recipeSpec = ListValue.of(new StringValue("special"));
}
@@ -173,10 +172,10 @@ public class Inventories {
{
String itemStr = v.getString();
Item item;
Identifier id = InputValidator.identifierOf(itemStr);
item = Registry.ITEM.getOrEmpty(id).orElseThrow(() -> new ThrowStatement(itemStr, Throwables.UNKNOWN_ITEM));
if (!item.hasRecipeRemainder()) return Value.NULL;
return new StringValue(NBTSerializableValue.nameFromRegistryId(Registry.ITEM.getId(item.getRecipeRemainder())));
ResourceLocation id = InputValidator.identifierOf(itemStr);
item = Registry.ITEM.getOptional(id).orElseThrow(() -> new ThrowStatement(itemStr, Throwables.UNKNOWN_ITEM));
if (!item.hasCraftingRemainingItem()) return Value.NULL;
return new StringValue(NBTSerializableValue.nameFromRegistryId(Registry.ITEM.getKey(item.getCraftingRemainingItem())));
});
expression.addContextFunction("inventory_size", -1, (c, t, lv) ->
@@ -184,7 +183,7 @@ public class Inventories {
CarpetContext cc = (CarpetContext) c;
NBTSerializableValue.InventoryLocator inventoryLocator = NBTSerializableValue.locateInventory(cc, lv, 0);
if (inventoryLocator == null) return Value.NULL;
return new NumericValue(inventoryLocator.inventory().size());
return new NumericValue(inventoryLocator.inventory().getContainerSize());
});
expression.addContextFunction("inventory_has_items", -1, (c, t, lv) ->
@@ -204,14 +203,14 @@ public class Inventories {
if (lv.size() == inventoryLocator.offset())
{
List<Value> fullInventory = new ArrayList<>();
for (int i = 0, maxi = inventoryLocator.inventory().size(); i < maxi; i++)
fullInventory.add(ValueConversions.of(inventoryLocator.inventory().getStack(i)));
for (int i = 0, maxi = inventoryLocator.inventory().getContainerSize(); i < maxi; i++)
fullInventory.add(ValueConversions.of(inventoryLocator.inventory().getItem(i)));
return ListValue.wrap(fullInventory);
}
int slot = (int)NumericValue.asNumber(lv.get(inventoryLocator.offset())).getLong();
slot = NBTSerializableValue.validateSlot(slot, inventoryLocator.inventory());
if (slot == inventoryLocator.inventory().size()) return Value.NULL;
return ValueConversions.of(inventoryLocator.inventory().getStack(slot));
if (slot == inventoryLocator.inventory().getContainerSize()) return Value.NULL;
return ValueConversions.of(inventoryLocator.inventory().getItem(slot));
});
//inventory_set(<b,e>, <n>, <count>, <item>, <nbt>)
@@ -224,26 +223,26 @@ public class Inventories {
throw new InternalExpressionException("'inventory_set' requires at least slot number and new stack size, and optional new item");
int slot = (int) NumericValue.asNumber(lv.get(inventoryLocator.offset()+0)).getLong();
slot = NBTSerializableValue.validateSlot(slot, inventoryLocator.inventory());
if (slot == inventoryLocator.inventory().size()) return Value.NULL;
if (slot == inventoryLocator.inventory().getContainerSize()) return Value.NULL;
int count = (int) NumericValue.asNumber(lv.get(inventoryLocator.offset()+1)).getLong();
if (count == 0)
{
// clear slot
ItemStack removedStack = inventoryLocator.inventory().removeStack(slot);
ItemStack removedStack = inventoryLocator.inventory().removeItemNoUpdate(slot);
syncPlayerInventory(inventoryLocator, slot);
//Value res = ListValue.fromItemStack(removedStack); // that tuple will be read only but cheaper if noone cares
return ValueConversions.of(removedStack);
}
if (lv.size() < inventoryLocator.offset()+3)
{
ItemStack previousStack = inventoryLocator.inventory().getStack(slot);
ItemStack previousStack = inventoryLocator.inventory().getItem(slot);
ItemStack newStack = previousStack.copy();
newStack.setCount(count);
inventoryLocator.inventory().setStack(slot, newStack);
inventoryLocator.inventory().setItem(slot, newStack);
syncPlayerInventory(inventoryLocator, slot);
return ValueConversions.of(previousStack);
}
NbtCompound nbt = null; // skipping one argument
CompoundTag nbt = null; // skipping one argument
if (lv.size() > inventoryLocator.offset()+3)
{
Value nbtValue = lv.get(inventoryLocator.offset()+3);
@@ -254,11 +253,11 @@ public class Inventories {
else
nbt = new NBTSerializableValue(nbtValue.getString()).getCompoundTag();
}
ItemStackArgument newitem = NBTSerializableValue.parseItem(lv.get(inventoryLocator.offset()+2).getString(), nbt);
ItemStack previousStack = inventoryLocator.inventory().getStack(slot);
ItemInput newitem = NBTSerializableValue.parseItem(lv.get(inventoryLocator.offset()+2).getString(), nbt);
ItemStack previousStack = inventoryLocator.inventory().getItem(slot);
try
{
inventoryLocator.inventory().setStack(slot, newitem.createStack(count, false));
inventoryLocator.inventory().setItem(slot, newitem.createItemStack(count, false));
syncPlayerInventory(inventoryLocator, slot);
}
catch (CommandSyntaxException e)
@@ -274,7 +273,7 @@ public class Inventories {
CarpetContext cc = (CarpetContext) c;
NBTSerializableValue.InventoryLocator inventoryLocator = NBTSerializableValue.locateInventory(cc, lv, 0);
if (inventoryLocator == null) return Value.NULL;
ItemStackArgument itemArg = null;
ItemInput itemArg = null;
if (lv.size() > inventoryLocator.offset())
{
Value secondArg = lv.get(inventoryLocator.offset()+0);
@@ -287,9 +286,9 @@ public class Inventories {
startIndex = (int) NumericValue.asNumber(lv.get(inventoryLocator.offset()+1)).getLong();
}
startIndex = NBTSerializableValue.validateSlot(startIndex, inventoryLocator.inventory());
for (int i = startIndex, maxi = inventoryLocator.inventory().size(); i < maxi; i++)
for (int i = startIndex, maxi = inventoryLocator.inventory().getContainerSize(); i < maxi; i++)
{
ItemStack stack = inventoryLocator.inventory().getStack(i);
ItemStack stack = inventoryLocator.inventory().getItem(i);
if ( (itemArg == null && stack.isEmpty()) || (itemArg != null && itemArg.getItem().equals(stack.getItem())) )
return new NumericValue(i);
}
@@ -304,16 +303,16 @@ public class Inventories {
if (inventoryLocator == null) return Value.NULL;
if (lv.size() <= inventoryLocator.offset())
throw new InternalExpressionException("'inventory_remove' requires at least an item to be removed");
ItemStackArgument searchItem = NBTSerializableValue.parseItem(lv.get(inventoryLocator.offset()).getString());
ItemInput searchItem = NBTSerializableValue.parseItem(lv.get(inventoryLocator.offset()).getString());
int amount = 1;
if (lv.size() > inventoryLocator.offset()+1)
amount = (int)NumericValue.asNumber(lv.get(inventoryLocator.offset()+1)).getLong();
// not enough
if (((amount == 1) && (!inventoryLocator.inventory().containsAny(Sets.newHashSet(searchItem.getItem()))))
|| (inventoryLocator.inventory().count(searchItem.getItem()) < amount)) return Value.FALSE;
for (int i = 0, maxi = inventoryLocator.inventory().size(); i < maxi; i++)
if (((amount == 1) && (!inventoryLocator.inventory().hasAnyOf(Sets.newHashSet(searchItem.getItem()))))
|| (inventoryLocator.inventory().countItem(searchItem.getItem()) < amount)) return Value.FALSE;
for (int i = 0, maxi = inventoryLocator.inventory().getContainerSize(); i < maxi; i++)
{
ItemStack stack = inventoryLocator.inventory().getStack(i);
ItemStack stack = inventoryLocator.inventory().getItem(i);
if (stack.isEmpty())
continue;
if (!stack.getItem().equals(searchItem.getItem()))
@@ -322,13 +321,13 @@ public class Inventories {
if (left > 0)
{
stack.setCount(left);
inventoryLocator.inventory().setStack(i, stack);
inventoryLocator.inventory().setItem(i, stack);
syncPlayerInventory(inventoryLocator, i);
return Value.TRUE;
}
else
{
inventoryLocator.inventory().removeStack(i);
inventoryLocator.inventory().removeItemNoUpdate(i);
syncPlayerInventory(inventoryLocator, i);
amount -= stack.getCount();
}
@@ -348,51 +347,51 @@ public class Inventories {
throw new InternalExpressionException("Slot number is required for inventory_drop");
int slot = (int)NumericValue.asNumber(lv.get(inventoryLocator.offset())).getLong();
slot = NBTSerializableValue.validateSlot(slot, inventoryLocator.inventory());
if (slot == inventoryLocator.inventory().size()) return Value.NULL;
if (slot == inventoryLocator.inventory().getContainerSize()) return Value.NULL;
int amount = 0;
if (lv.size() > inventoryLocator.offset()+1)
amount = (int)NumericValue.asNumber(lv.get(inventoryLocator.offset()+1)).getLong();
if (amount < 0)
throw new InternalExpressionException("Cannot throw negative number of items");
ItemStack stack = inventoryLocator.inventory().getStack(slot);
ItemStack stack = inventoryLocator.inventory().getItem(slot);
if (stack == null || stack.isEmpty()) return Value.ZERO;
if (amount == 0) amount = stack.getCount();
ItemStack droppedStack = inventoryLocator.inventory().removeStack(slot, amount);
ItemStack droppedStack = inventoryLocator.inventory().removeItem(slot, amount);
if (droppedStack.isEmpty()) return Value.ZERO;
Object owner = inventoryLocator.owner();
ItemEntity item;
if (owner instanceof PlayerEntity)
if (owner instanceof Player)
{
item = ((PlayerEntity) owner).dropItem(droppedStack, false, true);
item = ((Player) owner).drop(droppedStack, false, true);
}
else if (owner instanceof LivingEntity villager)
{
// stolen from LookTargetUtil.give((VillagerEntity)owner, droppedStack, (LivingEntity) owner);
double double_1 = villager.getY() - 0.30000001192092896D + (double)villager.getStandingEyeHeight();
item = new ItemEntity(villager.world, villager.getX(), double_1, villager.getZ(), droppedStack);
Vec3d vec3d_1 = villager.getRotationVec(1.0F).normalize().multiply(0.3);// new Vec3d(0, 0.3, 0);
item.setVelocity(vec3d_1);
item.setToDefaultPickupDelay();
cc.s.getWorld().spawnEntity(item);
double double_1 = villager.getY() - 0.30000001192092896D + (double)villager.getEyeHeight();
item = new ItemEntity(villager.level, villager.getX(), double_1, villager.getZ(), droppedStack);
Vec3 vec3d_1 = villager.getViewVector(1.0F).normalize().scale(0.3);// new Vec3d(0, 0.3, 0);
item.setDeltaMovement(vec3d_1);
item.setDefaultPickUpDelay();
cc.s.getLevel().addFreshEntity(item);
}
else
{
Vec3d point = Vec3d.ofCenter(inventoryLocator.position()); //pos+0.5v
item = new ItemEntity(cc.s.getWorld(), point.x, point.y, point.z, droppedStack);
item.setToDefaultPickupDelay();
cc.s.getWorld().spawnEntity(item);
Vec3 point = Vec3.atCenterOf(inventoryLocator.position()); //pos+0.5v
item = new ItemEntity(cc.s.getLevel(), point.x, point.y, point.z, droppedStack);
item.setDefaultPickUpDelay();
cc.s.getLevel().addFreshEntity(item);
}
return new NumericValue(item.getStack().getCount());
return new NumericValue(item.getItem().getCount());
});
expression.addContextFunction("create_screen",-1, (c, t, lv) ->
{
if(lv.size() < 3) throw new InternalExpressionException("'create_screen' requires at least three arguments");
Value playerValue = lv.get(0);
ServerPlayerEntity player = EntityValue.getPlayerByValue(((CarpetContext) c).s.getServer(), playerValue);
ServerPlayer player = EntityValue.getPlayerByValue(((CarpetContext) c).s.getServer(), playerValue);
if(player == null) throw new InternalExpressionException("'create_screen' requires a valid online player as the first argument.");
String type = lv.get(1).getString();
Text name = FormattedTextValue.getTextByValue(lv.get(2));
Component name = FormattedTextValue.getTextByValue(lv.get(2));
FunctionValue function = null;
if(lv.size() > 3)
function = FunctionArgument.findIn(c, expression.module, lv, 3, true, false).function;
@@ -427,12 +426,12 @@ public class Inventories {
private static void syncPlayerInventory(NBTSerializableValue.InventoryLocator inventory, int int_1)
{
if (inventory.owner() instanceof ServerPlayerEntity player && !inventory.isEnder() && !(inventory.inventory() instanceof ScreenValue.ScreenHandlerInventory))
if (inventory.owner() instanceof ServerPlayer player && !inventory.isEnder() && !(inventory.inventory() instanceof ScreenValue.ScreenHandlerInventory))
{
player.networkHandler.sendPacket(new ScreenHandlerSlotUpdateS2CPacket(
player.connection.send(new ClientboundContainerSetSlotPacket(
-2, 0, // resolve mystery argument
int_1,
inventory.inventory().getStack(int_1)
inventory.inventory().getItem(int_1)
));
}
}