From a690e477aedf5674221a5a5144e8c0747bf6fbeb Mon Sep 17 00:00:00 2001 From: ch-yx Date: Fri, 25 Mar 2022 01:14:39 +0800 Subject: [PATCH] draft --- .../java/carpet/script/api/Inventories.java | 15 +++++++++++++ .../java/carpet/script/value/EntityValue.java | 4 ++++ .../java/carpet/script/value/ScreenValue.java | 21 +++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/src/main/java/carpet/script/api/Inventories.java b/src/main/java/carpet/script/api/Inventories.java index b4dd3b35..3d09840e 100644 --- a/src/main/java/carpet/script/api/Inventories.java +++ b/src/main/java/carpet/script/api/Inventories.java @@ -427,6 +427,18 @@ public class Inventories { return new ScreenValue(player,type,name,function,c); }); + expression.addContextFunction("get_current_screen",-1, (c, t, lv) -> + { + if(lv.size() < 1) throw new InternalExpressionException("'get_current_screen' requires at least 1 argument"); + Value playerValue = lv.get(0); + ServerPlayer player = EntityValue.getPlayerByValue(((CarpetContext) c).s.getServer(), playerValue); + if(player == null) throw new InternalExpressionException("'get_current_screen' requires a valid online player as the first argument."); + FunctionValue function = null; + if(lv.size() > 1) + function = FunctionArgument.findIn(c, expression.module, lv, 1, true, false).function; + + return new ScreenValue(player,player.containerMenu,function,c); + }); expression.addContextFunction("close_screen",1, (c, t, lv) -> { Value value = lv.get(0); @@ -454,6 +466,9 @@ public class Inventories { private static void syncPlayerInventory(NBTSerializableValue.InventoryLocator inventory, int int_1) { + if (inventory.owner() instanceof ServerPlayer player && inventory.inventory() instanceof ScreenValue.ScreenHandlerInventory && (inventory.inventory().getContainerSize()-1)==int_1){ + player.containerMenu.broadcastFullState(); + }//not sure. if you think that is wrong, please tell me. if (inventory.owner() instanceof ServerPlayer player && !inventory.isEnder() && !(inventory.inventory() instanceof ScreenValue.ScreenHandlerInventory)) { player.connection.send(new ClientboundContainerSetSlotPacket( diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index 0fededb8..6416591e 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -525,12 +525,14 @@ public class EntityValue extends Value put("breeding_age", (e, a) -> e instanceof AgeableMob?new NumericValue(((AgeableMob) e).getAge()):Value.NULL); put("despawn_timer", (e, a) -> e instanceof LivingEntity?new NumericValue(((LivingEntity) e).getNoActionTime()):Value.NULL); //getter of ironman flower, blueness of skull, carryingitem + /* put("carrying_item",(e,a)->{ if (e instanceof ServerPlayer){ return ValueConversions.of(((ServerPlayer) e).containerMenu.getCarried()); } return Value.NULL; }); + */ put("skull_dangerous",(e,a)->{ if (e instanceof WitherSkull w){ return BooleanValue.of(w.isDangerous()); @@ -1696,6 +1698,7 @@ public class EntityValue extends Value }); //setter of ironman flower, blueness of skull, carryingitem + /* put("carrying_item",(e,v)->{ if (e instanceof ServerPlayer pl){ ItemStack item=getItemStackFromValue(v); @@ -1707,6 +1710,7 @@ public class EntityValue extends Value }); + */ put("skull_dangerous",(e,v)->{ if (e instanceof WitherSkull w){ w.setDangerous(v.getBoolean()); diff --git a/src/main/java/carpet/script/value/ScreenValue.java b/src/main/java/carpet/script/value/ScreenValue.java index 7a132346..98c620a3 100644 --- a/src/main/java/carpet/script/value/ScreenValue.java +++ b/src/main/java/carpet/script/value/ScreenValue.java @@ -111,6 +111,27 @@ public class ScreenValue extends Value { + public ScreenValue(ServerPlayer player, AbstractContainerMenu screenHandler, FunctionValue callback, Context c) { + this.screenHandler=screenHandler; + this.inventory = new ScreenHandlerInventory(this.screenHandler); + this.hostname = c.host.getName(); + this.player=player; + name=null;//TO DO... + net.minecraft.resources.ResourceLocation menuname=null; + try { + menuname=net.minecraft.core.Registry.MENU.getKey(screenHandler.getType()); + }catch(Exception e){} + if (menuname==null){ + typestring=screenHandler != this.player.inventoryMenu?"__unknown":"inv"; + }else if(menuname.getNamespace().equals("minecraft")){ + typestring=menuname.getPath(); + }else{ + typestring=menuname.getNamespace(); + } + if(callback != null) callback.checkArgs(4); + this.callback=callback; + addListenerCallback(screenHandler); + } public ScreenValue(ServerPlayer player, String type, Component name, FunctionValue callback, Context c) { this.name = name; this.typestring = type.toLowerCase();