Skip to content

Commit 9b44f44

Browse files
0.0.20a_01
1 parent becac13 commit 9b44f44

26 files changed

+324
-117
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.0.19a6.tar.gz
15+
pip install dist/minecraft-python-0.0.20a1.tar.gz
1616

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

README.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
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 **Multiplayer Classic** versions of Minecraft. The latest version is **Classic 0.0.19a_06** as released on _**June 20, 2009**_.
7+
This project is currently recreating the **Multiplayer Classic** versions of Minecraft. The latest version is **Classic 0.0.20a_01** as released on _**June 20, 2009**_.
88

9-
Learn more about this version [here](https://minecraft.fandom.com/wiki/Java_Edition_Classic_0.0.19a_06).
9+
Learn more about this version [here](https://minecraft.fandom.com/wiki/Java_Edition_Classic_0.0.20a_01).
1010

11-
Or the server version [here](https://minecraft.fandom.com/wiki/Java_Edition_Classic_server_1.6).
11+
Or the server version [here](https://minecraft.fandom.com/wiki/Java_Edition_Classic_server_1.8.2).
1212

1313
This project is organized so that every commit is strictly the completed release of the Python version of the Java game of the same version number.
1414
This means that you can go back into this repository's commit history and see only the source code changes between versions of Minecraft,
@@ -19,7 +19,7 @@ you can play it just by specifying the Minecraft version you want to play in the
1919

2020
*Pyglet*, *Cython*, and *Pillow* are required dependencies and can easily be installed with *pip*. Use the versions specified in `requirements.txt`.
2121

22-
To easily install this version of *Minecraft: Python Edition*, just run `python -m pip install minecraft-python==0.0.19a_06`.
22+
To easily install this version of *Minecraft: Python Edition*, just run `python -m pip install minecraft-python==0.0.20a_01`.
2323

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

@@ -31,8 +31,7 @@ Run with the argument `-fullscreen` to open the window in fullscreen mode.
3131

3232
This version features multiplayer, chat, more advanced terrain (including caves and expanding water tiles), level saving, and human mobs.
3333

34-
Press *Esc* to pause. Press *Enter* to set your spawn position, *R* to teleport to your spawn position, *Y* to invert the mouse, *G* to spawn a mob, and *F* to toggle render distance.
35-
Use the number keys or the mouse scroll wheel to switch tiles.
34+
Press *B* to open the inventory menu. Press *Enter* to set your spawn position, *R* to teleport to your spawn position, *Y* to invert the mouse, *G* to spawn a mob, and *F* to toggle render distance.
3635

3736
### Multiplayer
3837

mc/Resources.py

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

mc/net/minecraft/Minecraft.py

Lines changed: 58 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from mc.net.minecraft.gui.ChatScreen import ChatScreen
2222
from mc.net.minecraft.gui.ErrorScreen import ErrorScreen
2323
from mc.net.minecraft.gui.PauseScreen import PauseScreen
24+
from mc.net.minecraft.gui.InventoryScreen import InventoryScreen
2425
from mc.net.minecraft.gui.InGameHud import InGameHud
2526
from mc.net.minecraft.particle.ParticleEngine import ParticleEngine
2627
from mc.net.minecraft.renderer.texture.TextureWaterFX import TextureWaterFX
@@ -48,12 +49,11 @@ class StopGameException(Exception):
4849
pass
4950

5051
class Minecraft(window.Window):
51-
VERSION_STRING = '0.0.19a_06'
52+
VERSION_STRING = '0.0.20a_01'
5253
__timer = Timer(20.0)
5354
level = None
5455
__levelRenderer = None
5556
player = None
56-
paintTexture = 1
5757
__particleEngine = None
5858

5959
user = None
@@ -181,15 +181,16 @@ def on_mouse_press(self, x, y, button, modifiers):
181181
self.__prevFrameTime = self.__ticksRan
182182
elif button == window.mouse.RIGHT:
183183
self.__editMode = (self.__editMode + 1) % 2
184-
elif button == window.mouse.MIDDLE:
185-
if self.__hitResult:
186-
tile = self.level.getTile(self.__hitResult.x, self.__hitResult.y, self.__hitResult.z)
187-
if tile == tiles.grass.id:
188-
tile = tiles.dirt.id
189-
190-
for t in User.creativeTiles:
191-
if tile == t:
192-
self.paintTexture = t
184+
elif button == window.mouse.MIDDLE and self.__hitResult:
185+
tile = self.level.getTile(self.__hitResult.x, self.__hitResult.y, self.__hitResult.z)
186+
if tile == tiles.grass.id:
187+
tile = tiles.dirt.id
188+
189+
slot = self.player.inventory.getSlotContainsID(tile)
190+
if slot >= 0:
191+
self.player.inventory.selectedSlot = slot
192+
elif tile > 0 and tiles.tiles[tile] in User.creativeTiles:
193+
self.player.inventory.getSlotContainsTile(tiles.tiles[tile])
193194
except Exception as e:
194195
print(traceback.format_exc())
195196
self.setScreen(ErrorScreen('Client error', 'The game broke! [' + str(e) + ']'))
@@ -208,18 +209,12 @@ def on_mouse_scroll(self, x, y, dx, dy):
208209

209210
i3 = 0
210211

211-
for i, tile in enumerate(User.creativeTiles):
212-
if tile == self.paintTexture:
213-
i3 = i
212+
self.player.inventory.selectedSlot -= dy
213+
while self.player.inventory.selectedSlot < 0:
214+
self.player.inventory.selectedSlot += len(self.player.inventory.slots)
214215

215-
i3 += dy
216-
while i3 < 0:
217-
i3 += len(User.creativeTiles)
218-
219-
while i3 >= len(User.creativeTiles):
220-
i3 -= len(User.creativeTiles)
221-
222-
self.paintTexture = User.creativeTiles[i3]
216+
while self.player.inventory.selectedSlot >= len(self.player.inventory.slots):
217+
self.player.inventory.selectedSlot -= len(self.player.inventory.slots)
223218
except Exception as e:
224219
self.setScreen(ErrorScreen('Client error', 'The game broke! [' + str(e) + ']'))
225220

@@ -255,7 +250,7 @@ def on_key_press(self, symbol, modifiers):
255250

256251
for i in range(9):
257252
if symbol == getattr(window.key, '_' + str(i + 1)):
258-
self.paintTexture = User.creativeTiles[i]
253+
self.player.inventory.selectedSlot = i
259254

260255
if symbol == window.key.Y:
261256
self.__yMouseAxis = -self.__yMouseAxis
@@ -264,6 +259,8 @@ def on_key_press(self, symbol, modifiers):
264259
elif symbol == window.key.F:
265260
z15 = modifiers & window.key.MOD_SHIFT
266261
self.__levelRenderer.drawDistance = self.__levelRenderer.drawDistance + (-1 if z15 else 1) & 3
262+
elif symbol == window.key.B:
263+
self.setScreen(InventoryScreen())
267264
elif symbol == window.key.T and self.connectionManager and self.connectionManager.isConnected():
268265
self.player.releaseAllKeys()
269266
self.setScreen(ChatScreen())
@@ -486,7 +483,8 @@ def __releaseMouse(self):
486483
self.set_mouse_position(self.width // 2, self.height // 2)
487484

488485
def __pauseGame(self):
489-
self.setScreen(PauseScreen())
486+
if not isinstance(self.guiScreen, PauseScreen):
487+
self.setScreen(PauseScreen())
490488

491489
def __clickMouse(self):
492490
if self.__hitResult:
@@ -501,24 +499,26 @@ def __clickMouse(self):
501499
if self.__hitResult.f == 4: x -= 1
502500
if self.__hitResult.f == 5: x += 1
503501

502+
oldTile = tiles.tiles[self.level.getTile(self.__hitResult.x, self.__hitResult.y, self.__hitResult.z)]
504503
if self.__editMode == 0:
505-
oldTile = tiles.tiles[self.level.getTile(self.__hitResult.x, self.__hitResult.y, self.__hitResult.z)]
506-
changed = self.level.netSetTile(self.__hitResult.x, self.__hitResult.y, self.__hitResult.z, 0)
507-
if oldTile and changed:
508-
if self.__isMultiplayer():
509-
self.connectionManager.sendBlockChange(x, y, z, self.__editMode, self.paintTexture)
504+
if oldTile != tiles.unbreakable or self.player.userType >= 100:
505+
changed = self.level.netSetTile(self.__hitResult.x, self.__hitResult.y, self.__hitResult.z, 0)
506+
if oldTile and changed:
507+
if self.__isMultiplayer():
508+
self.connectionManager.sendBlockChange(x, y, z, self.__editMode, self.player.inventory.getSelected())
510509

511-
oldTile.destroy(self.level, self.__hitResult.x, self.__hitResult.y, self.__hitResult.z, self.__particleEngine)
510+
oldTile.destroy(self.level, self.__hitResult.x, self.__hitResult.y, self.__hitResult.z, self.__particleEngine)
512511
else:
513512
tile = tiles.tiles[self.level.getTile(x, y, z)]
514-
aabb = tiles.tiles[self.paintTexture].getAABB(x, y, z)
513+
texture = self.player.inventory.getSelected()
514+
aabb = tiles.tiles[texture].getAABB(x, y, z)
515515
if (tile is None or tile == tiles.water or tile == tiles.calmWater or tile == tiles.lava or tile == tiles.calmLava) and \
516516
(aabb is None or (False if self.player.bb.intersects(aabb) else self.level.isFree(aabb))):
517517
if self.__isMultiplayer():
518-
self.connectionManager.sendBlockChange(x, y, z, self.__editMode, self.paintTexture)
518+
self.connectionManager.sendBlockChange(x, y, z, self.__editMode, texture)
519519

520-
self.level.netSetTile(x, y, z, self.paintTexture)
521-
tiles.tiles[self.paintTexture].onBlockAdded(self.level, x, y, z)
520+
self.level.netSetTile(x, y, z, self.player.inventory.getSelected())
521+
tiles.tiles[texture].onBlockAdded(self.level, x, y, z)
522522

523523
def __tick(self):
524524
for message in self.__hud.messages.copy():
@@ -682,7 +682,10 @@ def __render(self, a):
682682
self.__levelRenderer.render(xx, yy, zz)
683683

684684
self.__checkGlError('Rendered level')
685+
self.__toggleLight(True)
685686
self.__levelRenderer.renderEntities(self.__frustum, a)
687+
self.__toggleLight(False)
688+
self.__setupFog()
686689
self.__checkGlError('Rendered entities')
687690
self.__particleEngine.render(self.player, a)
688691
self.__checkGlError('Rendered particles')
@@ -696,7 +699,7 @@ def __render(self, a):
696699
if self.__hitResult:
697700
gl.glDisable(gl.GL_LIGHTING)
698701
gl.glDisable(gl.GL_ALPHA_TEST)
699-
self.__levelRenderer.renderHit(self.player, self.__hitResult, self.__editMode, self.paintTexture)
702+
self.__levelRenderer.renderHit(self.player, self.__hitResult, self.__editMode, self.player.inventory.getSelected())
700703
LevelRenderer.renderHitOutline(self.__hitResult, self.__editMode)
701704
gl.glEnable(gl.GL_ALPHA_TEST)
702705
gl.glEnable(gl.GL_LIGHTING)
@@ -723,11 +726,28 @@ def __render(self, a):
723726
if self.__hitResult:
724727
gl.glDepthFunc(gl.GL_LESS)
725728
gl.glDisable(gl.GL_ALPHA_TEST)
726-
self.__levelRenderer.renderHit(self.player, self.__hitResult, self.__editMode, self.paintTexture)
729+
self.__levelRenderer.renderHit(self.player, self.__hitResult, self.__editMode, self.player.inventory.getSelected())
727730
LevelRenderer.renderHitOutline(self.__hitResult, self.__editMode)
728731
gl.glEnable(gl.GL_ALPHA_TEST)
729732
gl.glDepthFunc(gl.GL_LEQUAL)
730733

734+
def __toggleLight(self, z1):
735+
if not z1:
736+
gl.glDisable(gl.GL_LIGHTING)
737+
gl.glDisable(gl.GL_LIGHT0)
738+
else:
739+
gl.glEnable(gl.GL_LIGHTING)
740+
gl.glEnable(gl.GL_LIGHT0)
741+
gl.glEnable(gl.GL_COLOR_MATERIAL)
742+
gl.glColorMaterial(gl.GL_FRONT_AND_BACK, gl.GL_AMBIENT_AND_DIFFUSE)
743+
f4 = 0.7
744+
f2 = 0.3
745+
vec = Vec3(0.0, -1.0, 0.5).normalize()
746+
gl.glLightfv(gl.GL_LIGHT0, gl.GL_POSITION, self.__getBuffer(vec.x, vec.y, vec.z, 0.0))
747+
gl.glLightfv(gl.GL_LIGHT0, gl.GL_DIFFUSE, self.__getBuffer(f2, f2, f2, 1.0))
748+
gl.glLightfv(gl.GL_LIGHT0, gl.GL_AMBIENT, self.__getBuffer(0.0, 0.0, 0.0, 1.0))
749+
gl.glLightModelfv(gl.GL_LIGHT_MODEL_AMBIENT, self.__getBuffer(f4, f4, f4, 1.0))
750+
731751
def initGui(self):
732752
screenWidth = self.width * 240 // self.height
733753
screenHeight = self.height * 240 // self.height
@@ -767,7 +787,7 @@ def __setupFog(self):
767787

768788
def __getBuffer(self, a, b, c, d):
769789
self.__lb.clear()
770-
self.__lb.put(a).put(b).put(c).put(1.0)
790+
self.__lb.put(a).put(b).put(c).put(d)
771791
self.__lb.flip()
772792
return self.__lb
773793

@@ -872,7 +892,7 @@ def addChatMessage(self, string):
872892
elif arg == '-mppass':
873893
mpPass = sys.argv[i + 1]
874894

875-
game = Minecraft(fullScreen, width=854, height=480, caption='Minecraft 0.0.19a_06')
895+
game = Minecraft(fullScreen, width=854, height=480, caption='Minecraft 0.0.20a_01')
876896
game.user = User(name, 0, mpPass)
877897
if server and port:
878898
game.setServer(server, int(port))

mc/net/minecraft/User.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
from mc.net.minecraft.level.tile.Tiles import tiles
22

33
class User:
4-
creativeTiles = [tiles.rock.id, tiles.dirt.id, tiles.sponge.id,
5-
tiles.wood.id, tiles.bush.id, tiles.log.id,
6-
tiles.leaf.id, tiles.glass.id, tiles.gravel.id]
4+
creativeTiles = [tiles.rock, tiles.wood, tiles.dirt, tiles.stoneBrick,
5+
tiles.log, tiles.leaf, tiles.bush, tiles.plantYellow,
6+
tiles.plantRed, tiles.mushroomBrown, tiles.mushroomRed, tiles.sand,
7+
tiles.gravel, tiles.glass, tiles.sponge, tiles.blockGold,
8+
tiles.clothRed, tiles.clothOrange, tiles.clothYellow, tiles.clothChartreuse,
9+
tiles.clothGreen, tiles.clothSpringGreen, tiles.clothCyan, tiles.clothCapri,
10+
tiles.clothUltramarine, tiles.clothViolet, tiles.clothPurple, tiles.clothMagenta,
11+
tiles.clothRose, tiles.clothDarkGray, tiles.clothGray, tiles.clothWhite]
712

813
def __init__(self, name, sessionId, mpPass):
914
self.name = name

mc/net/minecraft/character/Cube.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from mc.net.minecraft.character.Polygon import Polygon
22
from mc.net.minecraft.character.Vertex import Vertex
3+
from mc.net.minecraft.character.Vec3 import Vec3
34
from pyglet import gl
45

56
class Cube:
@@ -59,23 +60,30 @@ def setPos(self, x, y, z):
5960
self.__y = y
6061
self.__z = 0.0
6162

62-
def render(self):
63+
def render(self, a):
6364
if not self.__compiled:
6465
self.__list = gl.glGenLists(1)
6566
gl.glNewList(self.__list, gl.GL_COMPILE)
6667
gl.glBegin(gl.GL_QUADS)
6768
for polygon in self.__polygons:
69+
vec37 = polygon.vertices[1].pos.subtract(polygon.vertices[0].pos).normalize()
70+
vec38 = polygon.vertices[1].pos.subtract(polygon.vertices[2].pos).normalize()
71+
vec37 = Vec3(vec37.y * vec38.z - vec37.z * vec38.y,
72+
vec37.z * vec38.x - vec37.x * vec38.z,
73+
vec37.x * vec38.y - vec37.y * vec38.x).normalize()
74+
gl.glNormal3f(vec37.x, vec37.y, vec37.z)
75+
6876
for i in range(4):
6977
v = polygon.vertices[i]
7078
gl.glTexCoord2f(v.u / 64.0, v.v / 32.0)
71-
gl.glVertex3f(v.pos.x, v.pos.y, v.pos.z)
79+
gl.glVertex3f(v.pos.x * a, v.pos.y * a, v.pos.z * a)
7280
gl.glEnd()
7381
gl.glEndList()
7482
self.__compiled = True
7583

7684
c = 57.29578
7785
gl.glPushMatrix()
78-
gl.glTranslatef(self.__x, self.__y, self.__z)
86+
gl.glTranslatef(self.__x * a, self.__y * a, self.__z * a)
7987
gl.glRotatef(self.zRot * c, 0.0, 0.0, 1.0)
8088
gl.glRotatef(self.yRot * c, 0.0, 1.0, 0.0)
8189
gl.glRotatef(self.xRot * c, 1.0, 0.0, 0.0)

mc/net/minecraft/character/Vec3.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
1+
import math
2+
13
class Vec3:
24

35
def __init__(self, x, y, z):
46
self.x = x
57
self.y = y
68
self.z = z
9+
10+
def subtract(self, vec):
11+
return Vec3(self.x - vec.x, self.y - vec.y, self.z - vec.z)
12+
13+
def normalize(self):
14+
f1 = math.sqrt(self.x * self.x + self.y * self.y + self.z * self.z)
15+
return Vec3(self.x / f1, self.y / f1, self.z / f1)

mc/net/minecraft/character/Zombie.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ def render(self, textures, a):
6161
yy = -abs(math.sin(t * 0.6662)) * 5.0 - 23.0
6262
gl.glTranslatef(self.xo + (self.x - self.xo) * a, self.yo + (self.y - self.yo) * a, self.zo + (self.z - self.zo) * a)
6363
gl.glScalef(1.0, -1.0, 1.0)
64-
gl.glScalef(size, size, size)
65-
gl.glTranslatef(0.0, yy, 0.0)
64+
gl.glTranslatef(0.0, yy * size, 0.0)
6665
c = 57.29578
6766
gl.glRotatef(self.rot * c + 180.0, 0.0, 1.0, 0.0)
68-
self.__zombieModel.render(t, 1.0, 0.0, 0.0, 0.0)
67+
gl.glScalef(-1.0, 1.0, 1.0)
68+
self.__zombieModel.render(t, 1.0, 0.0, 0.0, 0.0, size)
6969
gl.glPopMatrix()
7070
gl.glDisable(gl.GL_TEXTURE_2D)

mc/net/minecraft/character/ZombieModel.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def __init__(self):
2626
self.__leg1.addBox(-2.0, 0.0, -2.0, 4, 12, 4)
2727
self.__leg1.setPos(2.0, 12.0, 0.0)
2828

29-
def render(self, a, f2, f3, f4, f5):
29+
def render(self, a, f2, f3, f4, f5, f6):
3030
self.__head.yRot = f4 / 57.29578
3131
self.__head.xRot = f5 / 57.29578
3232
self.__arm0.xRot = math.cos(a * 0.6662 + math.pi) * 2.0 * f2
@@ -39,9 +39,9 @@ def render(self, a, f2, f3, f4, f5):
3939
self.__arm1.zRot -= math.cos(f3 * 0.09) * 0.05 + 0.05
4040
self.__arm0.xRot += math.sin(f3 * 0.067) * 0.05
4141
self.__arm1.xRot -= math.sin(f3 * 0.067) * 0.05
42-
self.__head.render()
43-
self.__body.render()
44-
self.__arm0.render()
45-
self.__arm1.render()
46-
self.__leg0.render()
47-
self.__leg1.render()
42+
self.__head.render(f6)
43+
self.__body.render(f6)
44+
self.__arm0.render(f6)
45+
self.__arm1.render(f6)
46+
self.__leg0.render(f6)
47+
self.__leg1.render(f6)

mc/net/minecraft/comm/SocketConnection.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ def processData(self):
7575
if packet == Packets.LOGIN:
7676
self.manager.minecraft.beginLevelLoading(data[1].decode())
7777
self.manager.minecraft.levelLoadUpdate(data[2].decode())
78+
self.manager.minecraft.player.userType = data[3]
7879
elif packet == Packets.LEVEL_INITIALIZE:
7980
self.manager.minecraft.setLevel(None)
8081
self.manager.levelBuffer = ByteArrayOutputStream()

0 commit comments

Comments
 (0)