Эх сурвалжийг харах

block drop event, changed experience snuvi commands

Kajetan Johannes Hammerle 4 жил өмнө
parent
commit
03bbee70fd

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

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

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

@@ -4,12 +4,14 @@ import com.mojang.authlib.GameProfile;
 import java.util.HashMap;
 import me.hammerle.snuviscript.code.ISnuviScheduler;
 import me.km.Server;
+import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.entity.player.ServerPlayerEntity;
 import net.minecraft.network.play.server.SPlayerListItemPacket;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.server.management.PlayerInteractionManager;
 import net.minecraft.util.text.ITextComponent;
 import net.minecraft.util.text.StringTextComponent;
+import net.minecraft.world.GameRules;
 import net.minecraft.world.server.ServerWorld;
 
 public class ModEntityPlayerMP extends ServerPlayerEntity {
@@ -123,4 +125,28 @@ public class ModEntityPlayerMP extends ServerPlayerEntity {
         Server.scriptEvents.onSneak(attackingPlayer, keyDownIn);
         super.setSneaking(keyDownIn);
     }
+
+    @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) {
+                level -= 31;
+                total += level * 112 + 9 * (level + 1) * level / 2;
+                level = 31;
+            }
+            if(level >= 17) {
+                level -= 16;
+                total += level * 37 + 5 * (level + 1) * level / 2;
+                level = 16;
+            }
+            total += level * 7 + 2 * level * (level - 1) / 2;
+            total += Math.round(experience * xpBarCap());
+            return total;
+        } else {
+            return 0;
+        }
+    }
 }

+ 38 - 3
src/main/java/me/km/snuviscript/ScriptEvents.java

@@ -2,11 +2,13 @@ package me.km.snuviscript;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 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.km.utils.Utils;
 import me.km.entities.EntityHuman;
 import me.km.entities.EntityItemProjectile;
@@ -14,6 +16,8 @@ import me.km.events.CommandEvent;
 import me.km.inventory.ModInventory;
 import me.km.utils.ExplosionUtils;
 import me.km.utils.Location;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockState;
 import net.minecraft.command.ICommandSource;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.LivingEntity;
@@ -23,10 +27,14 @@ import net.minecraft.inventory.container.ClickType;
 import net.minecraft.item.ItemStack;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.server.management.PlayerList;
+import net.minecraft.tileentity.TileEntity;
 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.server.ServerWorld;
+import net.minecraft.world.storage.loot.LootContext;
+import net.minecraft.world.storage.loot.LootParameters;
 import net.minecraftforge.event.ServerChatEvent;
 import net.minecraftforge.event.TickEvent;
 import net.minecraftforge.event.entity.*;
@@ -40,7 +48,7 @@ import net.minecraftforge.eventbus.api.*;
 import net.minecraftforge.event.entity.player.PlayerEvent;
 import net.minecraftforge.eventbus.api.Event.Result;
 
-public class ScriptEvents {
+public class ScriptEvents implements BlockHarvest {
     private static void setLivingEntity(Script sc, LivingEntity ent) {
         sc.setVar("living_entity", ent);
     }
@@ -307,13 +315,12 @@ public class ScriptEvents {
             sc.setVar("looting", (double) e.getLootingLevel());
         }, null);
     }
-    
+
     @SubscribeEvent(receiveCanceled = true)
     public void onLivingExperienceDrop(LivingExperienceDropEvent e) {
         handleEvent(e, "living_experience_drop", (sc) -> {
             setLivingEntity(sc, e.getEntityLiving());
             sc.setVar("experience", (double) e.getDroppedExperience());
-            sc.setVar("original_experience", (double) e.getOriginalExperience());
         }, (sc) -> {
             handleVar(sc, "living_experience_drop", "experience", v -> e.setDroppedExperience(v.getInt(sc)));
         });
@@ -367,6 +374,33 @@ public class ScriptEvents {
         }
     }
 
