Thanks Owen!

I combined it into a Gist to make it easier for people to use.
https://gist.github.com/NeilShah2026/32d48b438407ba0eb5c6a56cbbc4ff65

On Fri, Dec 2, 2022 at 10:20 AM Cabal Owen <cabalo...@gmail.com> wrote:

> Python scripts can generate neat in-world things, and there are many
> examples on the web. With a few lines you can draw a giant glass sphere,
> and with a bit more work make a giant Sierpinski triangle in the sky and
> even import obj files like a space shuttle. I myself made fun scripts to
> draw a water-filled glass donut and a gigantic Klein bottle, to turn
> everything around into TNT and to control Minecraft with your brain using a
> MindFlex EEG toy. There is a whole book introducing programming using
> python scripts for Minecraft, and you can even make simple Minecraft-based
> games. I will also show how to do simple (and sometimes more elaborate)
> turtle-based drawings in Minecraft, while you can ride along with the
> drawing as the turtle.
>
> For a while now you could write python scripts for Minecraft on the
> Raspberry Pi. I wanted my kids to be able to do that, but we don't have a
> Pi, plus it would be nice to do this with the full desktop Minecraft. You
> could run your own server with the Raspberry Juice plugin which enables
> most of the python scripts to work. But not everyone wants to install and
> configure a server.
>
> So I wrote the Raspberry Jam Mod for Minecraft 1.8 (now ported to 1.8.8,
> 1.8.9 and 1.9 as well) that emulates most of the Raspberry Pi Minecraft
> protocol (about the same as the Raspberry Juice plugin provides) and lets
> Raspberry Pi python scripts run with full desktop Minecraft. (I later found
> out that someone wrote the mcpiapi mod for Minecraft 1.7.10 a couple of
> weeks earlier.) I wrote this Instructable initially for Python 2.7, but I
> think most of my samples will work for 3.x.
>
> I assume that you have basic facility with creating folders and
> downloading, unzipping, and copying files on Windows (or your operating
> system of choice).
>
> You can create Python scripts for Minecraft with a text editor, the IDLE
> environment which comes with Python, or with Visual Studio Python Tools on
> Windows. The last is actually the nicest in some ways, so I'll have some
> optional steps on how to do that.
>
> This summer I plan to teach coding and basic 3D geometry to gifted middle-
> and high-schoolers using Minecraft, Raspberry Jam Mod, Python and Visual
> Studio.
>
> If you want to do this with Minecraft Pocket Edition on Android instead, I
> have an Instructable for that, too.
>
> Step 1. Modules and libraries for Make Minecraft in Python
> To make this Minecraft game in Python, we will utilize the ursina Python
> module. It is a Python cross-platform game creation package similar to
> PyGame.
>
> To install this library, start a terminal or command prompt in the project
> folder and paste the following command.
>
> pip install ursina
> Step 2. importing library
> Import the Ursina Engine and all the Textures that we will require in the
> future.
>
> from ursina import *
> from ursina.prefabs.first_person_controller import FirstPersonController
> app = Ursina()
> grass_texture = load_texture('assets/grass_block.png')
> stone_texture = load_texture('assets/stone_block.png')
> brick_texture = load_texture('assets/brick_block.png')
> dirt_texture  = load_texture('assets/dirt_block.png')
> sky_texture   = load_texture('assets/skybox.png')
> arm_texture   = load_texture('assets/arm_texture.png')
> punch_sound   = Audio('assets/punch_sound',loop = False, autoplay = False)
> block_pick = 1
> To load the textures and block you need to download the Assets folder and
> paste it where your Minecraft code Python file is stored.
>
> Now there are a few things we need to do to make this all work, and let’s
> start by making actual cubes that we can utilize. This will be the most
> significant modification that we can do. It would appear appropriate if we
> applied a more appropriate texture to it. To do that we created a couple of
> textures.
>
> Step 3. Making Voxel(Cubes) for Minecraft in Python
> class Voxel(Button):
>         def __init__(self, position = (0,0,0), texture = grass_texture):
>                 super().__init__(
>                         parent = scene,
>                         position = position,
>                         model = 'assets/block',
>                         origin_y = 0.5,
>                         texture = texture,
>                         color = color.color(0,0,random.uniform(0.9,1)),
>                         scale = 0.5)
> The third step is to build a new class for each voxel that we want to
> construct, therefore the class name will be voxel. And it derives from the
> button class. The basic explanation is that anytime I click on a voxel, I
> want to make another voxel just adjacent to it. So I need to know where
> each voxel is in relation to which button. And in here, we need our init
> method again and nothing else for the time being, and we also need the
> super method with an underscore to init. And now we must supply a few
> parameters, the first of which is parent, as shown above.
>
> The next stage would be to find a position, and the current status is
> (0,0). Next, I’d want to make a model of what the object would look like.
> And for the time being, this one will be a cube (parameters), but we may
> use different forms. The next step is to pass origin_y so that the height
> and 3D space of this cube are effectively (0.5), and the final and most
> crucial item is texture and color. And both of these things multiplied.
>
> Step 4. Making Minecraft Arena
> for z in range(20):
>         for x in range(20):
>                 voxel = Voxel(position = (x,0,z))
> Now that we have everything, we need to create a button for it. The cube’s
> current positions are x, y, and z. (0,0,0). To create individual voxels, we
> must first create a for loop in which the voxel is set. And if you need to
> make it bigger, increase 35 by 35. One of the current issues with this game
> is that if you add too many of these fields, the game may slow down. As a
> result, there would be a significant amount of optimization work to be done.
>
> Step 5. Creating First person Controller(FPC)
> from ursina.prefabs.first_person_controller import FirstPersonController
> player = FirstPersonController()
> The question is how we can develop a first-person character in all of
> this. and ursina makes this super simple. Because it comes with a number of
> preset classes that we may utilize to construct a first-person character.
> We don’t really have to do anything about it. And really, all we have to do
> is import something else first, which is from ursina. prefabs.first_person_
> controller. This is not by default imported into Oceana, so we have to do
> it ourselves, but once we do it, all we have to do to create FPC (First
> Person Character) is to create a new variable where we store and then call
> FPC.
>
> Step 6. Making Interactive UI for Minecraft Python Edition
> def input(self,key):
>         if self.hovered:
>                 if key == 'left mouse down':
>                         punch_sound.play()
>                         if block_pick == 1: voxel = Voxel(position =
> self.position + mouse.normal, texture = grass_texture)
>                         if block_pick == 2: voxel = Voxel(position =
> self.position + mouse.normal, texture = stone_texture)
>                         if block_pick == 3: voxel = Voxel(position =
> self.position + mouse.normal, texture = brick_texture)
>                         if block_pick == 4: voxel = Voxel(position =
> self.position + mouse.normal, texture = dirt_texture)
>                         if key == 'right mouse down':
>                                 punch_sound.play()
>                                 destroy(self)
> What we need to find out now is how to make this all more interactive. We
> must also create and destroy blocks, which will be really simple. Because
> what we want to accomplish is, when you push the voxel button, we want to
> construct a new block at that location. We develop an input function to do
> this. Make some transmissions as well. And then make a to change voxel for
> voxel texture
>
> Step 7. Changing Different Textures for Coding Minecraft in Python
> def update():
>         global block_pick
>
>         if held_keys['left mouse'] or held_keys['right mouse']:
>                 hand.active()
>         else:
>                 hand.passive()
>
>         if held_keys['1']: block_pick = 1
>         if held_keys['2']: block_pick = 2
>         if held_keys['3']: block_pick = 3
>         if held_keys['4']: block_pick = 4
> To make Minecraft with python, we need to change the cube texture, and for
> changing the cube texture here we created a loop by clicking one to four
> keys to alter the voxel texture by Left click and destroying it with the
> right key. In simple words. If we press any of these buttons this block
> pick gets a different number.
>
> Step 8. Creating the Sky
> class Sky(Entity):
>         def __init__(self):
>                 super().__init__(
>                         parent = scene,
>                         model = 'sphere',
>                         texture = sky_texture,
>                         scale = 150,
>                         double_sided = True)
> There are three other components that can significantly help to convey the
> game. The first is a Sky Box, the second is a Hand, and the third is
> noises. And let us take them one step at a time in Minecraft coding Python.
> The first is a skybox, which we emulated in our game by creating a huge
> sphere with a sky texture. To do this, we will construct a new class named
> Sky.
>
> Step 9. Make an FPC Hand
> class Hand(Entity):
>         def __init__(self):
>                 super().__init__(
>                         parent = camera.ui, # This 3D space for Our UI and
> 2D space for our camera
>                         model = 'assets/arm',
>                         texture = arm_texture,
>                         scale = 0.2,
>                         rotation = Vec3(150,-10,0), #vec3 is represent 3D
> space and the parameters are for position(x,y,z)
>                         position = Vec2(0.4,-0.6)) #vec2 is represent 2D
> space and the parameters are for position(x,y,z)
>
>         def active(self):
>                 self.position = Vec2(0.3,-0.5)
>
>         def passive(self):
>                 self.position = Vec2(0.4,-0.6)
> Now the next thing we will going to need is a hand and this one is purely
> decorative. Basically I have used some types of variables while working on
> https://enterprise.affle.com/mobile-app-development . It does not do
> anything besides simulating having a hand it’s a straightforward thing by
> creating a class called hand, this one is also going to be an entity.
>
> Complete code of Minecraft in Python -
> from ursina import *
> from ursina.prefabs.first_person_controller import FirstPersonController
>
> app = Ursina()
> grass_texture = load_texture('assets/grass_block.png')
> stone_texture = load_texture('assets/stone_block.png')
> brick_texture = load_texture('assets/brick_block.png')
> dirt_texture  = load_texture('assets/dirt_block.png')
> sky_texture   = load_texture('assets/skybox.png')
> arm_texture   = load_texture('assets/arm_texture.png')
> punch_sound   = Audio('assets/punch_sound',loop = False, autoplay = False)
> block_pick = 1
>
> window.fps_counter.enabled = False #To Disable the FPS Counter
> window.exit_button.visible = False #To Remove the exit(close) Button
>
> def update():
>         global block_pick
>
>         if held_keys['left mouse'] or held_keys['right mouse']:
>                 hand.active()
>         else:
>                 hand.passive()
>
>         if held_keys['1']: block_pick = 1
>         if held_keys['2']: block_pick = 2
>         if held_keys['3']: block_pick = 3
>         if held_keys['4']: block_pick = 4
>
> class Voxel(Button):
>         def __init__(self, position = (0,0,0), texture = grass_texture):
>                 super().__init__(
>                         parent = scene,
>                         position = position,
>                         model = 'assets/block',
>                         origin_y = 0.5,
>                         texture = texture,
>                         color = color.color(0,0,random.uniform(0.9,1)),
>                         scale = 0.5)
>
>         def input(self,key):
>                 if self.hovered:
>                         if key == 'left mouse down':
>                                 punch_sound.play()
>                                 if block_pick == 1: voxel = Voxel(position
> = self.position + mouse.normal, texture = grass_texture)
>                                 if block_pick == 2: voxel = Voxel(position
> = self.position + mouse.normal, texture = stone_texture)
>                                 if block_pick == 3: voxel = Voxel(position
> = self.position + mouse.normal, texture = brick_texture)
>                                 if block_pick == 4: voxel = Voxel(position
> = self.position + mouse.normal, texture = dirt_texture)
>
>                         if key == 'right mouse down':
>                                 punch_sound.play()
>                                 destroy(self)
>
> class Sky(Entity):
>         def __init__(self):
>                 super().__init__(
>                         parent = scene,
>                         model = 'sphere',
>                         texture = sky_texture,
>                         scale = 150,
>                         double_sided = True)
>
> class Hand(Entity):
>         def __init__(self):
>                 super().__init__(
>                         parent = camera.ui,
>                         model = 'assets/arm',
>                         texture = arm_texture,
>                         scale = 0.2,
>                         rotation = Vec3(150,-10,0),
>                         position = Vec2(0.4,-0.6))
>
>         def active(self):
>                 self.position = Vec2(0.3,-0.5)
>
>         def passive(self):
>                 self.position = Vec2(0.4,-0.6)
>
> for z in range(20):
>         for x in range(20):
>                 voxel = Voxel(position = (x,0,z))
>
> player = FirstPersonController()
> sky = Sky()
> hand = Hand()
>
> app.run()
>
> Hope it will help everyone.
> _______________________________________________
> Edu-sig mailing list -- edu-sig@python.org
> To unsubscribe send an email to edu-sig-le...@python.org
> https://mail.python.org/mailman3/lists/edu-sig.python.org/
> Member address: neildshah1...@gmail.com
>
_______________________________________________
Edu-sig mailing list -- edu-sig@python.org
To unsubscribe send an email to edu-sig-le...@python.org
https://mail.python.org/mailman3/lists/edu-sig.python.org/
Member address: arch...@mail-archive.com

Reply via email to