IC2 アドオン制作 防具について質問[解決]

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.246466)

IC2 アドオン制作 防具について質問[解決]

投稿記事by ManEXpen » 2015年9月09日(水) 21:48

Ic2ex765、MCver1.7.10の環境にて試しにクアンタムのような
防具をIc2アドオンとして作ってみようと思ったのですが、
資料が少なく良くわかりませんでした。
よければサンプルコードか解説を書いていただけないでしょうか。
最後に編集したユーザー ManEXpen [ 2016年1月30日(土) 18:18 ], 累計 1 回
LevelStorage1.7.10に対応させたり好き勝手やってます
アバター
ManEXpen
ID:1075a1a5
木を殴ってる
 
記事: 33
登録日時: 2014年12月28日(日) 08:22

  • (PostNo.253628)

Re: IC2 アドオン制作 防具について質問

投稿記事by C6H2Cl2 » 2015年11月11日(水) 19:01

IC2のクアンタムスーツのソースをデコンパイルしたもの
IC2ex さんが書きました:
コード: 全て選択
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package ic2.core.item.armor;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import ic2.api.item.ElectricItem;
import ic2.core.IC2;
import ic2.core.IC2Potion;
import ic2.core.Ic2Items;
import ic2.core.audio.AudioSource;
import ic2.core.audio.PositionSpec;
import ic2.core.init.InternalName;
import ic2.core.init.MainConfig;
import ic2.core.item.ItemTinCan;
import ic2.core.item.armor.ItemArmorElectric;
import ic2.core.util.ConfigUtil;
import ic2.core.util.StackUtil;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumRarity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.DamageSource;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.ISpecialArmor.ArmorProperties;
import net.minecraftforge.event.entity.living.LivingFallEvent;

public class ItemArmorQuantumSuit extends ItemArmorElectric {
    protected static final Map<Integer, Integer> potionRemovalCost = new HashMap();
    private float jumpCharge;
    public static AudioSource audioSource;
    private static boolean lastJetpackUsed = false;

    public ItemArmorQuantumSuit(InternalName internalName, int armorType1) {
        super(internalName, InternalName.quantum, armorType1, 1.0E7D, 12000.0D, 4);
        if(armorType1 == 3) {
            MinecraftForge.EVENT_BUS.register(this);
        }

        potionRemovalCost.put(Integer.valueOf(Potion.field_76436_u.field_76415_H), Integer.valueOf(10000));
        potionRemovalCost.put(Integer.valueOf(IC2Potion.radiation.field_76415_H), Integer.valueOf(10000));
        potionRemovalCost.put(Integer.valueOf(Potion.field_82731_v.field_76415_H), Integer.valueOf(25000));
    }

    @SideOnly(Side.CLIENT)
    public boolean func_77623_v() {
        return true;
    }

    public boolean func_82816_b_(ItemStack aStack) {
        return this.func_82814_b(aStack) != 10511680;
    }

    @SideOnly(Side.CLIENT)
    public IIcon func_77618_c(int par1, int par2) {
        return this.func_77617_a(par1);
    }

    public void func_82815_c(ItemStack par1ItemStack) {
        NBTTagCompound tNBT = par1ItemStack.func_77978_p();
        if(tNBT != null) {
            tNBT = tNBT.func_74775_l("display");
            if(tNBT.func_74764_b("color")) {
                tNBT.func_82580_o("color");
            }
        }

    }

    public int func_82814_b(ItemStack aStack) {
        NBTTagCompound tNBT = aStack.func_77978_p();
        if(tNBT == null) {
            return 10511680;
        } else {
            tNBT = tNBT.func_74775_l("display");
            return tNBT == null?10511680:(tNBT.func_74764_b("color")?tNBT.func_74762_e("color"):10511680);
        }
    }

    public void colorQArmor(ItemStack aStack, int par2) {
        NBTTagCompound tNBT = aStack.func_77978_p();
        if(tNBT == null) {
            tNBT = new NBTTagCompound();
            aStack.func_77982_d(tNBT);
        }

        if(!tNBT.func_74764_b("display")) {
            tNBT.func_74782_a("display", tNBT);
        }

        tNBT = tNBT.func_74775_l("display");
        tNBT.func_74768_a("color", par2);
    }

