Skip to content

Commit e03937d

Browse files
0.31 20100128 (0.31.20100128)
1 parent b6d41bb commit e03937d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+895
-399
lines changed

Makefile

+1-1
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.31.20100125.tar.gz
15+
pip install dist/minecraft-python-0.31.20100128.tar.gz
1616

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

README.md

+8-6
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,17 @@
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

77
The project is currently working on the Indev versions of Minecraft.
8-
The latest version is **Indev 0.31 20100125** as released on _**January 25, 2010**_.
8+
The latest version is **Indev 0.31 20100128** as released on _**January 28, 2010**_.
9+
10+
This version adds diamonds, diamond ore, gears, metal tool variants, and semi-functional crafting to the game.
911

10-
This version adds torch, fire, and lava blob particles to the game.
1112
Features from previous Indev versions include the Indev mossy cobblestone spawn house which contains chests
1213
with all of the items available in this version, NBT level file saving,
1314
tools including flint and steel and the bow and arrow, torches, advanced liquid spread, TNT explosives, and the MD3 Rana mobs.
1415

15-
To easily install this version of *Minecraft: Python Edition*, just run `python -m pip install minecraft-python==0.31.20100125`.
16+
To easily install this version of *Minecraft: Python Edition*, just run `python -m pip install minecraft-python==0.31.20100128`.
1617

