109 lines
2.2 KiB
Python
Executable File
109 lines
2.2 KiB
Python
Executable File
#
|
|
# Code under the MIT license by Alexander Pruss
|
|
#
|
|
|
|
#
|
|
# python grenade.py [speed [gravity]]
|
|
#
|
|
# Throws a grenade with the specified speed in m/s (default: 15) and specified
|
|
# gravitational acceleration (default: earth) in m/s^2 or given by listing a planet,
|
|
# sun, moon or pluto.
|
|
#
|
|
|
|
from mc import *
|
|
from vehicle import *
|
|
import time
|
|
import sys
|
|
|
|
GRAVITIES = {
|
|
'sun':274,
|
|
'mercury':3.59,
|
|
'venus':8.87,
|
|
'earth':9.81,
|
|
'moon':1.62,
|
|
'mars':3.77,
|
|
'jupiter':25.95,
|
|
'saturn':11.08,
|
|
'uranus':10.67,
|
|
'neptune':14.07,
|
|
'pluto':0.42
|
|
}
|
|
|
|
def getPath(center, azi, alt, v0):
|
|
vx = v0 * cos(alt) * sin(-azi)
|
|
vy = v0 * sin(alt)
|
|
vz = v0 * cos(alt) * cos(-azi)
|
|
t = 0
|
|
x = center.x + cos(alt) * sin(-azi) * 2
|
|
y = center.y + sin(alt) * 2 + 2
|
|
z = center.z + cos(alt) * cos(-azi) * 2
|
|
path = [(t,Vec3(round(x),round(y),round(z)))]
|
|
while not mc.getBlock(x,y,z):
|
|
v = sqrt(vx*vx+vy*vy+vz*vz)
|
|
if v < 1:
|
|
dt = 0.5
|
|
else:
|
|
dt = 0.5/v
|
|
v1x = vx
|
|
v1y = vy - g * dt
|
|
v1z = vz
|
|
x += (vx+v1x)/2 * dt
|
|
y += (vy+v1y)/2 * dt
|
|
z += (vz+v1z)/2 * dt
|
|
vx = v1x
|
|
vy = v1y
|
|
vz = v1z
|
|
t += dt
|
|
path.append( ( t,Vec3(round(x),round(y),round(z)) ) )
|
|
return path
|
|
|
|
def getXYZ(path, t1):
|
|
for t,xyz in path:
|
|
if t1<=t:
|
|
return xyz
|
|
return path[-1][1]
|
|
|
|
mc = Minecraft()
|
|
|
|
try:
|
|
v0 = int(sys.argv[1])
|
|
except:
|
|
v0 = 15
|
|
|
|
if 3 <= len(sys.argv):
|
|
try:
|
|
g = float(sys.argv[2])
|
|
except:
|
|
g = GRAVITIES[sys.argv[2].lower()]
|
|
else:
|
|
g = GRAVITIES['earth']
|
|
|
|
center = mc.player.getPos()
|
|
azi = mc.player.getRotation() * pi/180.
|
|
alt = -mc.player.getPitch() * pi/180.
|
|
|
|
GRENADE = { (-1,0,0):TNT, (1,0,0):TNT, (0,-1,0):TNT, (0,1,0):TNT, (0,0,1):TNT, (0,0,-1):TNT }
|
|
|
|
grenade = Vehicle(mc, False)
|
|
grenade.setVehicle(GRENADE)
|
|
|
|
path = getPath(center, azi, alt, v0)
|
|
|
|
dictionary = {}
|
|
prev = path[0][1]
|
|
|
|
grenade.draw(prev.x,prev.y,prev.z)
|
|
|
|
t0 = time.time()
|
|
|
|
while True:
|
|
t = time.time() - t0
|
|
pos = getXYZ(path,t)
|
|
grenade.moveTo(pos.x,pos.y,pos.z)
|
|
prev=pos
|
|
time.sleep(0.1)
|
|
if t > path[-1][0]:
|
|
break
|
|
|
|
mc.setBlock(path[-1][1],FIRE)
|