+    @Override
+    public List<ItemStack> onBlockHarvest(BlockState state, ServerWorld w, BlockPos pos, TileEntity tileEnt, Entity ent, ItemStack stack) {
+        LootContext.Builder loot = new LootContext.Builder(w)
+                .withRandom(w.getRandom())
+                .withParameter(LootParameters.POSITION, pos)
+                .withParameter(LootParameters.TOOL, stack == null ? ItemStack.EMPTY : stack)
+                .withNullableParameter(LootParameters.THIS_ENTITY, ent)
+                .withNullableParameter(LootParameters.BLOCK_ENTITY, tileEnt);
+        List<ItemStack> list = state.getDrops(loot);
+        try {
+            final Block b = state.getBlock();
+            final String name = b.getRegistryName().toString();
+            scripts.getScriptManager().callEvent("block_drop", sc -> {
+                sc.setVar("drops", list);
+                sc.setVar("block_type", name);
+                sc.setVar("block", b);
+                sc.setVar("location", new Location(w, pos));
+                ScriptVars.setEntityVars(sc, ent);
+                setItem(sc, stack);
+            }, sc -> {
+            });
+        } catch(Exception ex) {
+            ex.printStackTrace();
+        }
+        return list;
+    }
+
     @SubscribeEvent(receiveCanceled = true)
     public void onBlockHarvest(BlockEvent.HarvestDropsEvent e) {
         handleEvent(e, "block_harvest", (sc) -> {
@@ -681,6 +715,7 @@ public class ScriptEvents {
                 }
                 rider.remove();
             });
+            e.getEntity().removePassengers();
             e.setCanceled(true);
             return;
         }

+ 2 - 2
src/main/java/me/km/snuviscript/ScriptVars.java

@@ -36,7 +36,7 @@ public class ScriptVars {
         }
     }
 
-    public static void setEntityVars(Script qd, Entity ent) {
-        qd.setVar("entity", ent);
+    public static void setEntityVars(Script sc, Entity ent) {
+        sc.setVar("entity", ent);
     }
 }

+ 8 - 11
src/main/java/me/km/snuviscript/commands/PlayerCommands.java

@@ -233,20 +233,17 @@ public class PlayerCommands {
                 return ChestContainer.createGeneric9X3(id, pInv, inv);
             }, new StringTextComponent(in[2].getString(sc))));
         });
+        sm.registerConsumer("player.addtotalexp", (sc, in) -> {
+            ((ServerPlayerEntity) in[0].get(sc)).giveExperiencePoints(in[1].getInt(sc));
+        });
         sm.registerFunction("player.getlevel", (sc, in) -> (double) ((PlayerEntity) in[0].get(sc)).experienceLevel);
-        sm.registerFunction("player.getexp", (sc, in) -> (double) ((PlayerEntity) in[0].get(sc)).experience);
-        sm.registerConsumer("player.addlevel", (sc, in) -> {
-            ((PlayerEntity) in[0].get(sc)).addExperienceLevel(in[1].getInt(sc));
+        sm.registerConsumer("player.setlevel", (sc, in) -> {
+            ((ServerPlayerEntity) in[0].get(sc)).setExperienceLevel(in[1].getInt(sc));
         });
+        sm.registerFunction("player.getexp", (sc, in) -> (double) ((PlayerEntity) in[0].get(sc)).experience);
         sm.registerConsumer("player.setexp", (sc, in) -> {
-            PlayerEntity p = (PlayerEntity) in[0].get(sc);
-            float f = in[1].getFloat(sc);
-            if(f < 0.0f) {
-                f = 0.0f;
-            } else if(f > 1.0f) {
-                f = 1.0f;
-            }
-            p.giveExperiencePoints((int) (f * p.xpBarCap()));
+            ServerPlayerEntity p = (ServerPlayerEntity) in[0].get(sc);
+            p.func_195394_a((int) (in[1].getDouble(sc) * p.xpBarCap()));
         });
         sm.registerFunction("player.gethead", (sc, in) -> {
             ItemStack stack = new ItemStack(Items.PLAYER_HEAD);