17-
You can learn more about this version [on the Minecraft wiki.](https://minecraft.wiki/w/Java_Edition_Indev_0.31_20100125)
18+
You can learn more about this version [on the Minecraft wiki.](https://minecraft.wiki/w/Java_Edition_Indev_0.31_20100128)
1819

1920
### Organization
2021

@@ -43,7 +44,8 @@ The argument `-creative` will force the game to be in creative mode.
4344

4445
All available tools and blocks are in the chests in the spawn house.
4546
All controls are as you would expect for the game and they can be configured in the options menu.
46-
Press I to open your inventory, F5 to toggle rain and F7 to take a cool isometric screenshot.
47+
Press I to open your inventory, B to craft (only recipe is an apple in the top-left corner for an arrow),
48+
F5 to toggle rain and F7 to take a cool isometric screenshot.
4749

4850
The Indev level generator is customizable and you can choose between the *Inland*, *Island*, *Floating*, and *Flat* level types.
4951
You can specify the world theme as *Normal* or *Hell* (lava and dirt instead of water and grass), world size, and world shape (*Square*, *Long*, *Deep*).
@@ -54,7 +56,7 @@ The only mobs around are the Ranas, but they don't drop anything when killed. Ap
5456

5557
![Isometric screenshot](/map.png?raw=true)
5658

57-
*An isometric screenshot of a Hell map generated by the game.*
59+
*An isometric screenshot of a deep Floating map generated by the game.*
5860

5961
### Additional Notes
6062

map.png

3.9 MB
Loading

mc/Resources.py

+5-2
Large diffs are not rendered by default.

mc/net/minecraft/client/LoadingScreenRenderer.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from mc.net.minecraft.client import MinecraftError
22
from mc.net.minecraft.client.render.Tessellator import tessellator
3+
from mc.net.minecraft.client.gui.ScaledResolution import ScaledResolution
34
from pyglet import clock, gl
45

56
import nbtlib
@@ -16,8 +17,9 @@ def displayProgressMessage(self, title):
1617
raise MinecraftError
1718
else:
1819
self.__title = title
19-
screenWidth = self.__mc.width * 240 / self.__mc.height
20-
screenHeight = self.__mc.height * 240 / self.__mc.height
20+
scaledRes = ScaledResolution(self.__mc.width, self.__mc.height)
21+
screenWidth = scaledRes.getScaledWidth()
22+
screenHeight = scaledRes.getScaledHeight()
2123

2224
gl.glClear(gl.GL_DEPTH_BUFFER_BIT)
2325
gl.glMatrixMode(gl.GL_PROJECTION)
@@ -38,8 +40,9 @@ def setLoadingProgress(self):
3840
if not self.__mc.running:
3941
raise MinecraftError
4042
else:
41-
screenWidth = self.__mc.width * 240 // self.__mc.height
42-
screenHeight = self.__mc.height * 240 // self.__mc.height
43+
scaledRes = ScaledResolution(self.__mc.width, self.__mc.height)
44+
screenWidth = scaledRes.getScaledWidth()
45+
screenHeight = scaledRes.getScaledHeight()
4346

4447
gl.glClear(gl.GL_DEPTH_BUFFER_BIT)
4548
gl.glMatrixMode(gl.GL_PROJECTION)

mc/net/minecraft/client/Minecraft.py

+40-16
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,20 @@ def load_library(*names, **kwargs):
4040
from mc.net.minecraft.client.model.ModelBiped import ModelBiped
4141
from mc.net.minecraft.client.player.EntityPlayerSP import EntityPlayerSP
4242
from mc.net.minecraft.client.player.MovementInputFromOptions import MovementInputFromOptions
43+
from mc.net.minecraft.client.gui.ScaledResolution import ScaledResolution
4344
from mc.net.minecraft.client.gui.FontRenderer import FontRenderer
4445
from mc.net.minecraft.client.gui.GuiErrorScreen import GuiErrorScreen
4546
from mc.net.minecraft.client.gui.GuiIngameMenu import GuiIngameMenu
4647
from mc.net.minecraft.client.gui.GuiGameOver import GuiGameOver
48+
from mc.net.minecraft.client.gui.GuiInventory import GuiInventory
4749
from mc.net.minecraft.client.gui.GuiIngame import GuiIngame
50+
from mc.net.minecraft.client.gui.GuiCrafting import GuiCrafting
4851
from mc.net.minecraft.client.effect.EffectRenderer import EffectRenderer
4952
from mc.net.minecraft.client.render.texture.TextureFlamesFX import TextureFlamesFX
5053
from mc.net.minecraft.client.render.texture.TextureWaterFlowFX import TextureWaterFlowFX
5154
from mc.net.minecraft.client.render.texture.TextureWaterFX import TextureWaterFX
5255
from mc.net.minecraft.client.render.texture.TextureLavaFX import TextureLavaFX
56+
from mc.net.minecraft.client.render.texture.TextureGearsFX import TextureGearsFX
5357
from mc.net.minecraft.client.render.RenderBlocks import RenderBlocks
5458
from mc.net.minecraft.client.render.RenderGlobal import RenderGlobal
5559
from mc.net.minecraft.client.render.EntityRenderer import EntityRenderer
@@ -85,7 +89,7 @@ class Minecraft(window.Window):
8589
loadMapUser = ''
8690
loadMapID = 0
8791

88-
__active = False
92+
isGamePaused = True
8993

9094
ingameGUI = None
9195
skipRenderWorld = False
@@ -151,8 +155,9 @@ def displayGuiScreen(self, screen):
151155
self.currentScreen = screen
152156
if screen:
153157
self.__releaseMouse()
154-
screenWidth = self.width * 240 // self.height
155-
screenHeight = self.height * 240 // self.height
158+
scaledRes = ScaledResolution(self.width, self.height)
159+
screenWidth = scaledRes.getScaledWidth()
160+
screenHeight = scaledRes.getScaledHeight()
156161
screen.setWorldAndResolution(self, screenWidth, screenHeight)
157162
self.skipRenderWorld = False
158163
else:
@@ -164,20 +169,20 @@ def destroy(self):
164169
self.sndManager.closeMinecraft()
165170

166171
def isActive(self):
167-
return self.__active
172+
return not self.isGamePaused
168173

169174
def on_close(self):
170175
self.running = False
171176

172177
def on_activate(self):
173-
self.__active = True
178+
self.isGamePaused = False
174179

175180
# Remove this hack when the window boundary issue is fixed upstream:
176181
if self.ingameFocus and compat_platform == 'win32':
177182
self._update_clipped_cursor()
178183

179184
def on_deactivate(self):
180-
self.__active = False
185+
self.isGamePaused = True
181186
self.__releaseMouse()
182187

183188
def on_mouse_press(self, x, y, button, modifiers):
@@ -244,7 +249,7 @@ def on_mouse_motion(self, x, y, dx, dy):
244249
def on_key_press(self, symbol, modifiers):
245250
try:
246251
if symbol == window.key.F11:
247-
self.toggleFullScreen()
252+
self.toggleFullscreen()
248253
return
249254

250255
if self.currentScreen:
@@ -265,7 +270,9 @@ def on_key_press(self, symbol, modifiers):
265270
elif symbol == window.key.F5:
266271
self.renderRain = not self.renderRain
267272
elif symbol == self.options.keyBindInventory.keyCode:
268-
self.playerController.openInventory()
273+
self.displayGuiScreen(GuiInventory(self.thePlayer.inventory))
274+
elif symbol == window.key.B:
275+
self.displayGuiScreen(GuiCrafting(self.thePlayer.inventory))
269276
elif symbol == self.options.keyBindDrop.keyCode:
270277
self.thePlayer.dropPlayerItemWithRandomChoice(
271278
self.thePlayer.inventory.decrStackSize(
@@ -325,7 +332,13 @@ def on_text_motion(self, motion):
325332

326333
def on_draw(self):
327334
try:
328-
self.__timer.updateTimer()
335+
if self.isGamePaused:
336+
prevTicks = self.__timer.renderPartialTicks
337+
self.__timer.updateTimer()
338+
self.__timer.renderPartialTicks = prevTicks
339+
else:
340+
self.__timer.updateTimer()
341+
329342
for i in range(self.__timer.elapsedTicks):
330343
self.__ticksRan += 1
331344
self.__runTick()
@@ -400,6 +413,8 @@ def run(self):
400413
self.renderEngine.registerTextureFX(TextureWaterFlowFX())
401414
self.renderEngine.registerTextureFX(TextureFlamesFX(0))
402415
self.renderEngine.registerTextureFX(TextureFlamesFX(1))
416+
self.renderEngine.registerTextureFX(TextureGearsFX(0))
417+
self.renderEngine.registerTextureFX(TextureGearsFX(1))
403418
self.fontRenderer = FontRenderer(self.options, 'default.png', self.renderEngine)
404419

405420
imgData = BufferUtils.createIntBuffer(256)
@@ -466,8 +481,11 @@ def displayInGameMenu(self):
466481
self.displayGuiScreen(GuiIngameMenu())
467482

468483
def __clickMouse(self, editMode):
484+
if editMode == 0 and self.__leftClickCounter > 0:
485+
return
486+
469487
item = self.thePlayer.inventory.getCurrentItem()
470-
if editMode == 0 and self.__leftClickCounter <= 0:
488+
if editMode == 0:
471489
self.entityRenderer.itemRenderer.swingItem()
472490
self.entityRenderer.updateRenderer()
473491
elif editMode == 1 and item:
@@ -519,7 +537,7 @@ def __clickMouse(self, editMode):
519537
if item.stackSize != prevSize:
520538
self.entityRenderer.itemRenderer.resetEquippedProgress()
521539

522-
def toggleFullScreen(self):
540+
def toggleFullscreen(self):
523541
try:
524542
self.__fullScreen = not self.__fullScreen
525543
print('Toggle fullscreen!')
@@ -544,7 +562,9 @@ def __resize(self, width, height):
544562
screen.setWorldAndResolution(self, screenWidth, screenHeight)
545563

546564
def __runTick(self):
547-
self.playerController.onUpdate()
565+
if not self.isGamePaused:
566+
self.playerController.onUpdate()
567+
548568
self.ingameGUI.addChatMessage()
549569

550570
gl.glBindTexture(gl.GL_TEXTURE_2D, self.renderEngine.getTexture('terrain.png'))
@@ -557,10 +577,12 @@ def __runTick(self):
557577
self.__leftClickCounter -= 1
558578

559579
if not self.currentScreen:
560-
if self.msh[window.mouse.LEFT] and float(self.__ticksRan - self.__prevFrameTime) >= self.__timer.ticksPerSecond / 4.0 and self.ingameFocus:
580+
if self.msh[window.mouse.LEFT] and \
581+
self.__ticksRan - self.__prevFrameTime >= self.__timer.ticksPerSecond / 4.0 and self.ingameFocus:
561582
self.__clickMouse(0)
562583
self.__prevFrameTime = self.__ticksRan
563-
elif self.msh[window.mouse.RIGHT] and float(self.__ticksRan - self.__prevFrameTime) >= self.__timer.ticksPerSecond / 4.0 and self.ingameFocus:
584+
elif self.msh[window.mouse.RIGHT] and \
585+
self.__ticksRan - self.__prevFrameTime >= self.__timer.ticksPerSecond / 4.0 and self.ingameFocus:
564586
self.__clickMouse(1)
565587
self.__prevFrameTime = self.__ticksRan
566588

@@ -583,8 +605,10 @@ def __runTick(self):
583605

584606
self.entityRenderer.updateRenderer()
585607
self.renderGlobal.updateClouds()
586-
self.theWorld.updateEntities()
587-
self.theWorld.tick()
608+
if not self.isGamePaused:
609+
self.theWorld.updateEntities()
610+
self.theWorld.tick()
611+
588612
self.theWorld.randomDisplayUpdates(int(self.thePlayer.posX),
589613
int(self.thePlayer.posY),
590614
int(self.thePlayer.posZ))

mc/net/minecraft/client/Timer.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
class Timer:
66
NS_PER_SECOND = 1000000
7-
MAX_TICKS_PER_UPDATE = 100
7+
MAX_TICKS_PER_UPDATE = 10
88
__lastHRTime = 0.0
99
elapsedTicks = 0
1010
renderPartialTicks = 0.0

mc/net/minecraft/client/controller/PlayerController.py

-3
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ def __init__(self, mc):
1010
def onWorldChange(self, world):
1111
pass
1212

13-
def openInventory(self):
14-
pass
15-
1613
def clickBlock(self, x, y, z):
1714
self.sendBlockRemoved(x, y, z)
1815

mc/net/minecraft/client/controller/PlayerControllerCreative.py

-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
from mc.net.minecraft.client.Session import Session
22
from mc.net.minecraft.client.controller.PlayerController import PlayerController
3-
from mc.net.minecraft.client.gui.GuiInventory import GuiInventory
43
from mc.net.minecraft.game.level.MobSpawner import MobSpawner
54
from mc.net.minecraft.game.level.block.Blocks import blocks
65
from mc.net.minecraft.game.item.ItemStack import ItemStack
76

87
class PlayerControllerCreative(PlayerController):
98

10-
def openInventory(self):
11-
self._mc.displayGuiScreen(GuiInventory(self._mc.thePlayer.inventory))
12-
139
def onRespawn(self, player):
1410
for i in range(9):
1511
if player.inventory.mainInventory[i] is None:

mc/net/minecraft/client/controller/PlayerControllerSP.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from mc.net.minecraft.client.controller.PlayerController import PlayerController
2-
from mc.net.minecraft.client.gui.GuiInventory import GuiInventory
32
from mc.net.minecraft.game.level.MobSpawner import MobSpawner
43
from mc.net.minecraft.game.level.block.Blocks import blocks
54
from mc.net.minecraft.game.entity.EntityLiving import EntityLiving
@@ -34,9 +33,6 @@ def __init__(self, mc):
3433
blocks.clothRose, blocks.clothDarkGray, blocks.clothGray, blocks.clothWhite
3534
)
3635

37-
def openInventory(self):
38-
self._mc.displayGuiScreen(GuiInventory(self._mc.thePlayer.inventory))
39-
4036
def flipPlayer(self, player):
4137
x = int(player.posX)
4238
y = int(player.posY)
@@ -81,6 +77,7 @@ def flipPlayer(self, player):
8177
blockId = blocks.tnt.blockID
8278
stack = ItemStack(blockId, items.itemsList[blockId].getItemStackLimit())
8379
tntChest1.setInventorySlotContents(slot, stack)
80+
stack = ItemStack(blockId, items.itemsList[blockId].getItemStackLimit())
8481
tntChest2.setInventorySlotContents(slot, stack)
8582

8683
for slot in range(min(len(self.__mainChestArray), 54)):

mc/net/minecraft/client/gui/GuiChest.py

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ def __init__(self, upperChestInventory, lowerChestInventory):
88
super().__init__(None)
99
self.__upperChestInventory = upperChestInventory
1010
self.__lowerChestInventory = lowerChestInventory
11+
self.allowUserInput = False
1112
self.__inventoryRows = lowerChestInventory.getSizeInventory() // 9
1213
self.ySize = 114 + self.__inventoryRows * 18
1314
yOffset = (self.__inventoryRows - 4) * 18
+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
from mc.net.minecraft.game.item.recipe.CraftingManager import CraftingManager
2+
from mc.net.minecraft.client.gui.InventoryCraftResult import InventoryCraftResult
3+
from mc.net.minecraft.client.gui.InventoryCrafting import InventoryCrafting
4+
from mc.net.minecraft.client.gui.GuiInventory import GuiInventory
5+
from mc.net.minecraft.client.gui.SlotCrafting import SlotCrafting
6+
from mc.net.minecraft.client.gui.Slot import Slot
7+
from pyglet import gl
8+
9+
class GuiCrafting(GuiInventory):
10+
11+
def __init__(self, player):
12+
super().__init__(None)
13+
self.inventoryCrafting = InventoryCrafting(self)
14+
self.__iInventory = InventoryCraftResult(self)
15+
self._slotsList.append(SlotCrafting(self, self.__iInventory, 0, 124, 34))
16+
for row in range(3):
17+
for col in range(3):
18+
self._slotsList.append(Slot(self, self.inventoryCrafting, col + row * 3,
19+
30 + col * 18, 16 + row * 18))
20+
21+
for row in range(3):
22+
for col in range(9):
23+
self._slotsList.append(Slot(self, player, col + (row + 1) * 9,
24+
8 + col * 18, 84 + row * 18))
25+
26+
for row in range(9):
27+
self._slotsList.append(Slot(self, player, row, 8 + row * 18, 142))
28+
29+
def onGuiClosed(self):
30+
super().onGuiClosed()
31+
for slot in range(9):
32+
stack = self.inventoryCrafting.getStackInSlot(slot)
33+
if stack:
34+
self._mc.thePlayer.dropPlayerItemWithRandomChoice(stack)
35+
36+
def onCraftMatrixChanged(self):
37+
items = [0] * 9
38+
for slot in range(9):
39+
stack = self.inventoryCrafting.stackList[slot]
40+
if stack:
41+
items[slot] = stack.itemID
42+
else:
43+
items[slot] = -1
44+
45+
self.__iInventory.setInventorySlotContents(0, CraftingManager.addRecipe(items))
46+
47+
def _drawGuiContainerForegroundLayer(self):
48+
self._fontRenderer.drawString('Crafting', 8, 6, 4210752)
49+
self._fontRenderer.drawString('Inventory', 8, self.ySize - 96 + 2, 4210752)
50+
51+
def _drawGuiContainerBackgroundLayer(self):
52+
tex = self._mc.renderEngine.getTexture('gui/crafting.png')
53+
gl.glColor4f(1.0, 1.0, 1.0, 1.0)
54+
gl.glBindTexture(gl.GL_TEXTURE_2D, tex)
55+
x = (self.width - self.xSize) // 2
56+
y = (self.height - self.ySize) // 2
57+
self.drawTexturedModalRect(x, y, 0, 0, self.xSize, self.ySize)

mc/net/minecraft/client/gui/GuiIngame.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from mc.net.minecraft.client.controller.PlayerControllerSP import PlayerControllerSP
22
from mc.net.minecraft.client.render.RenderBlocks import RenderBlocks
33
from mc.net.minecraft.client.render.Tessellator import tessellator
4+
from mc.net.minecraft.client.gui.ScaledResolution import ScaledResolution
45
from mc.net.minecraft.client.gui.Gui import Gui
56
from mc.net.minecraft.client.RenderHelper import RenderHelper
67
from mc.net.minecraft.client.ChatLine import ChatLine
@@ -19,8 +20,9 @@ def __init__(self, minecraft):
1920
self.__updateCounter = 0
2021

2122
def renderGameOverlay(self, a):
22-
scaledWidth = self.__mc.width * 240 // self.__mc.height
23-
scaledHeight = self.__mc.height * 240 // self.__mc.height
23+
scaledRes = ScaledResolution(self.__mc.width, self.__mc.height)
24+
scaledWidth = scaledRes.getScaledWidth()
25+
scaledHeight = scaledRes.getScaledHeight()
2426
self.__mc.entityRenderer.setupOverlayRendering()
2527
gl.glBindTexture(gl.GL_TEXTURE_2D, self.__mc.renderEngine.getTexture('gui/gui.png'))
2628
gl.glColor4f(1.0, 1.0, 1.0, 1.0)

0 commit comments

Comments
 (0)