diff --git a/Minecraft/src/main/java/com/microsoft/Malmo/MissionHandlers/AgentQuitFromTouchingBlockTypeImplementation.java b/Minecraft/src/main/java/com/microsoft/Malmo/MissionHandlers/AgentQuitFromTouchingBlockTypeImplementation.java index badb8e067..c64661d06 100755 --- a/Minecraft/src/main/java/com/microsoft/Malmo/MissionHandlers/AgentQuitFromTouchingBlockTypeImplementation.java +++ b/Minecraft/src/main/java/com/microsoft/Malmo/MissionHandlers/AgentQuitFromTouchingBlockTypeImplementation.java @@ -28,8 +28,11 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.util.BlockPos; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import com.microsoft.Malmo.MissionHandlerInterfaces.IWantToQuit; +import com.microsoft.Malmo.MissionHandlers.RewardForCollectingItemImplementation.GainItemEvent; import com.microsoft.Malmo.Schemas.AgentQuitFromTouchingBlockType; import com.microsoft.Malmo.Schemas.BlockSpec; import com.microsoft.Malmo.Schemas.BlockSpecWithDescription; @@ -44,6 +47,7 @@ public class AgentQuitFromTouchingBlockTypeImplementation extends HandlerBase im AgentQuitFromTouchingBlockType params; List blockTypeNames; String quitCode = ""; + boolean wantToQuit = false; @Override public boolean parseParameters(Object params) @@ -65,9 +69,18 @@ public boolean parseParameters(Object params) return true; } + @SubscribeEvent + public void onDiscretePartialMoveEvent(DiscreteMovementCommandsImplementation.DiscretePartialMoveEvent event) + { + this.wantToQuit = doIWantToQuit(null); + } + @Override public boolean doIWantToQuit(MissionInit missionInit) { + if (this.wantToQuit) + return true; + EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; List touchingBlocks = PositionHelper.getTouchingBlocks(player); for (BlockPos pos : touchingBlocks) @@ -161,13 +174,19 @@ private boolean findMatch(BlockSpec blockspec, IBlockState blockstate) return true; } - @Override - public void prepare(MissionInit missionInit) {} + @Override + public void prepare(MissionInit missionInit) + { + MinecraftForge.EVENT_BUS.register(this); + } - @Override - public void cleanup() {} - - @Override + @Override + public void cleanup() + { + MinecraftForge.EVENT_BUS.unregister(this); + } + + @Override public String getOutcome() { return this.quitCode; diff --git a/Minecraft/src/main/java/com/microsoft/Malmo/MissionHandlers/DiscreteMovementCommandsImplementation.java b/Minecraft/src/main/java/com/microsoft/Malmo/MissionHandlers/DiscreteMovementCommandsImplementation.java index d734a5830..75695519f 100755 --- a/Minecraft/src/main/java/com/microsoft/Malmo/MissionHandlers/DiscreteMovementCommandsImplementation.java +++ b/Minecraft/src/main/java/com/microsoft/Malmo/MissionHandlers/DiscreteMovementCommandsImplementation.java @@ -28,6 +28,8 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.util.BlockPos; import net.minecraft.util.MovingObjectPosition; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; @@ -52,6 +54,20 @@ public class DiscreteMovementCommandsImplementation extends CommandBase implemen private boolean isOverriding; private int direction = -1; + public static class DiscretePartialMoveEvent extends Event + { + public final double x; + public final double y; + public final double z; + + public DiscretePartialMoveEvent(double x, double y, double z) + { + this.x = x; + this.y = y; + this.z = z; + } + } + public static class UseActionMessage implements IMessage { String parameters; @@ -256,6 +272,7 @@ else if (verb.equalsIgnoreCase(DiscreteMovementCommand.USE.value())) // Now check where we ended up: double newX = player.posX; double newZ = player.posZ; + // Are we still in the centre of a square, or did we get shunted? double desiredX = Math.floor(newX) + 0.5; double desiredZ = Math.floor(newZ) + 0.5; @@ -263,7 +280,12 @@ else if (verb.equalsIgnoreCase(DiscreteMovementCommand.USE.value())) double deltaZ = desiredZ - newZ; if (deltaX * deltaX + deltaZ * deltaZ > 0.001) { - // Need to re-centralise: + // Need to re-centralise. + // Before we do that, fire off a message - this will give the TouchingBlockType handlers + // a chance to react to the current position: + DiscretePartialMoveEvent event = new DiscretePartialMoveEvent(player.posX, player.posY, player.posZ); + MinecraftForge.EVENT_BUS.post(event); + // Now adjust the player: player.moveEntity(deltaX, 0, deltaZ); player.onUpdate(); } diff --git a/Minecraft/src/main/java/com/microsoft/Malmo/MissionHandlers/RewardForTouchingBlockTypeImplementation.java b/Minecraft/src/main/java/com/microsoft/Malmo/MissionHandlers/RewardForTouchingBlockTypeImplementation.java index 82f1b7002..a08537ef3 100755 --- a/Minecraft/src/main/java/com/microsoft/Malmo/MissionHandlers/RewardForTouchingBlockTypeImplementation.java +++ b/Minecraft/src/main/java/com/microsoft/Malmo/MissionHandlers/RewardForTouchingBlockTypeImplementation.java @@ -23,18 +23,17 @@ import java.util.List; import net.minecraft.block.Block; -import net.minecraft.block.properties.IProperty; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.util.BlockPos; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import com.microsoft.Malmo.MissionHandlerInterfaces.IRewardProducer; import com.microsoft.Malmo.Schemas.Behaviour; import com.microsoft.Malmo.Schemas.BlockSpecWithRewardAndBehaviour; import com.microsoft.Malmo.Schemas.BlockType; -import com.microsoft.Malmo.Schemas.Variation; -import com.microsoft.Malmo.Schemas.Colour; import com.microsoft.Malmo.Schemas.MissionInit; import com.microsoft.Malmo.Schemas.RewardForTouchingBlockType; import com.microsoft.Malmo.Utils.MinecraftTypeHelper; @@ -47,7 +46,7 @@ private class BlockMatcher { ArrayList allowedBlockNames; ArrayList firedBlocks = new ArrayList(); long lastFired; - + BlockMatcher(BlockSpecWithRewardAndBehaviour spec) { this.spec = spec; @@ -115,7 +114,7 @@ float reward() { } ArrayList matchers = new ArrayList(); - + MultidimensionalReward cachedReward = null; private RewardForTouchingBlockType params; @Override @@ -130,8 +129,23 @@ public boolean parseParameters(Object params) { return true; } + @SubscribeEvent + public void onDiscretePartialMoveEvent(DiscreteMovementCommandsImplementation.DiscretePartialMoveEvent event) + { + MultidimensionalReward reward = new MultidimensionalReward(); + getReward(null, reward); + this.cachedReward = reward; + } + @Override - public void getReward(MissionInit missionInit, MultidimensionalReward reward) { + public void getReward(MissionInit missionInit, MultidimensionalReward reward) + { + if (this.cachedReward != null) + { + reward.add(this.cachedReward); + this.cachedReward = null; + return; + } // Determine what blocks we are touching. // This code is largely cribbed from Entity, where it is used to fire // the Block.onEntityCollidedWithBlock methods. @@ -148,10 +162,14 @@ public void getReward(MissionInit missionInit, MultidimensionalReward reward) { } @Override - public void prepare(MissionInit missionInit) { + public void prepare(MissionInit missionInit) + { + MinecraftForge.EVENT_BUS.register(this); } @Override - public void cleanup() { + public void cleanup() + { + MinecraftForge.EVENT_BUS.unregister(this); } } diff --git a/changelog.txt b/changelog.txt index ec8ea69a7..2f5730057 100755 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,6 @@ 0.16.0 ------------------- +New: DiscreteCommandHandler now supports AgentQuitFromTouchingBlockType and RewardForTouchingBlockType. (#241) New: MissionSpec has get/setSummary, getListOfCommandHandlers, getAllowedCommands. (#217) New: DiscreteCommandHandler now supports attack and use commands. (#219) New: Bonus - added AllowedMobs to ServerInitialConditions to control which mobs are allowed to spawn (does not affect mob_spawners)