Skip to content

Commit 7538000

Browse files
0.29_02 (0.29)
1 parent 63717e1 commit 7538000

25 files changed

+185
-69
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ install:
1212
CYTHONIZE=1 pip install .
1313

1414
install-from-source: dist
15-
pip install dist/minecraft-python-0.28.tar.gz
15+
pip install dist/minecraft-python-0.29.tar.gz
1616

1717
clean:
1818
$(RM) -r build dist src/*.egg-info

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55
_**Minecraft: Python Edition**_ is a project that strives to recreate each and every old Minecraft version in Python 3 using the **Pyglet** multimedia library and **Cython** for performance.
66

7-
This project is currently recreating the **Late Classic** versions of Minecraft. The latest version is **Classic 0.28_01** as released on _**October 27, 2009**_.
7+
This project is currently recreating the **Late Classic** versions of Minecraft. The latest version is **Classic 0.29_02** as released on _**October 30, 2009**_.
88

9-
Learn more about this version [here](https://minecraft.fandom.com/wiki/Java_Edition_Classic_0.28_01).
9+
Learn more about this version [here](https://minecraft.fandom.com/wiki/Java_Edition_Classic_0.29_02).
1010

1111
Or the server version [here](https://minecraft.fandom.com/wiki/Java_Edition_Classic_server_1.8.3).
1212

@@ -22,7 +22,7 @@ you can play it just by specifying the Minecraft version you want to play in the
2222
For audio to work you will either need *PyOgg* which is recommended, or FFmpeg which is installed on the system.
2323
GStreamer is also supported on Linux through the *gst-python* library. PyOgg requires that your system have one of the *Opus*, *FLAC*, or *Vorbis* codecs. OpenAL is required.
2424

25-
To easily install this version of *Minecraft: Python Edition*, just run `python -m pip install minecraft-python==0.28`.
25+
To easily install this version of *Minecraft: Python Edition*, just run `python -m pip install minecraft-python==0.29`.
2626

2727
Alternatively, for a manual Cython build, run `python setup.py build_ext --inplace`.
2828

mc/net/minecraft/Entity.pxd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ cdef class Entity:
4545
public float footSize
4646
public bint noPhysics
4747
public float pushthrough
48+
public bint hovered
4849

4950
cpdef tick(self)
5051
cpdef bint isFree(self, float xa, float ya, float za)

mc/net/minecraft/Entity.pyx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,3 +423,6 @@ cdef class Entity:
423423

424424
def isCreativeModeAllowed(self):
425425
return False
426+
427+
def renderHover(self, textures, a):
428+
pass

mc/net/minecraft/Minecraft.py

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
GL_DEBUG = False
6565

6666
class Minecraft(window.Window):
67-
VERSION_STRING = '0.28_01'
67+
VERSION_STRING = '0.29_02'
6868
level = None
6969
levelRenderer = None
7070
player = None
@@ -256,9 +256,11 @@ def on_key_press(self, symbol, modifiers):
256256

257257
if symbol == window.key.ESCAPE:
258258
self.pauseScreen()
259-
elif symbol == window.key.F5 and not self.networkClient:
259+
elif symbol == window.key.F5:
260260
self.raining = not self.raining
261-
elif symbol == window.key.TAB and not self.networkClient and self.player.arrows > 0:
261+
elif symbol == window.key.TAB and \
262+
isinstance(self.gamemode, SurvivalGameMode) and \
263+
self.player.arrows > 0:
262264
self.level.addEntity(Arrow(self.level, self.player, self.player.x,
263265
self.player.y, self.player.z,
264266
self.player.yRot, self.player.xRot, 1.2))
@@ -785,27 +787,29 @@ def __pick(self, alpha):
785787
d = self.gamemode.getPickRange()
786788
vec2 = rotVec.add(xy * d, x2 * d, y1 * d)
787789
self.hitResult = self.level.clip(rotVec, vec2)
790+
if self.hitResult:
791+
d = self.hitResult.vec.distanceTo(rotVec)
788792

789793
vec = self.gameRenderer.getPlayerRotVec(alpha)
790-
if self.hitResult:
791-
d = self.hitResult.vec.distanceTo(vec)
794+
if isinstance(self.gamemode, CreativeGameMode):
795+
d = 32.0
792796

797+
vec2 = vec.add(xy * d, x2 * d, y1 * d)
793798
entities = self.level.blockMap.getEntitiesWithinAABBExcludingEntity(self.player, self.player.bb.expand(xy * d, x2 * d, y1 * d))
799+
d = 0.0
794800
for entity in entities:
795801
if not entity.isPickable():
796802
continue
797803

798-
axisAlignedBB = entity.bb.grow(0.1, 0.1, 0.1)
799-
di = 0.0
800-
while di < d:
801-
if not axisAlignedBB.contains(vec.add(xy * di, x2 * di, y1 * di)):
802-
di += 0.05
803-
continue
804+
hit = entity.bb.grow(0.1, 0.1, 0.1).clip(vec, vec2)
805+
if hit:
806+
di = vec.distanceTo(hit.vec)
807+
if di < d or d == 0.0:
808+
self.gameRenderer.entity = entity
809+
d = di
804810

805-
d = di
806-
self.hitResult = HitResult(entity)
807-
di += 0.05
808-
break
811+
if self.gameRenderer.entity and not isinstance(self.gamemode, CreativeGameMode):
812+
self.hitResult = HitResult(self.gameRenderer.entity)
809813

810814
def __render(self, alpha):
811815
for i in range(2):
@@ -888,7 +892,7 @@ def __render(self, alpha):
888892
self.gameRenderer.toggleLight(False)
889893
self.gameRenderer.setupFog()
890894
self.particleEngine.render(self.player, alpha)
891-
gl.glBindTexture(gl.GL_TEXTURE_2D, self.levelRenderer.textures.loadTexture('rock.png'))
895+
gl.glBindTexture(gl.GL_TEXTURE_2D, self.textures.loadTexture('rock.png'))
892896
gl.glEnable(gl.GL_TEXTURE_2D)
893897
gl.glCallList(self.levelRenderer.surroundLists)
894898
self.gameRenderer.setupFog()
@@ -919,7 +923,7 @@ def __render(self, alpha):
919923
self.gameRenderer.setupFog()
920924
gl.glEnable(gl.GL_BLEND)
921925
gl.glEnable(gl.GL_TEXTURE_2D)
922-
gl.glBindTexture(gl.GL_TEXTURE_2D, self.levelRenderer.textures.loadTexture('water.png'))
926+
gl.glBindTexture(gl.GL_TEXTURE_2D, self.textures.loadTexture('water.png'))
923927
gl.glCallList(self.levelRenderer.surroundLists + 1)
924928
gl.glDisable(gl.GL_BLEND)
925929
gl.glEnable(gl.GL_BLEND)
@@ -933,7 +937,7 @@ def __render(self, alpha):
933937
gl.glColorMask(True, False, False, False)
934938

935939
if remaining > 0:
936-
gl.glBindTexture(gl.GL_TEXTURE_2D, self.levelRenderer.textures.loadTexture('terrain.png'))
940+
gl.glBindTexture(gl.GL_TEXTURE_2D, self.textures.loadTexture('terrain.png'))
937941
gl.glCallLists(self.levelRenderer.ib.capacity(), gl.GL_INT, self.levelRenderer.ib)
938942

939943
gl.glDepthMask(True)
@@ -942,6 +946,9 @@ def __render(self, alpha):
942946
if self.raining:
943947
self.gameRenderer.renderRain(alpha)
944948

949+
if self.gameRenderer.entity:
950+
self.gameRenderer.entity.renderHover(self.textures, alpha)
951+
945952
gl.glClear(gl.GL_DEPTH_BUFFER_BIT)
946953
gl.glLoadIdentity()
947954
if self.options.anaglyph3d:
@@ -1023,7 +1030,14 @@ def loadLevel(self, level):
10231030
self.gamemode.initLevel(level)
10241031
level.font = self.font
10251032
level.rendererContext = self
1026-
self.player = level.findSubclassOf(Player)
1033+
if self.isOnlineClient():
1034+
self.player = level.findSubclassOf(Player)
1035+
elif self.player:
1036+
self.player.resetPos()
1037+
self.gamemode.initPlayer(self.player)
1038+
if level:
1039+
level.player = self.player
1040+
level.addEntity(self.player)
10271041

10281042
if not self.player:
10291043
self.player = Player(level)

mc/net/minecraft/comm/SocketConnection.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,11 @@ def processData(self):
116116
b9 = data[6]
117117
if b15 not in self.client.players:
118118
if b15 >= 0:
119+
b8 += 128
120+
s21 -= 22
119121
networkPlayer = NetworkPlayer(self.client.minecraft, b15,
120122
string19, s18, s21, s24,
121-
(-b8 * 360) / 256.0,
123+
(b8 * 360) / 256.0,
122124
(b9 * 360) / 256.0)
123125
self.client.players[b15] = networkPlayer
124126
self.client.minecraft.level.addEntity(networkPlayer)
@@ -142,7 +144,9 @@ def processData(self):
142144
float(b25 * 360) / 256.0,
143145
float(b8 * 360) / 256.0)
144146
elif networkPlayer:
145-
networkPlayer.teleport(s17, s18, s21, float(-b25 * 360) / 256.0,
147+
b25 += 128
148+
s18 -= 22
149+
networkPlayer.teleport(s17, s18, s21, float(b25 * 360) / 256.0,
146150
float(b8 * 360) / 256.0)
147151
elif packet == Packets.PLAYER_MOVE_AND_ROTATE:
148152
b15 = data[0]
@@ -153,15 +157,17 @@ def processData(self):
153157
b8 = data[5]
154158
networkPlayer = self.client.players.get(b15)
155159
if b15 >= 0 and networkPlayer:
156-
networkPlayer.queue1(b23, b22, b6, float(-b25 * 360) / 256.0,
160+
b25 += 128
161+
networkPlayer.queue1(b23, b22, b6, float(b25 * 360) / 256.0,
157162
float(b8 * 360) / 256.0)
158163
elif packet == Packets.PLAYER_ROTATE:
159164
b15 = data[0]
160165
b23 = data[1]
161166
b22 = data[2]
162167
networkPlayer = self.client.players.get(b15)
163168
if b15 >= 0 and networkPlayer:
164-
networkPlayer.queue2(float(-b23 * 360) / 256.0,
169+
b23 += 128
170+
networkPlayer.queue2(float(b23 * 360) / 256.0,
165171
float(b22 * 360) / 256.0)
166172
elif packet == Packets.PLAYER_MOVE:
167173
b15 = data[0]

mc/net/minecraft/gamemode/CreativeGameMode.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ def initLevel(self, level):
1515
super().initLevel(level)
1616
level.removeAllNonCreativeModeEntities()
1717
level.creativeMode = True
18+
level.growTrees = False
1819

1920
def adjustPlayer(self, player):
2021
for i in range(9):

mc/net/minecraft/gamemode/GameMode.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ def __init__(self, minecraft):
88

99
def initLevel(self, level):
1010
level.creativeMode = False
11+
level.growTrees = True
1112

1213
def handleOpenInventory(self):
1314
pass

mc/net/minecraft/gui/Font.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ def draw(self, string, x, y, color, darken=False):
7272

7373
color = r << 16 | g << 8 | b
7474
i += 2
75+
if i >= len(string):
76+
break
77+
7578
if darken:
7679
color = (color & 0xFCFCFC) >> 2
7780

mc/net/minecraft/level/Level.pxd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ cdef class Level:
4848
public object particleEngine
4949
public object font
5050

51+
public bint growTrees
52+
5153
public int width
5254
public int depth
5355
public int height

mc/net/minecraft/level/Level.pyx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ cdef class Level:
5656
self.multiplier = 3
5757
self.addend = 1013904223
5858

59+
self.creativeMode = False
60+
self.growTrees = False
61+
5962
def __dealloc__(self):
6063
free(self.__blocks)
6164
free(self.__heightMap)
@@ -641,9 +644,6 @@ cdef class Level:
641644
if tileId > 0:
642645
tile = tiles.tiles[tileId]
643646
if tile.getLiquidType() == Liquid.none:
644-
if tile.isOpaque():
645-
return HitResult(x1, y1, z1, sideHit, posVec)
646-
647647
hitResult = tile.clip(x1, y1, z1, vec1, vec2)
648648
if hitResult:
649649
return hitResult

mc/net/minecraft/level/tile/Flower.pyx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ cdef class Flower(Tile):
1616
self._setShape(0.5 - f, 0.0, 0.5 - f, f + 0.5, f * 3.0, f + 0.5)
1717

1818
cpdef void tick(self, Level level, int x, int y, int z, random) except *:
19-
cdef int below = level.getTile(x, y - 1, z)
20-
if not level.isLit(x, y, z) or (below != self.tiles.dirt.id and below != self.tiles.grass.id):
21-
level.setTile(x, y, z, 0)
19+
cdef int below
20+
if not level.growTrees:
21+
below = level.getTile(x, y - 1, z)
22+
if not level.isLit(x, y, z) or (below != self.tiles.dirt.id and below != self.tiles.grass.id):
23+
level.setTile(x, y, z, 0)
2224

2325
cdef void __renderFlower(self, Tesselator t, float x, float y, float z) except *:
2426
cdef int tex, xt, yt, rots, r

mc/net/minecraft/level/tile/Tile.pyx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,8 +418,7 @@ cdef class Tile:
418418
elif vec311 == v1:
419419
v01 = 3
420420

421-
vec311.add(x, y, z)
422-
return HitResult(x, y, z, v01, vec311)
421+
return HitResult(x, y, z, v01, vec311.add(x, y, z))
423422

424423
cdef bint __containsX(self, vec):
425424
if not vec:

mc/net/minecraft/mob/Mob.pxd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ cdef class Mob(Entity):
2424
public str modelName
2525
public float _bobStrength
2626
public int _deathScore
27+
public float renderOffset
2728
public float rotOffs
2829
public int health
2930
public int lastHealth

mc/net/minecraft/mob/Mob.pyx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ cdef class Mob(Entity):
3636
self.modelName = ''
3737
self._bobStrength = 1.0
3838
self._deathScore = 0
39+
self.renderOffset = 0.0
3940
self.rotOffs = 0.0
4041
self.health = 20
4142
self.lastHealth = 0
@@ -208,7 +209,7 @@ cdef class Mob(Entity):
208209
rotZ = 0.0625
209210
f10 = -abs(cos(step * 0.6662)) * 5.0 * run * self._bobStrength - 23.0
210211
gl.glTranslatef(self.xo + (self.x - self.xo) * translation,
211-
self.yo + (self.y - self.yo) * translation - 1.62,
212+
self.yo + (self.y - self.yo) * translation - 1.62 + self.renderOffset,
212213
self.zo + (self.z - self.zo) * translation)
213214
ht = self.hurtTime - translation
214215
if ht > 0.0 or self.health <= 0:

mc/net/minecraft/model/Vec3.py

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,46 +23,43 @@ def distanceTo(self, vec):
2323
zd = vec.z - self.z
2424
return math.sqrt(xd * xd + yd * yd + zd * zd)
2525

26-
def clipX(self, vec, xa):
26+
def distanceToSqr(self, vec):
2727
xd = vec.x - self.x
2828
yd = vec.y - self.y
2929
zd = vec.z - self.z
30-
try:
31-
xa = (xa - self.x) / xd
32-
except ZeroDivisionError:
33-
return
30+
return xd * xd + yd * yd + zd * zd
3431

32+
def clipX(self, vec, xa):
33+
xd = vec.x - self.x
34+
yd = vec.y - self.y
35+
zd = vec.z - self.z
3536
if xd * xd < 1.0E-7:
3637
return
37-
elif xa >= 0.0 and xa <= 1.0:
38+
39+
xa = (xa - self.x) / xd
40+
if xa >= 0.0 and xa <= 1.0:
3841
return Vec3(self.x + xd * xa, self.y + yd * xa, self.z + zd * xa)
3942

4043
def clipY(self, vec, ya):
4144
xd = vec.x - self.x
4245
yd = vec.y - self.y
4346
zd = vec.z - self.z
44-
try:
45-
ya = (ya - self.y) / yd
46-
except ZeroDivisionError:
47-
return
48-
4947
if yd * yd < 1.0E-7:
5048
return
51-
elif ya >= 0.0 and ya <= 1.0:
49+
50+
ya = (ya - self.y) / yd
51+
if ya >= 0.0 and ya <= 1.0:
5252
return Vec3(self.x + xd * ya, self.y + yd * ya, self.z + zd * ya)
5353

5454
def clipZ(self, vec, za):
5555
xd = vec.x - self.x
5656
yd = vec.y - self.y
5757
zd = vec.z - self.z
58-
try:
59-
za = (za - self.z) / zd
60-
except ZeroDivisionError:
61-
return
62-
6358
if zd * zd < 1.0E-7:
6459
return
65-
elif za >= 0.0 and za <= 1.0:
60+
61+
za = (za - self.z) / zd
62+
if za >= 0.0 and za <= 1.0:
6663
return Vec3(self.x + xd * za, self.y + yd * za, self.z + zd * za)
6764

6865
def toString(self):

0 commit comments

Comments
 (0)