Skip to content

Commit 642e7c4

Browse files
0.0.21a (0.0.21)
1 parent 9b44f44 commit 642e7c4

File tree

16 files changed

+153
-170
lines changed

16 files changed

+153
-170
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.20a1.tar.gz
15+
pip install dist/minecraft-python-0.0.21.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 **Multiplayer Classic** versions of Minecraft. The latest version is **Classic 0.0.20a_01** 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.21a** as released on _**June 22, 2009**_.
88

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

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

@@ -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.20a_01`.
22+
To easily install this version of *Minecraft: Python Edition*, just run `python -m pip install minecraft-python==0.0.21`.
2323

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

mc/net/minecraft/HitResult.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,3 @@ def __init__(self, type_, x, y, z, f):
55
self.y = y
66
self.z = z
77
self.f = f
8-
9-
def distanceTo(self, player, editMode):
10-
xx = self.x
11-
yy = self.y
12-
zz = self.z
13-
if editMode == 1:
14-
if self.f == 0: yy -= 1
15-
elif self.f == 1: yy += 1
16-
elif self.f == 2: zz -= 1
17-
elif self.f == 3: zz += 1
18-
elif self.f == 4: xx -= 1
19-
elif self.f == 5: xx == 1
20-
xd = xx - player.x
21-
yd = yy - player.y
22-
zd = zz - player.z
23-
return xd * xd + yd * yd + zd * zd

mc/net/minecraft/Minecraft.py

Lines changed: 86 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class StopGameException(Exception):
4949
pass
5050

5151
class Minecraft(window.Window):
52-
VERSION_STRING = '0.0.20a_01'
52+
VERSION_STRING = '0.0.21a'
5353
__timer = Timer(20.0)
5454
level = None
5555
__levelRenderer = None
@@ -94,6 +94,7 @@ class Minecraft(window.Window):
9494
__hitResult = None
9595

9696
__fogColorMultiplier = 1.0
97+
__displayActive = False
9798
__unusedInt1 = 0
9899
__unusedInt2 = 0
99100

@@ -122,7 +123,8 @@ def setServer(self, server, port):
122123

123124
def setScreen(self, screen):
124125
if not isinstance(self.guiScreen, ErrorScreen):
125-
self.screenChanged = True
126+
if self.guiScreen or screen:
127+
self.screenChanged = True
126128
if self.guiScreen:
127129
self.guiScreen.closeScreen()
128130

@@ -169,52 +171,52 @@ def on_deactivate(self):
169171
def on_mouse_press(self, x, y, button, modifiers):
170172
try:
171173
if self.guiScreen:
172-
self.guiScreen.updateEvents(button=button)
173-
if self.guiScreen:
174-
self.guiScreen.tick()
175-
return
174+
self.guiScreen.updateMouseEvents(button)
176175

177-
if not self.__mouseGrabbed:
178-
self.grabMouse()
179-
elif button == window.mouse.LEFT:
180-
self.__clickMouse()
181-
self.__prevFrameTime = self.__ticksRan
182-
elif button == window.mouse.RIGHT:
183-
self.__editMode = (self.__editMode + 1) % 2
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])
176+
if self.screenChanged:
177+
self.screenChanged = False
178+
if compat_platform != 'darwin':
179+
return
180+
181+
if not self.guiScreen or (self.guiScreen and self.guiScreen.allowUserInput):
182+
if not self.guiScreen:
183+
if not self.__mouseGrabbed:
184+
self.grabMouse()
185+
elif button == window.mouse.LEFT:
186+
self.__clickMouse()
187+
self.__prevFrameTime = self.__ticksRan
188+
elif button == window.mouse.RIGHT:
189+
self.__editMode = (self.__editMode + 1) % 2
190+
elif button == window.mouse.MIDDLE and self.__hitResult:
191+
tile = self.level.getTile(self.__hitResult.x, self.__hitResult.y, self.__hitResult.z)
192+
if tile == tiles.grass.id:
193+
tile = tiles.dirt.id
194+
195+
slot = self.player.inventory.getSlotContainsID(tile)
196+
if slot >= 0:
197+
self.player.inventory.selectedSlot = slot
198+
elif tile > 0 and tiles.tiles[tile] in User.creativeTiles:
199+
self.player.inventory.getSlotContainsTile(tiles.tiles[tile])
194200
except Exception as e:
195201
print(traceback.format_exc())
196202
self.setScreen(ErrorScreen('Client error', 'The game broke! [' + str(e) + ']'))
197203

198204
def on_mouse_scroll(self, x, y, dx, dy):
199205
try:
200-
if self.guiScreen:
201-
return
202-
203-
if dy == 0:
204-
return
205-
elif dy > 0:
206-
dy = 1
207-
elif dy < 0:
208-
dy = -1
209-
210-
i3 = 0
206+
if not self.guiScreen or (self.guiScreen and self.guiScreen.allowUserInput):
207+
if dy == 0:
208+
return
209+
elif dy > 0:
210+
dy = 1
211+
elif dy < 0:
212+
dy = -1
211213

212-
self.player.inventory.selectedSlot -= dy
213-
while self.player.inventory.selectedSlot < 0:
214-
self.player.inventory.selectedSlot += len(self.player.inventory.slots)
214+
self.player.inventory.selectedSlot -= dy
215+
while self.player.inventory.selectedSlot < 0:
216+
self.player.inventory.selectedSlot += len(self.player.inventory.slots)
215217

216-
while self.player.inventory.selectedSlot >= len(self.player.inventory.slots):
217-
self.player.inventory.selectedSlot -= len(self.player.inventory.slots)
218+
while self.player.inventory.selectedSlot >= len(self.player.inventory.slots):
219+
self.player.inventory.selectedSlot -= len(self.player.inventory.slots)
218220
except Exception as e:
219221
self.setScreen(ErrorScreen('Client error', 'The game broke! [' + str(e) + ']'))
220222

@@ -233,47 +235,49 @@ def on_mouse_motion(self, x, y, dx, dy):
233235
def on_key_press(self, symbol, modifiers):
234236
try:
235237
if self.guiScreen:
236-
self.guiScreen.updateEvents(key=symbol)
237-
if self.guiScreen:
238-
self.guiScreen.tick()
239-
return
238+
self.guiScreen.updateKeyboardEvents(key=symbol)
240239

241-
self.player.setKey(symbol, True)
240+
if self.screenChanged:
241+
self.screenChanged = False
242+
if compat_platform != 'darwin':
243+
return
242244

243-
if symbol == window.key.ESCAPE:
244-
self.__pauseGame()
245-
elif symbol == window.key.R:
246-
self.player.resetPos()
247-
elif symbol == window.key.RETURN:
248-
self.level.setSpawnPos(int(self.player.x), int(self.player.y), int(self.player.z), self.player.yRot)
249-
self.player.resetPos()
250-
251-
for i in range(9):
252-
if symbol == getattr(window.key, '_' + str(i + 1)):
253-
self.player.inventory.selectedSlot = i
254-
255-
if symbol == window.key.Y:
256-
self.__yMouseAxis = -self.__yMouseAxis
257-
elif symbol == window.key.G and self.connectionManager is None and len(self.level.entities) < 256:
258-
self.level.entities.add(Zombie(self.level, self.player.x, self.player.y, self.player.z))
259-
elif symbol == window.key.F:
260-
z15 = modifiers & window.key.MOD_SHIFT
261-
self.__levelRenderer.drawDistance = self.__levelRenderer.drawDistance + (-1 if z15 else 1) & 3
262-
elif symbol == window.key.B:
263-
self.setScreen(InventoryScreen())
264-
elif symbol == window.key.T and self.connectionManager and self.connectionManager.isConnected():
265-
self.player.releaseAllKeys()
266-
self.setScreen(ChatScreen())
245+
if not self.guiScreen or (self.guiScreen and self.guiScreen.allowUserInput):
246+
self.player.setKey(symbol, True)
247+
248+
if not self.guiScreen:
249+
if symbol == window.key.ESCAPE:
250+
self.__pauseGame()
251+
elif symbol == window.key.R:
252+
self.player.resetPos()
253+
elif symbol == window.key.RETURN:
254+
self.level.setSpawnPos(int(self.player.x), int(self.player.y), int(self.player.z), self.player.yRot)
255+
self.player.resetPos()
256+
elif symbol == window.key.G and self.connectionManager is None and len(self.level.entities) < 256:
257+
self.level.entities.add(Zombie(self.level, self.player.x, self.player.y, self.player.z))
258+
elif symbol == window.key.B:
259+
self.setScreen(InventoryScreen())
260+
elif symbol == window.key.T and self.connectionManager and self.connectionManager.isConnected():
261+
self.player.releaseAllKeys()
262+
self.setScreen(ChatScreen())
263+
264+
for i in range(9):
265+
if symbol == getattr(window.key, '_' + str(i + 1)):
266+
self.player.inventory.selectedSlot = i
267+
268+
if symbol == window.key.Y:
269+
self.__yMouseAxis = -self.__yMouseAxis
270+
elif symbol == window.key.F:
271+
z15 = modifiers & window.key.MOD_SHIFT
272+
self.__levelRenderer.drawDistance = self.__levelRenderer.drawDistance + (-1 if z15 else 1) & 3
267273
except Exception as e:
268274
print(traceback.format_exc())
269275
self.setScreen(ErrorScreen('Client error', 'The game broke! [' + str(e) + ']'))
270276

271277
def on_key_release(self, symbol, modifiers):
272278
try:
273-
if self.guiScreen:
274-
return
275-
276-
self.player.setKey(symbol, False)
279+
if not self.guiScreen or (self.guiScreen and self.guiScreen.allowUserInput):
280+
self.player.setKey(symbol, False)
277281
except Exception as e:
278282
print(traceback.format_exc())
279283
self.setScreen(ErrorScreen('Client error', 'The game broke! [' + str(e) + ']'))
@@ -286,19 +290,15 @@ def on_text(self, text):
286290
return
287291

288292
if self.guiScreen:
289-
self.guiScreen.updateEvents(char=text)
290-
if self.guiScreen:
291-
self.guiScreen.tick()
293+
self.guiScreen.updateKeyboardEvents(char=text)
292294
except Exception as e:
293295
print(traceback.format_exc())
294296
self.setScreen(ErrorScreen('Client error', 'The game broke! [' + str(e) + ']'))
295297

296298
def on_text_motion(self, motion):
297299
try:
298300
if self.guiScreen:
299-
self.guiScreen.updateEvents(motion=motion)
300-
if self.guiScreen:
301-
self.guiScreen.tick()
301+
self.guiScreen.updateKeyboardEvents(motion=motion)
302302
except Exception as e:
303303
print(traceback.format_exc())
304304
self.setScreen(ErrorScreen('Client error', 'The game broke! [' + str(e) + ']'))
@@ -339,9 +339,11 @@ def on_draw(self):
339339
self.__tick()
340340

341341
self.__checkGlError('Pre render')
342-
if not self.__active:
342+
if self.__displayActive and not self.__active:
343343
self.__pauseGame()
344344

345+
self.__displayActive = self.__active
346+
345347
if not self.hideGui:
346348
if self.level:
347349
self.__render(self.__timer.a)
@@ -511,7 +513,7 @@ def __clickMouse(self):
511513
else:
512514
tile = tiles.tiles[self.level.getTile(x, y, z)]
513515
texture = self.player.inventory.getSelected()
514-
aabb = tiles.tiles[texture].getAABB(x, y, z)
516+
aabb = tiles.tiles[texture].getTileAABB(x, y, z)
515517
if (tile is None or tile == tiles.water or tile == tiles.calmWater or tile == tiles.lava or tile == tiles.calmLava) and \
516518
(aabb is None or (False if self.player.bb.intersects(aabb) else self.level.isFree(aabb))):
517519
if self.__isMultiplayer():
@@ -562,9 +564,7 @@ def __tick(self):
562564

563565
if self.guiScreen:
564566
self.__prevFrameTime = self.__ticksRan + 10000
565-
self.guiScreen.updateEvents()
566-
if self.guiScreen:
567-
self.guiScreen.tick()
567+
self.guiScreen.tick()
568568
else:
569569
if self.msh[window.mouse.LEFT] and float(self.__ticksRan - self.__prevFrameTime) >= self.__timer.ticksPerSecond / 4.0 and self.__mouseGrabbed:
570570
self.__clickMouse()
@@ -765,6 +765,8 @@ def initGui(self):
765765

766766
def __setupFog(self):
767767
gl.glFogfv(gl.GL_FOG_COLOR, self.__getBuffer(self.__fogColorRed, self.__fogColorGreen, self.__fogColorBlue, 1.0))
768+
gl.glNormal3f(0.0, -1.0, 0.0)
769+
gl.glColor4f(1.0, 1.0, 1.0, 1.0)
768770
currentTile = tiles.tiles[self.level.getTile(int(self.player.x), int(self.player.y + 0.12), int(self.player.z))]
769771
if currentTile and currentTile.getLiquidType() != Liquid.none:
770772
liquid = currentTile.getLiquidType()
@@ -892,7 +894,7 @@ def addChatMessage(self, string):
892894
elif arg == '-mppass':
893895
mpPass = sys.argv[i + 1]
894896

895-
game = Minecraft(fullScreen, width=854, height=480, caption='Minecraft 0.0.20a_01')
897+
game = Minecraft(fullScreen, width=854, height=480, caption='Minecraft 0.0.21a')
896898
game.user = User(name, 0, mpPass)
897899
if server and port:
898900
game.setServer(server, int(port))

mc/net/minecraft/gui/InventoryScreen.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,29 @@
55

66
class InventoryScreen(Screen):
77

8+
def init(self, minecraft, width, height):
9+
super().init(minecraft, width, height)
10+
self.allowUserInput = True
11+
812
def __getTileAtSlot(self, xm, ym):
913
for i in range(len(User.creativeTiles)):
10-
i4 = self._width // 2 + i % 8 * 24 - 96
11-
i5 = self._height // 2 + i // 8 * 24 - 48
14+
i4 = self._width // 2 + i % 8 * 24 - 96 - 3
15+
i5 = self._height // 2 + i // 8 * 24 - 48 + 3
1216
if xm >= i4 and xm <= i4 + 24 and ym >= i5 - 12 and ym <= i5 + 12:
1317
return i
1418

1519
return -1
1620

1721
def render(self, xm, ym):
18-
self._fillGradient(0, 0, self._width, self._height, 1610941696, -1607454624)
22+
slot = self.__getTileAtSlot(xm, ym)
23+
self._fillGradient(self._width // 2 - 120, 30, self._width // 2 + 120, 180, -1878719232, -1070583712)
24+
if slot >= 0:
25+
i2 = self._width // 2 + slot % 8 * 24 - 96
26+
i3 = self._height // 2 + slot // 8 * 24 - 48
27+
self._fillGradient(i2 - 3, i3 - 8, i2 + 23, i3 + 24 - 6, -1862270977, -1056964609)
28+
1929
self.drawCenteredString('Select block', self._width // 2, 40, 0xFFFFFF)
2030
t = tesselator
21-
tileAtSlot = self.__getTileAtSlot(xm, ym)
2231
id_ = self._minecraft.textures.getTextureId('terrain.png')
2332
gl.glBindTexture(gl.GL_TEXTURE_2D, id_)
2433
gl.glEnable(gl.GL_TEXTURE_2D)
@@ -33,7 +42,7 @@ def render(self, xm, ym):
3342
gl.glTranslatef(1.0, 0.5, 8.0)
3443
gl.glRotatef(-30.0, 1.0, 0.0, 0.0)
3544
gl.glRotatef(45.0, 0.0, 1.0, 0.0)
36-
if tileAtSlot == i:
45+
if slot == i:
3746
gl.glScalef(1.6, 1.6, 1.6)
3847

3948
gl.glTranslatef(-1.5, 0.5, 0.5)

0 commit comments

Comments
 (0)