sprint on soul sand, fixes #120
This commit is contained in:
parent
109cffc3de
commit
76365a4564
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user