    public ArmorProperties getProperties(EntityLivingBase entity, ItemStack armor, DamageSource source, double damage, int slot) {
        if(source == DamageSource.field_76379_h && this.field_77881_a == 3) {
            int energyPerDamage = this.getEnergyPerDamage();
            int damageLimit = 2147483647;
            if(energyPerDamage > 0) {
                damageLimit = (int)Math.min((double)damageLimit, 25.0D * ElectricItem.manager.getCharge(armor) / (double)energyPerDamage);
            }

            return new ArmorProperties(10, 1.0D, damageLimit);
        } else {
            return super.getProperties(entity, armor, source, damage, slot);
        }
    }

    @SubscribeEvent
    public void onEntityLivingFallEvent(LivingFallEvent event) {
        if(IC2.platform.isSimulating() && event.entity instanceof EntityLivingBase) {
            EntityLivingBase entity = (EntityLivingBase)event.entity;
            ItemStack armor = entity.func_71124_b(1);
            if(armor != null && armor.func_77973_b() == this) {
                int fallDamage = Math.max((int)event.distance - 10, 0);
                double energyCost = (double)(this.getEnergyPerDamage() * fallDamage);
                if(energyCost <= ElectricItem.manager.getCharge(armor)) {
                    ElectricItem.manager.discharge(armor, energyCost, 2147483647, true, false, false);
                    event.setCanceled(true);
                }
            }
        }

    }

    public double getDamageAbsorptionRatio() {
        return this.field_77881_a == 1?1.1D:1.0D;
    }

    public int getEnergyPerDamage() {
        return 20000;
    }

    @SideOnly(Side.CLIENT)
    public EnumRarity func_77613_e(ItemStack stack) {
        return EnumRarity.rare;
    }

