Jump to content

cinsiian

Members
  • Posts

    110
  • Joined

  • Last visited

Posts posted by cinsiian

  1. 6 minutes ago, diesieben07 said:

    Do not lookup the Field every time, do it once and store it in a static final field.

    What do you mean every time? Isnt that supposed to just go in the mod's constructor?

     

    7 minutes ago, diesieben07 said:

    Do not use getClass. Use a class literal (Foo.class).

    Isn't getClass the only way to get the class from the object?

     

  2. Im not familiar with reflections but i tried to replace the field without success:
     

    private void setMaxDefenseValue() throws NoSuchFieldException, SecurityException, IllegalAccessException {
        	Class<SharedMonsterAttributes> attributesArmor = SharedMonsterAttributes.class;
    		Field fieldArmor = attributesArmor.getField("ARMOR");
    		
    		IAttribute attribute = (new RangedAttribute((IAttribute)null, "generic.armor", 0.0D, 0.0D, 1024.0D)).setShouldWatch(true);
    		Object armor = fieldArmor.get(attribute);
    		
    		fieldArmor.set(attribute, armor);
        }

    I called this in the constructor of my mod. Totally not sure this is the not correct way

  3. Ok i actually managed to do it without the capability:

           if(headHealth > 0) { //headHealth is the enchantment level
    			String id = "head-health-boost-enchantment";
    			boolean isAlreadyApplied = false;
    			
    			for(AttributeModifier modifer : utils.MAX_HEALTH().getModifiers()) { //utils.MAX_HEALTH() returns the max health attribute
    				if(modifer.getName().equals(id)) {
    					isAlreadyApplied = true;
    				}
    			}
    			
    			if(!isAlreadyApplied) {
    				AttributeModifier newModifier = new AttributeModifier(id, headHealth * 2, Operation.ADDITION);
    				utils.MAX_HEALTH().applyModifier(newModifier);
    			}
    		} else {
    			for(AttributeModifier modifer : utils.MAX_HEALTH().getModifiers()) {
    				if(modifer.getName().equals("head-health-boost-enchantment")) {
    					utils.MAX_HEALTH().removeModifier(modifer);
    				}
    			}
    		}

    Now modifing the defense seems that theres a 30 limit. Can I avoid that?

  4. 1 minute ago, diesieben07 said:

    How do you modify the value? Show your code.

    @SubscribeEvent
    	public static void update(LivingUpdateEvent event) {
    		LivingEntity entity = event.getEntityLiving();
    		LivingEntityUtils utils = new LivingEntityUtils(entity);
    		int bonus = utils.calculateHealthBonus(); //The bonus
    		double baseHealth = entity.getAttribute(SharedMonsterAttributes.MAX_HEALTH).getBaseValue();
    		
    		entity.getAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(baseHealth + bonus);
    	}

     

    1 minute ago, diesieben07 said:

    No idea what you are talking about.

    Save the default max healths

  5. Just now, diesieben07 said:

    No, this would not happen, because the base value does not include the attribute modifiers, as indicated by its name.

    It does, I just tested it in my world and the health keeps increasing

     

    1 minute ago, diesieben07 said:

    No. An entity type represents the abstract concept of an entity type (like "all zombies"). LivingEntity is a base class for actual entities ("this specific zombie"). There is no useful way to convert from EntityType to LivingEntity.

    So I have the put the values manually?

  6. 15 hours ago, diesieben07 said:

    I am not sure why you think this would "become a loop". But doing this is the way to get the "base value" for the max health. And it should work fine in LivingUpdateEvent.

    Yes it is:

    Update 1 ===: 20 + 2(bonus)

    Update 2 ===: 22 + 2(bonus)

    ec..

     

    It gets modified and the health will increase infinitely. I tested it and yea, this is the problem.

    Just asking if i can cast EntityType to LivingEntity

  7. I found this method:

    entity.getAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue

    but i need to get the entity's default max health.

    So i created a HashMap<LivingEntity, Double> to store the values. I would put the entries during the registry event<EntityType>.

    Is there a way to cast EntityType to LivingEntity so i can get the attribute when the game loads?

    I cant just use entity.getAttribute(SharedMonsterAttributes.MAX_HEALTH).getBaseValue() because im in a LivingUpdateEvent and it will become a loop

  8. How can I remove a vanilla loot pool?

    It needs a name but i cant figure out wich name:

     @SubscribeEvent
    	 public static void loot(LootTableLoadEvent event) {
    		 ResourceLocation iron = new ResourceLocation("minecraft", "blocks/iron_ore");
    		 ResourceLocation gold = new ResourceLocation("minecraft", "blocks/gold_ore");
    		 
    		 if(event.getName().equals(iron)) {
    			event.getTable().removePool("minecraft:iron_ore");
    	        event.getTable().addPool(LootPool.builder().addEntry(TableLootEntry.builder(new ResourceLocation(ortonogeum.INSTANCE.assets.name, "blocks/ore_iron"))).build());
    	     }
    		 
    		 if(event.getName().equals(gold)) {
    		    event.getTable().addPool(LootPool.builder().addEntry(TableLootEntry.builder(new ResourceLocation(ortonogeum.INSTANCE.assets.name, "blocks/ore_gold"))).build());
    		 }
    	 }
    event.getTable().removePool

    Thank you so much

×
×
  • Create New...

Important Information

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