Forráskód Böngészése

bugfixes, world info for each world

Kajetan Johannes Hammerle 3 éve
szülő
commit
952dcc1ec2

+ 2 - 0
src/main/java/me/km/KajetansMod.java

@@ -5,6 +5,7 @@ import me.kcm.Hooks;
 import me.km.blocks.ModBlocks;
 import me.km.networking.ModPacketHandler;
 import me.km.overrides.ModPlayerList;
+import me.km.world.WorldEvents;
 import net.minecraft.block.Block;
 import net.minecraft.block.Blocks;
 import net.minecraft.server.dedicated.DedicatedServer;
@@ -54,6 +55,7 @@ public class KajetansMod {
     }
 
     private void serverInit(FMLDedicatedServerSetupEvent e) {
+        MinecraftForge.EVENT_BUS.register(new WorldEvents());
         Hooks.setPlayerListFunction((ds, impl, pd) -> {
             ds.setPlayerList(new ModPlayerList(ds, impl, pd));
         });

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

@@ -5,7 +5,6 @@ import me.hammerle.snuviscript.config.SnuviConfig;
 import me.kcm.Hooks;
 import me.km.databank.DataBank;
 import me.km.events.CustomEventCaller;
-import me.km.overrides.ModPlayerList;
 import me.km.permissions.ModCommandManager;
 import me.km.permissions.Permissions;
 import me.km.playerbank.DummyPlayerBank;

+ 8 - 1
src/main/java/me/km/snuviscript/ScriptEvents.java

@@ -678,7 +678,7 @@ public class ScriptEvents implements BlockHarvest, Craft {
     }
 
     @SubscribeEvent(receiveCanceled = true)
-    public void onSneak(EntityMobGriefingEvent e) {
+    public void onMobGriefing(EntityMobGriefingEvent e) {
         handleEvent(e, "mob_griefing", (sc) -> {
             setEntity(sc, e.getEntity());
             sc.setVar("cancel", !e.getEntity().world.getGameRules().getBoolean(GameRules.MOB_GRIEFING));
@@ -688,6 +688,13 @@ public class ScriptEvents implements BlockHarvest, Craft {
             });
         });
     }
+    
+    @SubscribeEvent(receiveCanceled = true)
+    public void onWorldLoad(WorldEvent.Load e) {
+        handleEvent(e, "world_load", (sc) -> {
+            sc.setVar("world", e.getWorld());
+        });
+    }
 
     @Override
     public void onCraft(int id, World w, PlayerEntity p, CraftingInventory inv, CraftResultInventory result) {

+ 13 - 3
src/main/java/me/km/snuviscript/commands/EntityCommands.java

@@ -10,10 +10,11 @@ import me.km.utils.Utils;
 import net.minecraft.enchantment.EnchantmentHelper;
 import net.minecraft.entity.*;
 import net.minecraft.entity.ai.attributes.Attributes;
-import net.minecraft.entity.effect.LightningBoltEntity;
 import net.minecraft.entity.item.*;
 import net.minecraft.entity.monster.CreeperEntity;
 import net.minecraft.entity.passive.SheepEntity;
+import net.minecraft.entity.passive.TameableEntity;
+import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.entity.player.ServerPlayerEntity;
 import net.minecraft.entity.projectile.*;
 import net.minecraft.inventory.EquipmentSlotType;
@@ -26,7 +27,6 @@ import net.minecraft.potion.PotionUtils;
 import net.minecraft.util.DamageSource;
 import net.minecraft.util.Direction;
 import net.minecraft.util.ResourceLocation;
-import net.minecraft.util.math.BlockPos;
 import net.minecraft.util.math.vector.Vector3d;
 import net.minecraft.util.text.StringTextComponent;
 import net.minecraft.world.World;
@@ -43,7 +43,7 @@ public class EntityCommands {
         sm.registerFunction("entity.getarmorthoughness", (sc, in) -> ((LivingEntity) in[0].get(sc)).getAttribute(Attributes.ARMOR_TOUGHNESS).getValue());
         sm.registerFunction("entity.getarmor", (sc, in) -> (double) ((LivingEntity) in[0].get(sc)).getTotalArmorValue());
         sm.registerFunction("entity.getenchantmentmodifier", (sc, in) -> EnchantmentHelper.getEnchantmentModifierDamage(((LivingEntity) in[0].get(sc)).getArmorInventoryList(), (DamageSource) in[1].get(sc)));
-        sm.registerConsumer("entity.setburning", (sc, in) -> ((Entity) in[0].get(sc)).setFire(in[1].getInt(sc)));
+        sm.registerConsumer("entity.setburning", (sc, in) -> ((Entity) in[0].get(sc)).forceFireTicks(in[1].getInt(sc)));
         sm.registerFunction("entity.isburning", (sc, in) -> ((Entity) in[0].get(sc)).isBurning());
         sm.registerFunction("entity.getlook", (sc, in) -> {
             Object[] o = new Object[3];
@@ -267,6 +267,16 @@ public class EntityCommands {
         sm.registerFunction("sheep.issheared", (sc, in) -> ((SheepEntity) in[0].get(sc)).getSheared());
         sm.registerFunction("sheep.getcolor", (sc, in) -> ((SheepEntity) in[0].get(sc)).getFleeceColor().toString());
         sm.registerConsumer("creeper.explode", (sc, in) -> ((CreeperEntity) in[0].get(sc)).ignite());
+        sm.registerFunction("pet.istamed", (sc, in) -> ((TameableEntity) in[0].get(sc)).isTamed());
+        sm.registerConsumer("pet.settamed", (sc, in) -> {
+            TameableEntity t = (TameableEntity) in[0].get(sc);
+            boolean b = in[1].getBoolean(sc);
+            if(b) {
+                t.setTamedBy((PlayerEntity) in[2].get(sc));
+            }
+            t.setTamed(b);
+        });
+        sm.registerFunction("pet.getowner", (sc, in) -> ((TameableEntity) in[0].get(sc)).getOwner());
     }
 
     private static <T> T launchProjectile(LivingEntity liv, Class<? extends T> projectile, double scale, Object data) {

+ 1 - 0
src/main/java/me/km/snuviscript/commands/LivingCommands.java

@@ -11,6 +11,7 @@ import net.minecraft.entity.MobEntity;
 import net.minecraft.entity.ai.attributes.Attribute;
 import net.minecraft.entity.ai.attributes.AttributeModifier;
 import net.minecraft.entity.ai.attributes.ModifiableAttributeInstance;
+import net.minecraft.entity.player.PlayerEntity;
 import net.minecraftforge.registries.ForgeRegistries;
 
 public class LivingCommands {

+ 1 - 1
src/main/java/me/km/snuviscript/commands/WorldCommands.java

@@ -22,7 +22,7 @@ public class WorldCommands {
         });
         sm.registerConsumer("world.setspawn", (sc, in) -> {
             Location l = ((Location) in[0].get(sc));
-            ((ServerWorld) l.getWorld()).func_241124_a__(l.getBlockPos(), in.length > 0 ? in[1].getFloat(sc) : 0.0f);
+            ((ServerWorld) l.getWorld()).func_241124_a__(l.getBlockPos(), in.length >= 2 ? in[1].getFloat(sc) : 0.0f);
         });
         sm.registerFunction("world.getspawn", (sc, in) -> {
             ServerWorld w = (ServerWorld) in[0].get(sc);

+ 12 - 4
src/main/java/me/km/utils/ReflectionUtils.java

@@ -11,7 +11,6 @@ import net.minecraft.block.FireBlock;
 import net.minecraft.command.Commands;
 import net.minecraft.entity.ai.goal.GoalSelector;
 import net.minecraft.entity.ai.goal.PrioritizedGoal;
-import net.minecraft.entity.player.PlayerAbilities;
 import net.minecraft.entity.player.ServerPlayerEntity;
 import net.minecraft.resources.DataPackRegistries;
 import net.minecraft.server.MinecraftServer;
@@ -23,8 +22,9 @@ import net.minecraft.util.text.ITextComponent;
 import net.minecraft.world.Explosion;
 import net.minecraft.world.GameRules;
 import net.minecraft.world.GameType;
-import net.minecraft.world.IWorld;
+import net.minecraft.world.World;
 import net.minecraft.world.server.ServerWorld;
+import net.minecraft.world.storage.IServerWorldInfo;
 import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
 import static net.minecraftforge.fml.common.ObfuscationReflectionHelper.remapName;
 import org.apache.logging.log4j.LogManager;
@@ -140,7 +140,7 @@ public class ReflectionUtils {
     public static void setSaturation(FoodStats stats, float f) {
         setFloat(stats, FOOD_SATURATION_LEVEL, f);
     }
-    
+
     // -----------------------------------------------------------------------------------
     // PlayerList
     // -----------------------------------------------------------------------------------
@@ -207,10 +207,18 @@ public class ReflectionUtils {
             LogManager.getLogger().warn("setFireInfo - " + ex);
         }
     }
-    
+
     private final static Field SIGN_TEXT = getField(SignTileEntity.class, "field_145915_a");
 
     public static ITextComponent getSignText(SignTileEntity ent, int index) {
         return getFieldValue(ITextComponent[].class, ent, SIGN_TEXT)[index];
     }
+
+    private final static Field WORLD_INFO = getField(World.class, "field_72986_A"); // worldInfo
+    private final static Field SERVER_WORLD_INFO = getField(ServerWorld.class, "field_241103_E_"); // worldInfo
+
+    public static void setWorldInfo(ServerWorld w, IServerWorldInfo info) {
+        setFieldValue(w, WORLD_INFO, info);
+        setFieldValue(w, SERVER_WORLD_INFO, info);
+    }
 }

+ 231 - 0
src/main/java/me/km/world/ModWorldInfo.java

@@ -0,0 +1,231 @@
+package me.km.world;
+
+import java.util.UUID;
+import net.minecraft.command.TimerCallbackManager;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.world.Difficulty;
+import net.minecraft.world.GameRules;
+import net.minecraft.world.GameType;
+import net.minecraft.world.border.WorldBorder;
+import net.minecraft.world.storage.IServerWorldInfo;
+
+public class ModWorldInfo implements IServerWorldInfo {
+    private final IServerWorldInfo parent;
+    private boolean thundering;
+    private int rainTime = 0;
+    private int thunderTime = 0;
+    private int clearWeatherTime = 0;
+    private int traderDelay = 0;
+    private int traderSpawnChance = 0;
+    private long gameTime = 0;
+    private long dayTime = 0;
+    private int spawnX = 0;
+    private int spawnY = 0;
+    private int spawnZ = 0;
+    private float spawnAngle = 0.0f;
+    private boolean raining = false;
+    private final GameRules rules = new GameRules();
+
+    public ModWorldInfo(IServerWorldInfo parent) {
+        this.parent = parent;
+    }
+
+    @Override
+    public String getWorldName() {
+        return parent.getWorldName();
+    }
+
+    @Override
+    public void setThundering(boolean bln) {
+        thundering = bln;
+    }
+
+    @Override
+    public int getRainTime() {
+        return rainTime;
+    }
+
+    @Override
+    public void setRainTime(int i) {
+        rainTime = i;
+    }
+
+    @Override
+    public void setThunderTime(int i) {
+        thunderTime = i;
+    }
+
+    @Override
+    public int getThunderTime() {
+        return thunderTime;
+    }
+
+    @Override
+    public int getClearWeatherTime() {
+        return clearWeatherTime;
+    }
+
+    @Override
+    public void setClearWeatherTime(int i) {
+        clearWeatherTime = i;
+    }
+
+    @Override
+    public int getWanderingTraderSpawnDelay() {
+        return traderDelay;
+    }
+
+    @Override
+    public void setWanderingTraderSpawnDelay(int i) {
+        traderDelay = i;
+    }
+
+    @Override
+    public int getWanderingTraderSpawnChance() {
+        return traderSpawnChance;
+    }
+
+    @Override
+    public void setWanderingTraderSpawnChance(int i) {
+        traderSpawnChance = i;
+    }
+
+    @Override
+    public void setWanderingTraderID(UUID uuid) {
+    }
+
+    @Override
+    public GameType getGameType() {
+        return parent.getGameType();
+    }
+
+    @Override
+    public void setWorldBorderSerializer(WorldBorder.Serializer srlzr) {
+        parent.setWorldBorderSerializer(srlzr);
+    }
+
+    @Override
+    public WorldBorder.Serializer getWorldBorderSerializer() {
+        return parent.getWorldBorderSerializer();
+    }
+
+    @Override
+    public boolean isInitialized() {
+        return parent.isInitialized();
+    }
+
+    @Override
+    public void setInitialized(boolean bln) {
+        parent.setInitialized(bln);
+    }
+
+    @Override
+    public boolean areCommandsAllowed() {
+        return parent.areCommandsAllowed();
+    }
+
+    @Override
+    public void setGameType(GameType gt) {
+        parent.setGameType(gt);
+    }
+
+    @Override
+    public TimerCallbackManager<MinecraftServer> getScheduledEvents() {
+        return parent.getScheduledEvents();
+    }
+
+    @Override
+    public void setGameTime(long l) {
+        gameTime = l;
+    }
+
+    @Override
+    public void setDayTime(long l) {
+        dayTime = l;
+    }
+
+    @Override
+    public void setSpawnX(int i) {
+        spawnX = i;
+    }
+
+    @Override
+    public void setSpawnY(int i) {
+        spawnY = i;
+    }
+
+    @Override
+    public void setSpawnZ(int i) {
+        spawnZ = i;
+    }
+
+    @Override
+    public void setSpawnAngle(float f) {
+        spawnAngle = f;
+    }
+
+    @Override
+    public int getSpawnX() {
+        return spawnX;
+    }
+
+    @Override
+    public int getSpawnY() {
+        return spawnY;
+    }
+
+    @Override
+    public int getSpawnZ() {
+        return spawnZ;
+    }
+
+    @Override
+    public float getSpawnAngle() {
+        return spawnAngle;
+    }
+
+    @Override
+    public long getGameTime() {
+        return gameTime;
+    }
+
+    @Override
+    public long getDayTime() {
+        return dayTime;
+    }
+
+    @Override
+    public boolean isThundering() {
+        return thundering;
+    }
+
+    @Override
+    public boolean isRaining() {
+        return raining;
+    }
+
+    @Override
+    public void setRaining(boolean bln) {
+        raining = bln;
+    }
+
+    @Override
+    public boolean isHardcore() {
+        return parent.isHardcore();
+    }
+
+    @Override
+    public GameRules getGameRulesInstance() {
+        return rules;
+    }
+
+    @Override
+    public Difficulty getDifficulty() {
+        return parent.getDifficulty();
+    }
+
+    @Override
+    public boolean isDifficultyLocked() {
+        return parent.isDifficultyLocked();
+    }
+}

+ 24 - 0
src/main/java/me/km/world/WorldEvents.java

@@ -0,0 +1,24 @@
+package me.km.world;
+
+import me.km.utils.ReflectionUtils;
+import me.km.utils.Utils;
+import net.minecraft.world.server.ServerWorld;
+import net.minecraft.world.storage.DerivedWorldInfo;
+import net.minecraftforge.event.world.WorldEvent;
+import net.minecraftforge.eventbus.api.EventPriority;
+import net.minecraftforge.eventbus.api.SubscribeEvent;
+
+public class WorldEvents {
+    @SubscribeEvent(priority = EventPriority.HIGHEST)
+    public void onWorldLoad(WorldEvent.Load e) {
+        if(!(e.getWorld() instanceof ServerWorld)) {
+            return;
+        }
+        ServerWorld w = (ServerWorld) e.getWorld();
+        if(w.getWorldInfo() instanceof DerivedWorldInfo) {
+            DerivedWorldInfo info = (DerivedWorldInfo) w.getWorldInfo();
+            ReflectionUtils.setWorldInfo(w, new ModWorldInfo(info));
+            System.out.println(String.format("updated world info of %s to mod world info", Utils.getWorldName(w)));
+        }
+    }
+}