    public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
        NBTTagCompound nbtData = StackUtil.getOrCreateNbtData(itemStack);
        byte toggleTimer = nbtData.func_74771_c("toggleTimer");
        boolean ret = false;
        switch(this.field_77881_a) {
        case 0:
            IC2.platform.profilerStartSection("QuantumHelmet");
            int air = player.func_70086_ai();
            if(ElectricItem.manager.canUse(itemStack, 1000.0D) && air < 100) {
                player.func_70050_g(air + 200);
                ElectricItem.manager.use(itemStack, 1000.0D, (EntityLivingBase)null);
                ret = true;
            } else if(air <= 0) {
                IC2.achievements.issueAchievement(player, "starveWithQHelmet");
            }

            if(ElectricItem.manager.canUse(itemStack, 1000.0D) && player.func_71024_bL().func_75121_c()) {
                int Nightvision = -1;

                for(int hubmode = 0; hubmode < player.field_71071_by.field_70462_a.length; ++hubmode) {
                    if(player.field_71071_by.field_70462_a[hubmode] != null && player.field_71071_by.field_70462_a[hubmode].func_77973_b() == Ic2Items.filledTinCan.func_77973_b()) {
                        Nightvision = hubmode;
                        break;
                    }
                }

                if(Nightvision > -1) {
                    ItemStack var18 = player.field_71071_by.field_70462_a[Nightvision];
                    ItemTinCan var21 = (ItemTinCan)var18.func_77973_b();
                    var18 = var21.onEaten(player, var18);
                    if(var18.field_77994_a <= 0) {
                        player.field_71071_by.field_70462_a[Nightvision] = null;
                    }

                    ElectricItem.manager.use(itemStack, 1000.0D, (EntityLivingBase)null);
                    ret = true;
                }
            } else if(player.func_71024_bL().func_75116_a() <= 0) {
                IC2.achievements.issueAchievement(player, "starveWithQHelmet");
            }

            Iterator var16 = (new LinkedList(player.func_70651_bq())).iterator();

            int var22;
            while(var16.hasNext()) {
                PotionEffect var19 = (PotionEffect)var16.next();
                var22 = var19.func_76456_a();
                Integer var23 = (Integer)potionRemovalCost.get(Integer.valueOf(var22));
                if(var23 != null) {
                    var23 = Integer.valueOf(var23.intValue() * (var19.func_76458_c() + 1));
                    if(ElectricItem.manager.canUse(itemStack, (double)var23.intValue())) {
                        ElectricItem.manager.use(itemStack, (double)var23.intValue(), (EntityLivingBase)null);
                        IC2.platform.removePotion(player, var22);
                    }
                }
            }

            boolean var17 = nbtData.func_74767_n("Nightvision");
            short var20 = nbtData.func_74765_d("HudMode");
            if(IC2.keyboard.isAltKeyDown(player) && IC2.keyboard.isModeSwitchKeyDown(player) && toggleTimer == 0) {
                toggleTimer = 10;
                var17 = !var17;
                if(IC2.platform.isSimulating()) {
                    nbtData.func_74757_a("Nightvision", var17);
                    if(var17) {
                        IC2.platform.messagePlayer(player, "Nightvision enabled.", new Object[0]);
                    } else {
                        IC2.platform.messagePlayer(player, "Nightvision disabled.", new Object[0]);
                    }
                }
            }

            if(IC2.keyboard.isAltKeyDown(player) && IC2.keyboard.isHudModeKeyDown(player) && toggleTimer == 0) {
                toggleTimer = 10;
                if(var20 == 2) {
                    var20 = 0;
                } else {
                    ++var20;
                }

                if(IC2.platform.isSimulating()) {
                    nbtData.func_74777_a("HudMode", var20);
                    switch(var20) {
                    case 0:
                        IC2.platform.messagePlayer(player, "HUD disabled.", new Object[0]);
                        break;
                    case 1:
                        IC2.platform.messagePlayer(player, "HUD (basic) enabled.", new Object[0]);
                        break;
                    case 2:
                        IC2.platform.messagePlayer(player, "HUD (extended) enabled", new Object[0]);
                    }
                }
            }

            if(IC2.platform.isSimulating() && toggleTimer > 0) {
                --toggleTimer;
                nbtData.func_74774_a("toggleTimer", toggleTimer);
            }

            if(var17 && IC2.platform.isSimulating() && ElectricItem.manager.use(itemStack, 1.0D, player)) {
                var22 = MathHelper.func_76128_c(player.field_70165_t);
                int var24 = MathHelper.func_76128_c(player.field_70161_v);
                int var25 = MathHelper.func_76128_c(player.field_70163_u);
                int var26 = player.field_70170_p.func_72957_l(var22, var25, var24);
                if(var26 > 8) {
                    IC2.platform.removePotion(player, Potion.field_76439_r.field_76415_H);
                    player.func_70690_d(new PotionEffect(Potion.field_76440_q.field_76415_H, 100, 0, true));
                } else {
                    IC2.platform.removePotion(player, Potion.field_76440_q.field_76415_H);
                    player.func_70690_d(new PotionEffect(Potion.field_76439_r.field_76415_H, 300, 0, true));
                }

                ret = true;
            }

            IC2.platform.profilerEndSection();
            break;
        case 1:
            IC2.platform.profilerStartSection("QuantumBodyarmor");
            boolean jetpack = nbtData.func_74767_n("jetpack");
            boolean hoverMode = nbtData.func_74767_n("hoverMode");
            boolean jetpackUsed = false;
            if(IC2.keyboard.isJumpKeyDown(player) && IC2.keyboard.isModeSwitchKeyDown(player) && toggleTimer == 0) {
                toggleTimer = 10;
                hoverMode = !hoverMode;
                if(IC2.platform.isSimulating()) {
                    nbtData.func_74757_a("hoverMode", hoverMode);
                    if(hoverMode) {
                        IC2.platform.messagePlayer(player, "Quantum Hover Mode enabled.", new Object[0]);
                    } else {
                        IC2.platform.messagePlayer(player, "Quantum Hover Mode disabled.", new Object[0]);
                    }
                }
            }

            if(IC2.keyboard.isBoostKeyDown(player) && IC2.keyboard.isModeSwitchKeyDown(player) && toggleTimer == 0) {
                toggleTimer = 10;
                jetpack = !jetpack;
                if(IC2.platform.isSimulating()) {
                    nbtData.func_74757_a("jetpack", jetpack);
                    if(jetpack) {
                        IC2.platform.messagePlayer(player, "Quantum Jetpack enabled.", new Object[0]);
                    } else {
                        IC2.platform.messagePlayer(player, "Quantum Jetpack disabled.", new Object[0]);
                    }
                }
            }

            if(jetpack && (IC2.keyboard.isJumpKeyDown(player) || hoverMode && player.field_70181_x < -0.029999999329447746D)) {
                jetpackUsed = this.useJetpack(player, hoverMode);
            }

            if(IC2.platform.isSimulating() && toggleTimer > 0) {
                --toggleTimer;
                nbtData.func_74774_a("toggleTimer", toggleTimer);
            }

            if(IC2.platform.isRendering() && player == IC2.platform.getPlayerInstance()) {
                if(lastJetpackUsed != jetpackUsed) {
                    if(jetpackUsed) {
                        if(audioSource == null) {
                            audioSource = IC2.audioManager.createSource(player, PositionSpec.Backpack, "Tools/Jetpack/JetpackLoop.ogg", true, false, IC2.audioManager.getDefaultVolume());
                        }

                        if(audioSource != null) {
                            audioSource.play();
                        }
                    } else if(audioSource != null) {
                        audioSource.remove();
                        audioSource = null;
                    }

                    lastJetpackUsed = jetpackUsed;
                }

                if(audioSource != null) {
                    audioSource.updatePosition();
                }
            }

            ret = jetpackUsed;
            player.func_70066_B();
            IC2.platform.profilerEndSection();
            break;
        case 2:
            IC2.platform.profilerStartSection("QuantumLeggings");
            boolean enableQuantumSpeedOnSprint;
            if(IC2.platform.isRendering()) {
                enableQuantumSpeedOnSprint = ConfigUtil.getBool(MainConfig.get(), "misc/quantumSpeedOnSprint");
            } else {
                enableQuantumSpeedOnSprint = true;
            }

            if(ElectricItem.manager.canUse(itemStack, 1000.0D) && (player.field_70122_E || player.func_70090_H()) && IC2.keyboard.isForwardKeyDown(player) && (enableQuantumSpeedOnSprint && player.func_70051_ag() || !enableQuantumSpeedOnSprint && IC2.keyboard.isBoostKeyDown(player))) {
                byte var27 = nbtData.func_74771_c("speedTicker");
                ++var27;
                if(var27 >= 10) {
                    var27 = 0;
                    ElectricItem.manager.use(itemStack, 1000.0D, (EntityLivingBase)null);
                    ret = true;
                }

                nbtData.func_74774_a("speedTicker", var27);
                float speed = 0.22F;
                if(player.func_70090_H()) {
                    speed = 0.1F;
                    if(IC2.keyboard.isJumpKeyDown(player)) {
                        player.field_70181_x += 0.10000000149011612D;
                    }
                }

                if(speed > 0.0F) {
                    player.func_70060_a(0.0F, 1.0F, speed);
                }
            }

            IC2.platform.profilerEndSection();
            break;
        case 3:
            IC2.platform.profilerStartSection("QuantumBoots");
            if(IC2.platform.isSimulating()) {
                boolean wasOnGround = nbtData.func_74764_b("wasOnGround")?nbtData.func_74767_n("wasOnGround"):true;
                if(wasOnGround && !player.field_70122_E && IC2.keyboard.isJumpKeyDown(player) && IC2.keyboard.isBoostKeyDown(player)) {
                    ElectricItem.manager.use(itemStack, 4000.0D, (EntityLivingBase)null);
                    ret = true;
                }

                if(player.field_70122_E != wasOnGround) {
                    nbtData.func_74757_a("wasOnGround", player.field_70122_E);
                }
            } else {
                if(ElectricItem.manager.canUse(itemStack, 4000.0D) && player.field_70122_E) {
                    this.jumpCharge = 1.0F;
                }

                if(player.field_70181_x >= 0.0D && this.jumpCharge > 0.0F && !player.func_70090_H()) {
                    if(IC2.keyboard.isJumpKeyDown(player) && IC2.keyboard.isBoostKeyDown(player)) {
                        if(this.jumpCharge == 1.0F) {
                            player.field_70159_w *= 3.5D;
                            player.field_70179_y *= 3.5D;
                        }

                        player.field_70181_x += (double)(this.jumpCharge * 0.3F);
                        this.jumpCharge = (float)((double)this.jumpCharge * 0.75D);
                    } else if(this.jumpCharge < 1.0F) {
                        this.jumpCharge = 0.0F;
                    }
                }
            }

            IC2.platform.profilerEndSection();
        }

