2020-09-16 06:49:15 +00:00
|
|
|
import importlib
|
2020-09-17 01:12:01 +00:00
|
|
|
from math import floor, ceil, sqrt, hypot
|
2020-09-08 21:33:42 +00:00
|
|
|
|
2020-09-16 06:49:15 +00:00
|
|
|
import blocks
|
|
|
|
importlib.reload(blocks)
|
2020-09-21 01:08:23 +00:00
|
|
|
import data
|
2020-09-16 06:49:15 +00:00
|
|
|
|
|
|
|
TICK = 0.05
|
|
|
|
|
2020-09-08 21:33:42 +00:00
|
|
|
def padd(p1, p2):
|
|
|
|
return (p1[0] + p2[0], p1[1] + p2[1], p1[2] + p2[2])
|
|
|
|
|
|
|
|
def psub(p1, p2):
|
|
|
|
return (p1[0] - p2[0], p1[1] - p2[1], p1[2] - p2[2])
|
|
|
|
|
|
|
|
def pmul(p, s):
|
|
|
|
return (s*p[0], s*p[1], s*p[2])
|
|
|
|
|
|
|
|
def phyp(p1, p2):
|
|
|
|
return hypot(p1[0] - p2[0], p1[1] - p2[1], p1[2] - p2[2])
|
|
|
|
|
|
|
|
def phyp_bias(p1, p2, origin):
|
|
|
|
origin_distance = phyp(origin, p2)
|
|
|
|
height_diff = p2[1] - p1[1]
|
|
|
|
height_diff = height_diff*8 if height_diff < 0 else height_diff*0.5
|
2020-09-17 09:11:08 +00:00
|
|
|
return hypot(p1[0] - p2[0], height_diff, p1[2] - p2[2]) + origin_distance*0.5
|
2020-09-08 21:33:42 +00:00
|
|
|
|
2020-09-25 21:51:36 +00:00
|
|
|
def phyp_king(p1, p2):
|
|
|
|
# calculates the Chebyshev distance
|
|
|
|
return max(abs(p1[0] - p2[0]), abs(p1[1] - p2[1]), abs(p1[2] - p2[2]))
|
|
|
|
|
2020-09-08 21:33:42 +00:00
|
|
|
def pint(p):
|
|
|
|
return (floor(p[0]), floor(p[1]), floor(p[2]))
|
|
|
|
|
|
|
|
def cap(x, amount):
|
|
|
|
sign = 1 if x >= 0 else -1
|
|
|
|
return sign * min(abs(x), amount)
|
|
|
|
|
2020-09-17 01:12:01 +00:00
|
|
|
def spiral(n):
|
|
|
|
# return x, 0, z coords along a spiral at step n
|
|
|
|
# I forget where I found this
|
|
|
|
n += 1
|
|
|
|
k = ceil((sqrt(n)-1)/2)
|
|
|
|
t = 2 * k + 1
|
|
|
|
m = t**2
|
|
|
|
t = t - 1
|
|
|
|
if n >= m-t:
|
|
|
|
return k-(m-n), 0, -k
|
|
|
|
else:
|
|
|
|
m = m-t
|
|
|
|
if n >= m-t:
|
|
|
|
return -k, 0, -k+(m-n)
|
|
|
|
else:
|
|
|
|
m = m-t
|
|
|
|
if n >= m-t:
|
|
|
|
return -k+(m-n), 0, k
|
|
|
|
else:
|
|
|
|
return k, 0, k-(m-n-t)
|
|
|
|
|
|
|
|
def alternate(n, amount):
|
|
|
|
# return 0, y, 0 where y alternates +/- by amount
|
|
|
|
# example: 0, 2, -2, 4, -4, 6, -6 for amount = 2
|
|
|
|
sign = 1 if n % 2 else -1
|
|
|
|
return (0, ceil(n/2) * sign * amount, 0)
|
|
|
|
|
|
|
|
def diffrange(n):
|
|
|
|
# same as range(n+1) but can go negative
|
|
|
|
sign = 1 if n >= 0 else -1
|
|
|
|
return range(0, n+sign, sign)
|
|
|
|
|
2020-09-16 06:49:15 +00:00
|
|
|
def break_time(block_id, held_item=0, in_water=False, on_ground=True, enchantments=[], effects={}):
|
|
|
|
# from PrismarineJS/prismarine-block
|
2020-09-21 01:08:23 +00:00
|
|
|
block_data = blocks.get(block_id)
|
2020-09-16 06:49:15 +00:00
|
|
|
|
2020-09-21 01:08:23 +00:00
|
|
|
can_harvest = 'harvestTools' not in block_data or str(held_item) in block_data['harvestTools']
|
|
|
|
material = block_data.get('material', 'n/a')
|
|
|
|
tool_multipliers = data.mcd.materials.get(material, [])
|
2020-09-16 06:49:15 +00:00
|
|
|
is_best_tool = held_item in tool_multipliers
|
2020-09-21 01:08:23 +00:00
|
|
|
time = block_data['hardness']
|
2020-09-16 06:49:15 +00:00
|
|
|
|
|
|
|
if can_harvest:
|
|
|
|
time *= 1.5
|
|
|
|
else:
|
|
|
|
time *= 5.0
|
|
|
|
|
|
|
|
if is_best_tool:
|
|
|
|
speed_multiplier = tool_multipliers[held_item]
|
|
|
|
# TODO: calc efficiency, haste, mining fatigue
|
|
|
|
else:
|
|
|
|
speed_multiplier = 1.0
|
|
|
|
|
|
|
|
time /= speed_multiplier
|
|
|
|
if in_water: time *= 5.0
|
|
|
|
if not on_ground: time *= 5.0
|
|
|
|
|
|
|
|
return time
|