Jump to content

_vertig0

Members
  • Posts

    45
  • Joined

  • Last visited

Everything posted by _vertig0

  1. One of the maintainers is a Mojang employee I believe
  2. Title, I just need to know where the code that prevents the player falling off when they sneak is located, I haven't been able to find it so far
  3. Oh, my bad. I didn't realise you already registered your Bow. You're registering it correctly, ignore what I said
  4. You actually don't need to register your arrow since it extends ArrowEntity, which causes Minecraft to treat it as a normal arrow but still execute your custom logic. You do however need to register your custom item. To do that you need to use Registry Events. Here's an example from my mod (This part goes inside your main class): @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD) public static class RegistryEvents { @SubscribeEvent public static void onItemRegistry(final RegistryEvent.Register<Item> event) { //This is how you register your Bow. However, in setRegistryName(), your mod should pass your own Mod ID for the first argument, not "minecraft". I'm only doing this in my mod because I'm overriding vanilla Bows. The second argument is whatever you name your custom Bow as. And to receive your Custom Bow you would do /give <your-name> modid:name-of-your-bow bow = new ItemForgeBow((new Item.Properties()).maxDamage(384).group(ItemGroup.COMBAT)); bow.setRegistryName("minecraft", "bow"); event.getRegistry().registerAll(bow); } } In any case, my mod does work and causes vanilla Bows to fire custom Arrows, so I'm confident that this is all you need for your special Bows to work
  5. Villagers cured from Zombie Villagers also become Pigs sadly ;-;
  6. Nope, didn't work either: [20:36:48] [Server thread/INFO] [mod.server.forge.ForgeServerCore/]: Spawn List Entry Removed: minecraft:pig*(1-1):5 [20:36:48] [Server thread/INFO] [mod.server.forge.ForgeServerCore/]: Spawn List Entry Removed: minecraft:pig*(1-1):5 [20:36:48] [Server thread/INFO] [mod.server.forge.ForgeServerCore/]: Spawn List Entry Removed: minecraft:pig*(1-1):5 [20:36:48] [Server thread/INFO] [mod.server.forge.ForgeServerCore/]: Spawn List Entry Removed: minecraft:pig*(1-1):5 (The console log is 100 lines long, I shortened it to 4 lines because every lines says the same thing) The above should be printing "Spawn List Entry Removed: minecraft:zombie_villager" if it had been successful Here's the updated code: // You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD // Event bus for receiving Registry Events) @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD) public static class RegistryEvents { @SubscribeEvent public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) { // register a new block here LOGGER.info("HELLO from Register Block"); blockRegistryEvent.getRegistry().registerAll(new BlockSweetBerryBush(Block.Properties.create(Material.PLANTS).tickRandomly().doesNotBlockMovement().sound(SoundType.SWEET_BERRY_BUSH)).setRegistryName(new ResourceLocation("minecraft", "sweet_berry_bush"))); } @SubscribeEvent public static void onItemRegistry(final RegistryEvent.Register<Item> event) { event.getRegistry().registerAll(new ItemCrossbow((new Item.Properties()).maxStackSize(1).group(ItemGroup.COMBAT).maxDamage(397)).setRegistryName(new ResourceLocation("minecraft", "crossbow")), new ItemBow((new Item.Properties()).maxDamage(384).group(ItemGroup.COMBAT)).setRegistryName(new ResourceLocation("minecraft", "bow"))); } @SubscribeEvent public static void onEntityRegistry(final RegistryEvent.Register<EntityType<?>> event) { ResourceLocation villagerRegistry = new ResourceLocation("minecraft", "villager"); ResourceLocation zombieVillagerRegistry = new ResourceLocation("minecraft", "zombie_villager"); event.getRegistry().registerAll(EntityType.Builder.<VillagerEntity>create(EntityVillager::new, EntityClassification.MISC).size(0.6F, 1.95F).build(villagerRegistry.toString()).setRegistryName(villagerRegistry), EntityType.Builder.create(EntityZombieVillager::new, EntityClassification.MONSTER).size(0.6F, 1.95F).immuneToFire().build(zombieVillagerRegistry.toString()).setRegistryName(zombieVillagerRegistry)); } @SubscribeEvent public static void onEnchantRegistry(final RegistryEvent.Register<Enchantment> event) { event.getRegistry().registerAll(new EnchantmentPiercing(Enchantment.Rarity.COMMON, EquipmentSlotType.MAINHAND).setRegistryName(new ResourceLocation("minecraft", "piercing")), new EnchantmentQuickCharge(Enchantment.Rarity.UNCOMMON, EquipmentSlotType.MAINHAND).setRegistryName(new ResourceLocation("minecraft", "quick_charge"))); } } I even went into the game and grabbed a Villager Spawn egg just to check, and, you guessed it, it was a Pig making Villager noises I'm aware that the default Entity in the base vanilla code registers is a Pig, and Minecraft defaults to that if something goes wrong with registering the entity. But if that's the case, ALL Villagers in Minecraft should be Pigs, yet naturally spawning Villagers in my server (In Villages) are totally unaffected and have my custom traits, but Villagers spawned with other means are always Pigs
  7. I'll give it a shot and let you know if it works for entities, thanks On a side note, is it ok to not put the variable and the ObjectHolder? I only stored the new overriding enchantments and stuff in a variable for debugging, my mod doesn't actually need it
  8. By that I mean I'm still facing the original problem that caused me to post the thread. The Villager and Zombie Villager that I replaced are still spawning as pigs I'm starting to think this is a Forge Bug, since my code is exactly the same as all the tutorials I've followed so far
  9. I just checked out Choonster's mod in hopes of finding Entity registration code but unfortunately it uses the older system and can be used for 1.15.2 😧 EDIT: Nevermind I'm blind I was looking at the 1.8 branch when there was a 1.14.4 branch *Facepalm EDIT 2: Choonster's code didn't work for me
  10. Oh, all the hack methods (Such as setFinalStatic and all that) were before I heard that the Forge registry allowed you to just plop your own replacements in. If that's what you meant you could safely ignore all the reflection in that class because I don't actually use those anymore If not I'm not too sure how because I registered the replacement items and enchantments following the tutorials online, through registry events. The Custom Items + the Enchantments also work as intended as well (Or at least haven't broken down yet, unlike the entities)
  11. Bump Should I reduce the code on Github to only include the part that is related to the issue, to save you the headache of searching through the monstrosity that is my mod's source code?
  12. Bump in the meantime to keep thread alive
  13. Alright then, but I will warn you that it is a little cluttered. Most of the code related to the issue is in ForgeServerCore.java: https://github.com/TheShermanTanker/ForgeServerCore
  14. Nope, didn't work. They're still all Pigs
  15. I could've sworn I wasn't using static initializers, since I only created the registry entries at the approriate registry event, and not within a static {} block. But anyway: I changed my registration to use the DeferredRegister, but now it keeps throwing these errors: It's odd since EntityType.java is indeed the registry in vanilla Minecraft for Entities The full registry code: public static final DeferredRegister<EntityType> ENTITY_TYPES = new DeferredRegister<>(ForgeRegistries.ENTITIES, "minecraft"); public static final RegistryObject<EntityType> VILLAGER = ENTITY_TYPES.register("villager", () -> EntityType.Builder.<EntityVillager>create(EntityVillager::new, EntityClassification.MISC).size(0.6F, 1.95F).build("villager")); public static final RegistryObject<EntityType> ZOMBIE_VILLAGER = ENTITY_TYPES.register("zombie_villager", () -> EntityType.Builder.<EntityZombieVillager>create(EntityZombieVillager::new, EntityClassification.MONSTER).size(0.6F, 1.95F).immuneToFire().build("zombie_villager")); public ForgeServerCore() { ENTITY_TYPES.register(FMLJavaModLoadingContext.get().getModEventBus()); //All the other code here is not relevant so I removed it for brevity } EDIT: Solved the compile error, now I'm building the mod. Crossing my fingers and hope it works!
  16. I've already read that page several times, unfortunately it doesn't seem to contain anything relevant to my issue Plus, it's only mobs that don't work. Items, enchantments, and so on are perfectly fine
  17. I've been making a mod for my server and so far it's been going ok, but then I ran into this problem. I used the Registries to overwrite the vanilla Villager and Zombie Villager classes, but upon starting up my server I noticed a problem, I have code to remove Zombie Villagers from natural spawns in the ServerStarted block, normally it prints the debug message "Spawn List Entry minecraft:zombie_villager removed", but this time it printed "Spawn List Entry minecraft:pig removed". Completely confused, I went into my world and spawned a Zombie Villager with a spawn egg, and guess what? It wasn't a Zombie Villager at all, it was a Pig. I did the same thing with Villagers, and sure enough, they also spawned as pigs. They had Villager/Zombie Villager AI and sounds, but everything else, even their drops, were all characteristic of Pigs (They dropped Porkchops, sure enough). And looking further into my console, I also found the Villager death messages: [00:39:02] [Server thread/INFO] [minecraft/Entity]: Villager VillagerEntity['entity.minecraft.pig.cleric'/2298, l='world', x=-2046.59, y=106.41, z=1837.30] died, message: 'entity.minecraft.pig.cleric was slain by [Admin] _vertig0' [00:39:46] [Server thread/INFO] [minecraft/Entity]: Villager VillagerEntity['entity.minecraft.pig.armorer'/2448, l='world', x=-2034.57, y=107.05, z=1845.01] died, message: 'entity.minecraft.pig.armorer was slain by [Admin] _vertig0' [00:40:23] [Server thread/INFO] [minecraft/Entity]: Villager VillagerEntity['entity.minecraft.pig.none'/2487, l='world', x=-2032.48, y=105.00, z=1846.95] died, message: 'entity.minecraft.pig.none was slain by [Admin] _vertig0' entity.minecraft.pig.armourer?? Seriously? Edit: I just realised the above means the server is using the default Minecraft Villager class and not my class, since my class is named EntityVillager. VillagerEntity is the name of the Minecraft class And it gets even stranger. Zombie Villagers and Villagers spawned by the /summon command are perfectly normal, and render properly. Villagers that spawned naturally in the world before I loaded my updated mod were also fine. But any Villagers/Zombie Villagers that spawned after, unless spawned through /summon, are always Pigs... This is how I've overridden the vanilla classes, or at least tried to override. As far as I know I've done everything from the tutorials correctly (For setRegistryName the Mod ID is minecraft because I'm replacing vanilla classes): public static EntityType<?> villager; public static EntityType<?> zombieVillager; // You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD // Event bus for receiving Registry Events) @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD) public static class RegistryEvents { @SubscribeEvent public static void onEntityRegistry(final RegistryEvent.Register<EntityType<?>> event) { villager = EntityType.Builder.<EntityVillager>create(EntityVillager::new, EntityClassification.MISC).size(0.6F, 1.95F).build("villager").setRegistryName("minecraft", "villager"); zombieVillager = EntityType.Builder.<EntityZombieVillager>create(EntityZombieVillager::new, EntityClassification.MONSTER).size(0.6F, 1.95F).immuneToFire().build("zombie_villager").setRegistryName("minecraft", "zombie_villager"); event.getRegistry().registerAll(villager, zombieVillager); } } Could anyone help me out? I'm completely stumped by this issue. I've successfully overriden Items and Enchantments this way, but for some reason it just doesn't work with entities These here are my Custom Entity classes, I didn't change much, so I doubt this is the cause package mod.server.forgeservermod; import net.minecraft.entity.EntityType; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.effect.LightningBoltEntity; import net.minecraft.entity.merchant.villager.VillagerEntity; import net.minecraft.entity.villager.IVillagerType; import net.minecraft.world.GameRules; import net.minecraft.world.World; public class EntityVillager extends VillagerEntity { public EntityVillager(EntityType<? extends VillagerEntity> type, World worldIn) { super(type, worldIn); } @Override protected void registerAttributes() { super.registerAttributes(); this.getAttribute(SharedMonsterAttributes.ARMOR).setBaseValue(2.0D); this.getAttribute(SharedMonsterAttributes.ARMOR_TOUGHNESS).setBaseValue(1.0D); } @Override public void livingTick() { if(this.world.getGameRules().getBoolean(GameRules.NATURAL_REGENERATION)) { if (this.getHealth() < this.getMaxHealth() && this.ticksExisted % 20 == 0) { this.heal(2.0F); } } super.livingTick(); } public EntityVillager(EntityType<? extends VillagerEntity> type, World worldIn, IVillagerType villagerType) { super(type, worldIn, villagerType); // TODO Auto-generated constructor stub } @Override public void onStruckByLightning(LightningBoltEntity lightning) { return; } @Override public boolean preventDespawn() { return true; } } package mod.server.forgeservermod; import net.minecraft.entity.EntityType; import net.minecraft.entity.monster.ZombieVillagerEntity; import net.minecraft.world.World; public class EntityZombieVillager extends ZombieVillagerEntity { public EntityZombieVillager(EntityType<? extends ZombieVillagerEntity> type, World world) { super(type, world); // TODO Auto-generated constructor stub } @Override public boolean preventDespawn() { return true; } @Override public boolean canDespawn(double distanceToClosestPlayer) { return false; } } Thanks for taking the time to read my thread
  18. Right now I want to replace 2 Enchantments in Enchantments.java, VillagerEntity in EntityType.java and the Crossbow from Items.java to use my own items with custom logic, rather than the default vanilla logic. However, I can't seem to get past the public static final modifiers in said classes, even with reflection... Registering: // You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD // Event bus for receiving Registry Events) @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD) public static class RegistryEvents { @SubscribeEvent public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) { // register a new block here LOGGER.info("HELLO from Register Block"); } @SubscribeEvent public static void onItemRegistry(final RegistryEvent.Register<Item> event) { crossbow = new ItemForgeCrossbow((new Item.Properties()).maxStackSize(1).group(ItemGroup.COMBAT).maxDamage(326)); event.getRegistry().registerAll(crossbow.setRegistryName("crossbow")); try { ForgeServerCore.usetFinalStatic(ObfuscationReflectionHelper.findField(Items.class, "field_222114_py"), crossbow); } catch (Exception exception) { // TODO Auto-generated catch block LOGGER.error("Error encountered while overwriting base Items.class fields"); exception.printStackTrace(); } } @SubscribeEvent public static void onEntityRegistry(final RegistryEvent.Register<EntityType<?>> event) { EntityType<?> villager = EntityType.Builder.<EntityVillager>create(EntityVillager::new, EntityClassification.MISC).size(0.6F, 1.95F).build("villager").setRegistryName("villager"); event.getRegistry().registerAll(villager); try { ForgeServerCore.usetFinalStatic(ObfuscationReflectionHelper.findField(EntityType.class, "field_200756_av"), villager); } catch (IllegalAccessException exception) { // TODO Auto-generated catch block exception.printStackTrace(); } } @SubscribeEvent public static void onEnchantRegistry(final RegistryEvent.Register<Enchantment> event) { quickCharge = new CustomEnchantmentQuickCharge(Enchantment.Rarity.UNCOMMON, EquipmentSlotType.MAINHAND); piercing = new CustomEnchantmentPiercing(Enchantment.Rarity.COMMON, EquipmentSlotType.MAINHAND); event.getRegistry().registerAll(piercing.setRegistryName("piercing"), quickCharge.setRegistryName("quick_charge")); try { ForgeServerCore.usetFinalStatic(ObfuscationReflectionHelper.findField(Enchantments.class, "field_222193_H"), quickCharge); ForgeServerCore.usetFinalStatic(ObfuscationReflectionHelper.findField(Enchantments.class, "field_222194_I"), piercing); } catch (Exception exception) { // TODO Auto-generated catch block LOGGER.error("Error encountered while overwriting base Enchantments.class fields"); exception.printStackTrace(); } } } In case this is required, these are my custom classes with modified logic: private static Unsafe unsafe; Field field = null; try { field = Unsafe.class.getDeclaredField("theUnsafe"); } catch (NoSuchFieldException exception) { // TODO Auto-generated catch block exception.printStackTrace(); } catch (SecurityException exception) { // TODO Auto-generated catch block exception.printStackTrace(); } //Internal reference if(field == null) { LOGGER.fatal("Field is null"); } field.setAccessible(true); try { unsafe = (Unsafe) field.get(null); } catch (IllegalArgumentException exception) { // TODO Auto-generated catch block exception.printStackTrace(); } catch (IllegalAccessException exception) { // TODO Auto-generated catch block exception.printStackTrace(); } if(unsafe == null) { LOGGER.fatal("Unsafe is null"); } public static void usetFinalStatic(Field field, Object object) throws IllegalAccessException { LOGGER.info("Original field value: " + field.get(null)); //we need a field to update //this is a 'base'. Usually a Class object will be returned here. final Object base = unsafe.staticFieldBase(field); //this is an 'offset' final long offset = unsafe.staticFieldOffset(field); //actual update unsafe.putObject(base, offset, object); //ensure the value was updated LOGGER.info( "Updated static final value: " + field.get(null)); } And this is how I'm trying to modify static final fields ^ Why am I doing this? Because these are hardcoded variables stored in a class. Only other way is ASM
  19. I'll try that and see if it works, but I suspect it's just going to clash with the base physics in AbstractArrowEntity anyway and go all wonky Ah well, who else to blame but Mojang haha
  20. Ok, I will preface this by saying I know ASM and coremods should only be used when absolutely necessary. I've been trying to remove air resistance from arrows on my server, and this pesky bit of code is always eluding me: float f2 = 0.99F; if (this.isInWater()) { for(int j = 0; j < 4; ++j) { float f4 = 0.25F; this.world.addParticle(ParticleTypes.BUBBLE, d5 - d3 * 0.25D, d1 - d4 * 0.25D, d2 - d0 * 0.25D, d3, d4, d0); } f2 = this.getWaterDrag(); } this.setMotion(vec3d.scale((double)f2)); float f2 is basically how drag is implemented in arrows. If I could simply delete the line f2 = this.getWaterDrag() and set float f2 = 1.0F, I'd have removed air resistance The problem is that the f2 variable isn't defined in the class, it's defined in the method block. Instantly that completely makes reflection useless. I can't replace AbstractArrowEntity.java with my own Arrow Entity either, because it's a base class diverging out to many different Arrow subclasses. If I did that the server would crash every time a tipped arrow was shot. And I've also tried reverting the drag using LivingUpdateEvent at both end and start phases, and even both phases at once, but all that did was make arrows unusable because they'd fly around randomly after being shot. It seems ASM is my only way forward unfortunately, but Forge has switched the Coremod system and I'm not too sure how to use it
  21. I feel so stupid now, I completely forgot that Minecraft code was obfuscated ._. But if that's the case, how would I access this field without knowing the actual name of the field?
  22. The problems seems to be that it can't get the protected field, but why? It keeps throwing a NoSuchFieldException on startup saying the ticksSinceLastSwing field does not exist... when it clearly does...
×
×
  • Create New...

Important Information

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