        if(ret) {
            player.field_71069_bz.func_75142_b();
        }

    }

    public int func_77619_b() {
        return 0;
    }

    public boolean useJetpack(EntityPlayer player, boolean hoverMode) {
        ItemStack jetpack = player.field_71071_by.field_70460_b[2];
        if(ElectricItem.manager.getCharge(jetpack) == 0.0D) {
            return false;
        } else {
            float power = 1.0F;
            float dropPercentage = 0.05F;
            if((double)((float)ElectricItem.manager.getCharge(jetpack)) / this.getMaxCharge(jetpack) <= (double)dropPercentage) {
                power = (float)((double)power * (ElectricItem.manager.getCharge(jetpack) / (this.getMaxCharge(jetpack) * (double)dropPercentage)));
            }

            if(IC2.keyboard.isForwardKeyDown(player)) {
                float worldHeight = 3.5F;
                if(hoverMode) {
                    worldHeight = 0.5F;
                }

                float y = power * worldHeight * 2.0F;
                if(y > 0.0F) {
                    player.func_70060_a(0.0F, 0.4F * y, 0.02F);
                }
            }

            int worldHeight1 = IC2.getWorldHeight(player.field_70170_p);
            double y1 = player.field_70163_u;
            if(y1 > (double)(worldHeight1 - 25)) {
                if(y1 > (double)worldHeight1) {
                    y1 = (double)worldHeight1;
                }

                power = (float)((double)power * (((double)worldHeight1 - y1) / 25.0D));
            }

            double prevmotion = player.field_70181_x;
            player.field_70181_x = Math.min(player.field_70181_x + (double)(power * 0.2F), 0.6000000238418579D);
            if(hoverMode) {
                float consume = -0.025F;
                if(IC2.keyboard.isSneakKeyDown(player)) {
                    consume = -0.1F;
                }

                if(IC2.keyboard.isJumpKeyDown(player)) {
                    consume = 0.1F;
                }

                if(player.field_70181_x > (double)consume) {
                    player.field_70181_x = (double)consume;
                    if(prevmotion > player.field_70181_x) {
                        player.field_70181_x = prevmotion;
                    }
                }
            }

            double consume1 = 8.0D;
            if(hoverMode) {
                consume1 = 10.0D;
            }

            ElectricItem.manager.discharge(jetpack, consume1, 2147483647, true, false, false);
            player.field_70143_R = 0.0F;
            player.field_70140_Q = 0.0F;
            IC2.platform.resetPlayerInAirTime(player);
            return true;
        }
    }
}


IC2のプログラムデコンパイルして解読できるぐらいじゃないと、厳しいかなー
アバター
C6H2Cl2
ID:2e922742
石掘り
 
記事: 128
登録日時: 2015年9月03日(木) 11:23

  • (PostNo.261116)

Re: IC2 アドオン制作 防具について質問

投稿記事by ManEXpen » 2016年1月30日(土) 18:17

わざわざデコンパイルしていただきありがとうございます
これを元につくっていきたいとおもいます
LevelStorage1.7.10に対応させたり好き勝手やってます
アバター
ManEXpen
ID:1075a1a5
木を殴ってる
 
記事: 33
登録日時: 2014年12月28日(日) 08:22


Return to 質問:開発・制作関連

x