Jump to content

Recommended Posts

Posted

good days

this gona be a llittle long

 

well i get done a block whit 2 textures overlayed for each side but thats a childs game

Captura%20de%20pantalla%20de%202015-01-06%2011%3A19%3A45.png?dl=0

 

wath im triying to do is  a block that counts from 0 to 99  folowing the block states / json  logic it means i must create a blockstate definig 100 states representing the counting from 0 - 99  and if i wanna rotate it becomes 600 states but there is only rom for 16 states so this plan is dead before start

 

well i spend the last nigth playing whit jsons reading things in internet  there is like 3 apis thath allow you to load a json file edit it and saved the changes to json again

.jum load a esternal api and add it to a minecraft mod ñaaaa i prefer to do use stream reader and java nio and do something just to the  size of mi needs

 

ñaa beter explain mi idea before it gets more messy,

in the code for the texture overlayed well is just two perfects cubes one a little bit more big than the other,the two are  defined in a parental cube_layer0_parental.json  andd is called from mi blockeprueba.json where i define every texture to load

 

lets say i do the 3 perfects cubes each one a little bit bigger than the last, the first  the inner holds the yellow background texture

the second is for display the units in the count and the thirth is for the tens in the count

 

soo is something like BlockState blockeprueba.json  > blockmodel blockeprueba.json > parental cube_layer0_parental.json

 

in blockeprueba.json  just define for textures just the backgrond an numbers from 0 -9 and

 

so i wanna do something like create mi own class to load text files a edit it using imput string and java nio or something like to do

 

//JsonObject b = new JsonObject("modmercenario:block/cube_layer0_parental");

miclasse b = new miclasse("modmercenario:block/cube_layer0_parental");

 

then change the value from the second north face from

"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#north" },

to

"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#number0" },

 

saved the file and force somehow minecraft to reload cube_layer0_parental to display in game the change

this part is wath i dont like the accion of reading and writing text files looks like it gonna demand a good piece of resources 

 

soo i  sit and think again, minecraft uses jsons so it must have its own methods to read and likely to edit and change,

minecraft just load jsons at the beginig soo it you minecraft runing and change something in the jsons files it dont get the changes until you close and fireup again soo it must load the jsons values somewhere in the memory and maiby there is alredy some class allowing to change this values in memory on the fly whithout having to restart minecraft

for wath i tested minecraft it using

 

import com.google.gson.JsonArray;

import com.google.gson.JsonElement;

import com.google.gson.JsonObject;

import com.google.gson.JsonPrimitive;

import com.google.gson.JsonSyntaxException;

 

i gets this from the errors it shows wen dont find a json file or json has errors

 

well this wen get stuck

the class JsonObject.class define methods to read and writte values in a json but dont get how to set whath json gonna read or write values

 

there is this class reosuce locations wo aparently is the on in charge of load the jsons in the models folder

but dont get it alwais return the name of the json dont matters if exist or not

example "modmercenario:gato" dont exist but anyway it returns "gato in the exit " 

 

 

 

    ResourceLocation jsona = new ResourceLocation("modmercenario:cube_top");

    System.out.println("####a="+jsona.getResourcePath());

 

   

    ResourceLocation jsonb = new ResourceLocation("modmercenario:blockePrueba");

    System.out.println("####b="+jsonb.getResourcePath());

 

    ResourceLocation jsonc = new ResourceLocation("modmercenario:test/gato");

    System.out.println("####c="+jsonc.getResourcePath());

   

    ResourceLocation jsond = new ResourceLocation("modmercenario:gato");

    System.out.println("####d="+jsond.getResourcePath());

   

go back to the teory

well wath  i need is a method to return a list of the jsons models minecraft has loaded on the start

a method to return the values of an specific json to string to knows whats inside

 

realize how to use JsonObject to edit this jsons on fly and make minecraft load this change on the fly in the world

 

 

 

 

this is code from the overlayed block

 

main class

 

blockePrueba.class

package mercenarymod.blocks.pruebas;

import java.util.Random;

