minecraft-source/src/net/minecraft/advancements/AdvancementRewards.java

174 lines
7.7 KiB
Java

package net.minecraft.advancements;
import com.google.common.collect.Lists;
import javax.annotation.Nullable;
import java.util.List;
import com.google.gson.JsonParseException;
import net.minecraft.util.GsonHelper;
import com.google.gson.JsonDeserializationContext;
import java.lang.reflect.Type;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonNull;
import com.google.gson.JsonElement;
import java.util.Arrays;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.entity.item.ItemEntity;
import java.util.Iterator;
import net.minecraft.world.entity.player.Player;
import net.minecraft.sounds.SoundSource;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.commands.CommandFunction;
import net.minecraft.resources.ResourceLocation;
public class AdvancementRewards {
public static final AdvancementRewards EMPTY;
private final int experience;
private final ResourceLocation[] loot;
private final ResourceLocation[] recipes;
private final CommandFunction.CacheableFunction function;
public AdvancementRewards(final int integer, final ResourceLocation[] arr2, final ResourceLocation[] arr3, final CommandFunction.CacheableFunction a) {
this.experience = integer;
this.loot = arr2;
this.recipes = arr3;
this.function = a;
}
public void grant(final ServerPlayer xe) {
xe.giveExperiencePoints(this.experience);
final LootContext crx3 = new LootContext.Builder(xe.getLevel()).<Entity>withParameter(LootContextParams.THIS_ENTITY, xe).<BlockPos>withParameter(LootContextParams.BLOCK_POS, new BlockPos(xe)).withRandom(xe.getRandom()).create(LootContextParamSets.ADVANCEMENT_REWARD);
boolean boolean4 = false;
for (final ResourceLocation sm8 : this.loot) {
for (final ItemStack ben10 : xe.server.getLootTables().get(sm8).getRandomItems(crx3)) {
if (xe.addItem(ben10)) {
xe.level.playSound(null, xe.getX(), xe.getY(), xe.getZ(), SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, 0.2f, ((xe.getRandom().nextFloat() - xe.getRandom().nextFloat()) * 0.7f + 1.0f) * 2.0f);
boolean4 = true;
}
else {
final ItemEntity awb11 = xe.drop(ben10, false);
if (awb11 == null) {
continue;
}
awb11.setNoPickUpDelay();
awb11.setOwner(xe.getUUID());
}
}
}
if (boolean4) {
xe.inventoryMenu.broadcastChanges();
}
if (this.recipes.length > 0) {
xe.awardRecipesByKey(this.recipes);
}
final MinecraftServer minecraftServer5 = xe.server;
this.function.get(minecraftServer5.getFunctions()).ifPresent(cn -> minecraftServer5.getFunctions().execute(cn, xe.createCommandSourceStack().withSuppressedOutput().withPermission(2)));
}
@Override
public String toString() {
return "AdvancementRewards{experience=" + this.experience + ", loot=" + Arrays.toString(this.loot) + ", recipes=" + Arrays.toString(this.recipes) + ", function=" + this.function + '}';
}
public JsonElement serializeToJson() {
if (this == AdvancementRewards.EMPTY) {
return JsonNull.INSTANCE;
}
final JsonObject jsonObject2 = new JsonObject();
if (this.experience != 0) {
jsonObject2.addProperty("experience", this.experience);
}
if (this.loot.length > 0) {
final JsonArray jsonArray3 = new JsonArray();
for (final ResourceLocation sm7 : this.loot) {
jsonArray3.add(sm7.toString());
}
jsonObject2.add("loot", jsonArray3);
}
if (this.recipes.length > 0) {
final JsonArray jsonArray3 = new JsonArray();
for (final ResourceLocation sm7 : this.recipes) {
jsonArray3.add(sm7.toString());
}
jsonObject2.add("recipes", jsonArray3);
}
if (this.function.getId() != null) {
jsonObject2.addProperty("function", this.function.getId().toString());
}
return jsonObject2;
}
static {
EMPTY = new AdvancementRewards(0, new ResourceLocation[0], new ResourceLocation[0], CommandFunction.CacheableFunction.NONE);
}
public static class Deserializer implements JsonDeserializer<AdvancementRewards> {
@Override
public AdvancementRewards deserialize(final JsonElement jsonElement, final Type type, final JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
final JsonObject jsonObject5 = GsonHelper.convertToJsonObject(jsonElement, "rewards");
final int integer6 = GsonHelper.getAsInt(jsonObject5, "experience", 0);
final JsonArray jsonArray7 = GsonHelper.getAsJsonArray(jsonObject5, "loot", new JsonArray());
final ResourceLocation[] arr8 = new ResourceLocation[jsonArray7.size()];
for (int integer7 = 0; integer7 < arr8.length; ++integer7) {
arr8[integer7] = new ResourceLocation(GsonHelper.convertToString(jsonArray7.get(integer7), "loot[" + integer7 + "]"));
}
final JsonArray jsonArray8 = GsonHelper.getAsJsonArray(jsonObject5, "recipes", new JsonArray());
final ResourceLocation[] arr9 = new ResourceLocation[jsonArray8.size()];
for (int integer8 = 0; integer8 < arr9.length; ++integer8) {
arr9[integer8] = new ResourceLocation(GsonHelper.convertToString(jsonArray8.get(integer8), "recipes[" + integer8 + "]"));
}
CommandFunction.CacheableFunction a11;
if (jsonObject5.has("function")) {
a11 = new CommandFunction.CacheableFunction(new ResourceLocation(GsonHelper.getAsString(jsonObject5, "function")));
}
else {
a11 = CommandFunction.CacheableFunction.NONE;
}
return new AdvancementRewards(integer6, arr8, arr9, a11);
}
}
public static class Builder {
private int experience;
private final List<ResourceLocation> loot;
private final List<ResourceLocation> recipes;
@Nullable
private ResourceLocation function;
public Builder() {
this.loot = Lists.newArrayList();
this.recipes = Lists.newArrayList();
}
public static Builder experience(final int integer) {
return new Builder().addExperience(integer);
}
public Builder addExperience(final int integer) {
this.experience += integer;
return this;
}
public static Builder recipe(final ResourceLocation sm) {
return new Builder().addRecipe(sm);
}
public Builder addRecipe(final ResourceLocation sm) {
this.recipes.add(sm);
return this;
}
public AdvancementRewards build() {
return new AdvancementRewards(this.experience, this.loot.<ResourceLocation>toArray(new ResourceLocation[0]), this.recipes.<ResourceLocation>toArray(new ResourceLocation[0]), (this.function == null) ? CommandFunction.CacheableFunction.NONE : new CommandFunction.CacheableFunction(this.function));
}
}
}