Browse Source

crafting event for snuvi

Kajetan Johannes Hammerle 4 years ago
parent
commit
ed6bcca288

+ 1 - 0
src/main/java/me/km/Server.java

@@ -74,6 +74,7 @@ public class Server {
         scripts = new Scripts(logger, scheduler);
         scriptEvents = new ScriptEvents(scripts, server);
         Hooks.setBlockHarvest(scriptEvents);
+        Hooks.setCraft(scriptEvents);
         MinecraftForge.EVENT_BUS.register(scriptEvents);
 
         // command manager

+ 0 - 1
src/main/java/me/km/overrides/ModEntityPlayerMP.java

@@ -129,7 +129,6 @@ public class ModEntityPlayerMP extends ServerPlayerEntity {
     @Override
     protected int getExperiencePoints(PlayerEntity player) {
         if(!this.world.getGameRules().getBoolean(GameRules.KEEP_INVENTORY) && !this.isSpectator()) {
-
             int level = experienceLevel;
             int total = 0;
             if(level >= 32) {

+ 43 - 2
src/main/java/me/km/snuviscript/ScriptEvents.java

@@ -3,12 +3,14 @@ package me.km.snuviscript;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 import me.hammerle.snuviscript.code.Script;
 import me.hammerle.snuviscript.code.SnuviUtils;
 import me.hammerle.snuviscript.inputprovider.Variable;
 import me.kcm.BlockHarvest;
+import me.kcm.Craft;
 import me.km.utils.Utils;
 import me.km.entities.EntityHuman;
 import me.km.entities.EntityItemProjectile;
@@ -23,8 +25,13 @@ import net.minecraft.entity.Entity;
 import net.minecraft.entity.LivingEntity;
 import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.entity.player.ServerPlayerEntity;
+import net.minecraft.inventory.CraftResultInventory;
+import net.minecraft.inventory.CraftingInventory;
 import net.minecraft.inventory.container.ClickType;
 import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.ICraftingRecipe;
+import net.minecraft.item.crafting.IRecipeType;
+import net.minecraft.network.play.server.SSetSlotPacket;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.server.management.PlayerList;
 import net.minecraft.tileentity.TileEntity;
@@ -32,6 +39,7 @@ import net.minecraft.util.math.*;
 import net.minecraft.util.text.ITextComponent;
 import net.minecraft.util.text.StringTextComponent;
 import net.minecraft.world.GameRules;
+import net.minecraft.world.World;
 import net.minecraft.world.server.ServerWorld;
 import net.minecraft.world.storage.loot.LootContext;
 import net.minecraft.world.storage.loot.LootParameters;
@@ -48,7 +56,7 @@ import net.minecraftforge.eventbus.api.*;
 import net.minecraftforge.event.entity.player.PlayerEvent;
 import net.minecraftforge.eventbus.api.Event.Result;
 
-public class ScriptEvents implements BlockHarvest {
+public class ScriptEvents implements BlockHarvest, Craft {
     private static void setLivingEntity(Script sc, LivingEntity ent) {
         sc.setVar("living_entity", ent);
     }
@@ -550,7 +558,9 @@ public class ScriptEvents implements BlockHarvest {
         }, (sc) -> {
             handleVar(sc, "item_use_finish", "result", v -> {
                 ItemStack stack = (ItemStack) v.get(sc);
-                if(stack != null) {
+                if(stack == null) {
+                    e.setResultStack(ItemStack.EMPTY);
+                } else {
                     e.setResultStack(stack);
                 }
             });
@@ -763,4 +773,35 @@ public class ScriptEvents implements BlockHarvest {
             });
         });
     }
+
+    @Override
+    public void onCraft(int id, World w, PlayerEntity p, CraftingInventory inv, CraftResultInventory result) {
+        if(w.isRemote) {
+            return;
+        }
+        ServerPlayerEntity serverplayerentity = (ServerPlayerEntity) p;
+        Wrapper<ItemStack> wrapper = new Wrapper(ItemStack.EMPTY);
+        Optional<ICraftingRecipe> optional = w.getServer().getRecipeManager().getRecipe(IRecipeType.CRAFTING, inv, w);
+        if(optional.isPresent()) {
+            ICraftingRecipe icraftingrecipe = optional.get();
+            if(result.canUseRecipe(w, serverplayerentity, icraftingrecipe)) {
+                wrapper.set(icraftingrecipe.getCraftingResult(inv));
+                scripts.getScriptManager().callEvent("craft", (sc) -> {
+                    ScriptVars.setPlayerVars(sc, p);
+                    sc.setVar("result", wrapper.get());
+                }, (sc) -> {
+                    handleVar(sc, "craft", "result", (v) -> {
+                        ItemStack stack = (ItemStack) v.get(sc);
+                        if(stack == null) {
+                            wrapper.set(ItemStack.EMPTY);
+                        } else {
+                            wrapper.set(stack);
+                        }
+                    });
+                });
+            }
+        }
+        result.setInventorySlotContents(0, wrapper.get());
+        serverplayerentity.connection.sendPacket(new SSetSlotPacket(id, 0, wrapper.get()));
+    }
 }

+ 17 - 0
src/main/java/me/km/snuviscript/Wrapper.java

@@ -0,0 +1,17 @@
+package me.km.snuviscript;
+
+public class Wrapper<T> {
+    private T t;
+
+    public Wrapper(T t) {
+        this.t = t;
+    }
+
+    public void set(T t) {
+        this.t = t;
+    }
+
+    public T get() {
+        return t;
+    }
+}