import mercenarymod.Mercenary;
import mercenarymod.blocks.MercenaryModBlocks;
import net.minecraft.block.Block;
import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.resources.FallbackResourceManager;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumWorldBlockLayer;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraft.util.JsonUtils;

import com.google.gson.JsonObject;

import net.minecraft.util.ResourceLocation;


public class blockePrueba extends Block
{
    public static String name = "blockeprueba";
  //###########################################################3
    public blockePrueba()
    {
    	super(Material.rock);
        setUnlocalizedName(Mercenary.MODID + "_" + name);
        GameRegistry.registerBlock(this, name);
        setCreativeTab(Mercenary.herramientas);
        //this.maxStackSize = 1;
    }

  //###########################################################3  
    public Item getItemDropped(IBlockState state, Random rand, int fortune)
    {
        return Item.getItemFromBlock(MercenaryModBlocks.blockePrueba);
    }
  //###########################################################3  
    public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ)
    {
    	
    	//"modmercenario:blockePrueba"
    	
    	ResourceLocation jsona = new ResourceLocation("modmercenario:cube_top");
    	System.out.println("####a="+jsona.getResourcePath());

    	
    	ResourceLocation jsonb = new ResourceLocation("modmercenario:blockePrueba");
    	System.out.println("####b="+jsonb.getResourcePath());

    	ResourceLocation jsonc = new ResourceLocation("modmercenario:test/gato");
    	System.out.println("####c="+jsonc.getResourcePath());
    	
    	ResourceLocation jsond = new ResourceLocation("modmercenario:gato");
    	System.out.println("####d="+jsond.getResourcePath());
    	
    	
    	JsonObject b = new JsonObject();
    	
    	
    return false;}
    
  //###########################################################3
    
    
    public boolean isOpaqueCube()
    {
        return false;
    }
    
    
    public boolean translucent()
    {
        return true;
    }
    
    public int lightValue()
    {
        return 1;
    }
    
    public boolean fullBlock()
    {
        return false;
    }
    
    @SideOnly(Side.CLIENT)
    public EnumWorldBlockLayer getBlockLayer()
    {
        //return EnumWorldBlockLayer.CUTOUT;
        
        return EnumWorldBlockLayer.TRANSLUCENT;
        
    }
        
}

 

BlockState

blockeprueba.json

{
    "variants": {
        "normal": { "model": "modmercenario:blockePrueba" }
    }
}

 

model block json

blockePrueba.json

{
    "parent":  "modmercenario:block/cube_layer0_parental",

    "textures": {
        "all": "modmercenario:blocks/charcoal",

"down":  "modmercenario:blocks/metablockes/metablockemercenario18",
"up":    "modmercenario:blocks/metablockes/metablockemercenario19",
"north": "modmercenario:blocks/metablockes/metablockemercenario20",
"south": "modmercenario:blocks/metablockes/metablockemercenario21",
"west":  "modmercenario:blocks/metablockes/metablockemercenario22",
"east":  "modmercenario:blocks/metablockes/metablockemercenario23",

"down0": "modmercenario:items/hachas/hacha_acero_diamante",
"up0":   "modmercenario:items/hachas/hacha_acero_esmeralda",
"north0":"modmercenario:items/hachas/hacha_acero_redstone",
"south0":"modmercenario:items/palas/pala_madera_nokia",
"west0": "modmercenario:items/palas/pala_madera_obsidiana",
"east0": "modmercenario:items/palas/pala_madera_oro"



    }
}

 

paretal whit the two cubes

cube_layer0_parental.json

{
    "elements": [
        {   "from": [0.1, 0.1, 0.1 ],
            "to": [15.9, 15.9, 15.9 ],
            "faces": {

	"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#north" },
                "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#south" },
	"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#west" },
                "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#east" },
	"up": { "uv": [ 0, 0, 16, 16 ], "texture": "#up" },
                "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#down" }

              
            }
        },

