sprint on soul sand, fixes #120

This commit is contained in:
Leijurv 2018-10-01 10:05:04 -07:00
parent 109cffc3de
commit 76365a4564
No known key found for this signature in database
GPG Key ID: 44A3EA646EADAC6A
3 changed files with 19 additions and 13 deletions

View File

@ -23,21 +23,21 @@ public interface ActionCosts {
* These costs are measured roughly in ticks btw * These costs are measured roughly in ticks btw
*/ */
double WALK_ONE_BLOCK_COST = 20 / 4.317; // 4.633 double WALK_ONE_BLOCK_COST = 20 / 4.317; // 4.633
double WALK_ONE_IN_WATER_COST = 20 / 2.2; double WALK_ONE_IN_WATER_COST = 20 / 2.2; // 9.091
double WALK_ONE_OVER_SOUL_SAND_COST = WALK_ONE_BLOCK_COST * 2; // 0.4 in BlockSoulSand but effectively about half double WALK_ONE_OVER_SOUL_SAND_COST = WALK_ONE_BLOCK_COST * 2; // 0.4 in BlockSoulSand but effectively about half
double SPRINT_ONE_OVER_SOUL_SAND_COST = WALK_ONE_OVER_SOUL_SAND_COST * 0.75; double LADDER_UP_ONE_COST = 20 / 2.35; // 8.511
double LADDER_UP_ONE_COST = 20 / 2.35; double LADDER_DOWN_ONE_COST = 20 / 3.0; // 6.667
double LADDER_DOWN_ONE_COST = 20 / 3.0; double SNEAK_ONE_BLOCK_COST = 20 / 1.3; // 15.385
double SNEAK_ONE_BLOCK_COST = 20 / 1.3;
double SPRINT_ONE_BLOCK_COST = 20 / 5.612; // 3.564 double SPRINT_ONE_BLOCK_COST = 20 / 5.612; // 3.564
double SPRINT_MULTIPLIER = SPRINT_ONE_BLOCK_COST / WALK_ONE_BLOCK_COST; // 0.769
/** /**
* To walk off an edge you need to walk 0.5 to the edge then 0.3 to start falling off * To walk off an edge you need to walk 0.5 to the edge then 0.3 to start falling off
*/ */
double WALK_OFF_BLOCK_COST = WALK_ONE_BLOCK_COST * 0.8; double WALK_OFF_BLOCK_COST = WALK_ONE_BLOCK_COST * 0.8; // 3.706
/** /**
* To walk the rest of the way to be centered on the new block * To walk the rest of the way to be centered on the new block
*/ */
double CENTER_AFTER_FALL_COST = WALK_ONE_BLOCK_COST - WALK_OFF_BLOCK_COST; double CENTER_AFTER_FALL_COST = WALK_ONE_BLOCK_COST - WALK_OFF_BLOCK_COST; // 0.927
/** /**
* don't make this Double.MAX_VALUE because it's added to other things, maybe other COST_INFs, * don't make this Double.MAX_VALUE because it's added to other things, maybe other COST_INFs,

View File

@ -117,19 +117,22 @@ public class MovementDiagonal extends Movement {
return COST_INF; return COST_INF;
} }
} }
boolean water = false;
if (BlockStateInterface.isWater(BlockStateInterface.getBlock(x, y, z)) || BlockStateInterface.isWater(destInto.getBlock())) { if (BlockStateInterface.isWater(BlockStateInterface.getBlock(x, y, z)) || BlockStateInterface.isWater(destInto.getBlock())) {
// Ignore previous multiplier // Ignore previous multiplier
// Whatever we were walking on (possibly soul sand) doesn't matter as we're actually floating on water // Whatever we were walking on (possibly soul sand) doesn't matter as we're actually floating on water
// Not even touching the blocks below // Not even touching the blocks below
multiplier = WALK_ONE_IN_WATER_COST; multiplier = WALK_ONE_IN_WATER_COST;
water = true;
} }
if (optionA != 0 || optionB != 0) { if (optionA != 0 || optionB != 0) {
multiplier *= SQRT_2 - 0.001; // TODO tune multiplier *= SQRT_2 - 0.001; // TODO tune
} }
if (multiplier == WALK_ONE_BLOCK_COST && context.canSprint()) { if (context.canSprint() && !water) {
// If we aren't edging around anything, and we aren't in water or soul sand // If we aren't edging around anything, and we aren't in water
// We can sprint =D // We can sprint =D
multiplier = SPRINT_ONE_BLOCK_COST; // Don't check for soul sand, since we can sprint on that too
multiplier *= SPRINT_MULTIPLIER;
} }
return multiplier * SQRT_2; return multiplier * SQRT_2;
} }

View File

@ -67,8 +67,10 @@ public class MovementTraverse extends Movement {
Block srcDown = BlockStateInterface.getBlock(x, y - 1, z); Block srcDown = BlockStateInterface.getBlock(x, y - 1, z);
if (MovementHelper.canWalkOn(destX, y - 1, destZ, destOn)) {//this is a walk, not a bridge if (MovementHelper.canWalkOn(destX, y - 1, destZ, destOn)) {//this is a walk, not a bridge
double WC = WALK_ONE_BLOCK_COST; double WC = WALK_ONE_BLOCK_COST;
boolean water = false;
if (BlockStateInterface.isWater(pb0.getBlock()) || BlockStateInterface.isWater(pb1.getBlock())) { if (BlockStateInterface.isWater(pb0.getBlock()) || BlockStateInterface.isWater(pb1.getBlock())) {
WC = WALK_ONE_IN_WATER_COST; WC = WALK_ONE_IN_WATER_COST;
water = true;
} else { } else {
if (destOn.getBlock() == Blocks.SOUL_SAND) { if (destOn.getBlock() == Blocks.SOUL_SAND) {
WC += (WALK_ONE_OVER_SOUL_SAND_COST - WALK_ONE_BLOCK_COST) / 2; WC += (WALK_ONE_OVER_SOUL_SAND_COST - WALK_ONE_BLOCK_COST) / 2;
@ -83,10 +85,11 @@ public class MovementTraverse extends Movement {
} }
double hardness2 = MovementHelper.getMiningDurationTicks(context, destX, y, destZ, pb1, false); double hardness2 = MovementHelper.getMiningDurationTicks(context, destX, y, destZ, pb1, false);
if (hardness1 == 0 && hardness2 == 0) { if (hardness1 == 0 && hardness2 == 0) {
if (WC == WALK_ONE_BLOCK_COST && context.canSprint()) { if (!water && context.canSprint()) {
// If there's nothing in the way, and this isn't water or soul sand, and we aren't sneak placing // If there's nothing in the way, and this isn't water, and we aren't sneak placing
// We can sprint =D // We can sprint =D
WC = SPRINT_ONE_BLOCK_COST; // Don't check for soul sand, since we can sprint on that too
WC *= SPRINT_MULTIPLIER;
} }
return WC; return WC;
} }