{   "from": [ 0, 0, 0 ],
            "to": [ 16, 16, 16 ],
            "faces": {
               "north": { "uv": [ 0, 0, 16, 16 ], "texture": "#north0" },
                "south": { "uv": [ 0, 0, 16, 16 ], "texture": "#south0" },
	"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#west0" },
                "east": { "uv": [ 0, 0, 16, 16 ], "texture": "#east0" },
	"up": { "uv": [ 0, 0, 16, 16 ], "texture": "#up0" },
                "down": { "uv": [ 0, 0, 16, 16 ], "texture": "#down0" }
            }
        }

    ]
}

 

 

well at this point i have this bunch of theories it i could get this in order it will grant the posibility to make more complex animated blocks and items, using code to get over the 16 metastates limit and for why not do animations muve using sen cos in the code


 

 

 

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • So me and a couple of friends are playing with a shitpost mod pack and one of the mods in the pack is corail tombstone and for some reason there is a problem with it, where on death to fire the player will get kicked out of the server and the tombstone will not spawn basically deleting an entire inventory, it doesn't matter what type of fire it is, whether it's from vanilla fire/lava, or from modded fire like ice&fire/lycanites and it's common enough to where everyone on the server has experienced at least once or twice and it doesn't give any crash log. a solution to this would be much appreciated thank you!
    • It is 1.12.2 - I have no idea if there is a 1.12 pack
    • Okay, but does the modpack works with 1.12 or just with 1.12.2, because I need the Forge client specifically for Minecraft 1.12, not 1.12.2
    • Version 1.19 - Forge 41.0.63 I want to create a wolf entity that I can ride, so far it seems to be working, but the problem is that when I get on the wolf, I can’t control it. I then discovered that the issue is that the server doesn’t detect that I’m riding the wolf, so I’m struggling with synchronization. However, it seems to not be working properly. As I understand it, the server receives the packet but doesn’t register it correctly. I’m a bit new to Java, and I’ll try to provide all the relevant code and prints *The comments and prints are translated by chatgpt since they were originally in Spanish* Thank you very much in advance No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. MountableWolfEntity package com.vals.valscraft.entity; import com.vals.valscraft.network.MountSyncPacket; import com.vals.valscraft.network.NetworkHandler; import net.minecraft.client.Minecraft; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.Entity; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.network.PacketDistributor; public class MountableWolfEntity extends Wolf { private boolean hasSaddle; private static final EntityDataAccessor<Byte> DATA_ID_FLAGS = SynchedEntityData.defineId(MountableWolfEntity.class, EntityDataSerializers.BYTE); public MountableWolfEntity(EntityType<? extends Wolf> type, Level level) { super(type, level); this.hasSaddle = false; } @Override protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(DATA_ID_FLAGS, (byte)0); } public static AttributeSupplier.Builder createAttributes() { return Wolf.createAttributes() .add(Attributes.MAX_HEALTH, 20.0) .add(Attributes.MOVEMENT_SPEED, 0.3); } @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemstack = player.getItemInHand(hand); if (itemstack.getItem() == Items.SADDLE && !this.hasSaddle()) { if (!player.isCreative()) { itemstack.shrink(1); } this.setSaddle(true); return InteractionResult.SUCCESS; } else if (!level.isClientSide && this.hasSaddle()) { player.startRiding(this); MountSyncPacket packet = new MountSyncPacket(true); // 'true' means the player is mounted NetworkHandler.CHANNEL.sendToServer(packet); // Ensure the server handles the packet return InteractionResult.SUCCESS; } return InteractionResult.PASS; } @Override public void travel(Vec3 travelVector) { if (this.isVehicle() && this.getControllingPassenger() instanceof Player) { System.out.println("The wolf has a passenger."); System.out.println("The passenger is a player."); Player player = (Player) this.getControllingPassenger(); // Ensure the player is the controller this.setYRot(player.getYRot()); this.yRotO = this.getYRot(); this.setXRot(player.getXRot() * 0.5F); this.setRot(this.getYRot(), this.getXRot()); this.yBodyRot = this.getYRot(); this.yHeadRot = this.yBodyRot; float forward = player.zza; float strafe = player.xxa; if (forward <= 0.0F) { forward *= 0.25F; } this.flyingSpeed = this.getSpeed() * 0.1F; this.setSpeed((float) this.getAttributeValue(Attributes.MOVEMENT_SPEED) * 1.5F); this.setDeltaMovement(new Vec3(strafe, travelVector.y, forward).scale(this.getSpeed())); this.calculateEntityAnimation(this, false); } else { // The wolf does not have a passenger or the passenger is not a player System.out.println("No player is mounted, or the passenger is not a player."); super.travel(travelVector); } } public boolean hasSaddle() { return this.hasSaddle; } public void setSaddle(boolean hasSaddle) { this.hasSaddle = hasSaddle; } @Override protected void dropEquipment() { super.dropEquipment(); if (this.hasSaddle()) { this.spawnAtLocation(Items.SADDLE); this.setSaddle(false); } } @SubscribeEvent public static void onServerTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.START) { MinecraftServer server = net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(); if (server != null) { for (ServerPlayer player : server.getPlayerList().getPlayers()) { if (player.isPassenger() && player.getVehicle() instanceof MountableWolfEntity) { MountableWolfEntity wolf = (MountableWolfEntity) player.getVehicle(); System.out.println("Tick: " + player.getName().getString() + " is correctly mounted on " + wolf); } } } } } private boolean lastMountedState = false; @Override public void tick() { super.tick(); if (!this.level.isClientSide) { // Only on the server boolean isMounted = this.isVehicle() && this.getControllingPassenger() instanceof Player; // Only print if the state changed if (isMounted != lastMountedState) { if (isMounted) { Player player = (Player) this.getControllingPassenger(); // Verify the passenger is a player System.out.println("Server: Player " + player.getName().getString() + " is now mounted."); } else { System.out.println("Server: The wolf no longer has a passenger."); } lastMountedState = isMounted; } } } @Override public void addPassenger(Entity passenger) { super.addPassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(true)); } } } @Override public void removePassenger(Entity passenger) { super.removePassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is no longer mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(false)); } } } @Override public boolean isControlledByLocalInstance() { Entity entity = this.getControllingPassenger(); return entity instanceof Player; } @Override public void positionRider(Entity passenger) { if (this.hasPassenger(passenger)) { double xOffset = Math.cos(Math.toRadians(this.getYRot() + 90)) * 0.4; double zOffset = Math.sin(Math.toRadians(this.getYRot() + 90)) * 0.4; passenger.setPos(this.getX() + xOffset, this.getY() + this.getPassengersRidingOffset() + passenger.getMyRidingOffset(), this.getZ() + zOffset); } } } MountSyncPacket package com.vals.valscraft.network; import com.vals.valscraft.entity.MountableWolfEntity; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class MountSyncPacket { private final boolean isMounted; public MountSyncPacket(boolean isMounted) { this.isMounted = isMounted; } public void encode(FriendlyByteBuf buffer) { buffer.writeBoolean(isMounted); } public static MountSyncPacket decode(FriendlyByteBuf buffer) { return new MountSyncPacket(buffer.readBoolean()); } public void handle(NetworkEvent.Context context) { context.enqueueWork(() -> { ServerPlayer player = context.getSender(); // Get the player from the context if (player != null) { // Verifies if the player has dismounted if (!isMounted) { Entity vehicle = player.getVehicle(); if (vehicle instanceof MountableWolfEntity wolf) { // Logic to remove the player as a passenger wolf.removePassenger(player); System.out.println("Server: Player " + player.getName().getString() + " is no longer mounted."); } } } }); context.setPacketHandled(true); // Marks the packet as handled } } networkHandler package com.vals.valscraft.network; import com.vals.valscraft.valscraft; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class NetworkHandler { private static final String PROTOCOL_VERSION = "1"; public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel( new ResourceLocation(valscraft.MODID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals ); public static void init() { int packetId = 0; // Register the mount synchronization packet CHANNEL.registerMessage( packetId++, MountSyncPacket.class, MountSyncPacket::encode, MountSyncPacket::decode, (msg, context) -> msg.handle(context.get()) // Get the context with context.get() ); } }  
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.