本篇教程由作者设定使用 CC BY-NC-SA 协议。

HBM的核科技中有一把逆天的B93能量手枪不需要任何弹药即可发射。被此手枪射中后等待一段时间后自爆(被给予!!!效果)。

NTM/HBM的核科技EX重制版中基本得到了继承,但是在EX重制版中,该枪不按右键蓄力则射程极短,蓄力则射出子弹会造成大爆炸:

蓄力一次(正常射击)造成小范围爆炸,两次造成小范围sa爆炸,三次造成大范围反Sa326爆炸,四次造成奇点,五次造成可控反振谐奇点,六次造成小spark奇点,七次造成大spark奇点,八次造成黑洞,九次造成大范围核爆,十次将会使该枪自毁并造成超大范围sa爆炸

也就看不到生物爆炸的效果了(你就说炸没炸吧)。而JEI中找到的!!!喷溅和滞留药水,抛射距离极近,还经常被抗药性高的抵抗。

因此有了想用CRT/COT魔改的想法。

从以下两篇教程中找到思路:

[1.12.2]简单NBT的操纵与物品动态信息展示(基本完结)

……

  下边用一个例子进行说明关联数组的一个用法:我希望给钻石剑添加一个特殊的机制:在攻击敌人时给对方上10s的饥饿、15s的中毒与5s的凋零(均为I级)。事件本身比较简单,在不使用关联数组的情况下使用枚举就可以写出来:

import crafttweaker.event.EntityLivingHurtEvent;
import crafttweaker.damage.IDamageSource;
import crafttweaker.entity.IEntityLivingBase;
import crafttweaker.player.IPlayer;
 
events.onEntityLivingHurt(function(event as EntityLivingHurtEvent){
    if(event.entityLivingBase.world.remote)return;
    var dmgsrc as IDamageSource = event.damageSource;
    var entity as IEntityLivingBase = event.entityLivingBase;
    if(
        !isNull(dmgsrc)&&
        !isNull(dmgsrc.damageType)&&
        !(dmgsrc.projectile)&&
        !isNull(dmgsrc.getTrueSource())&&
        (dmgsrc.getTrueSource() instanceof IPlayer)
    ){
        var player as IPlayer = dmgsrc.getTrueSource();
        if(!isNull(player.currentItem)&&<item:minecraft:diamond_sword:*>.matches(player.currentItem)){
            entity.addPotionEffect(<potion:minecraft:hunger>.makePotionEffect(200,0));
            entity.addPotionEffect(<potion:minecraft:poison>.makePotionEffect(300,0));
            entity.addPotionEffect(<potion:minecraft:wither>.makePotionEffect(100,0));
        }
    }
});

……

[1.12.2]Re:从零开始的自定义匠魂词条之旅!手把手带你定制属于你自己的匠魂词条!【无限期暂停更新】

……

   输入长方体两个对角顶点坐标(Positon3f类),从目标维度获取该范围内的所有实体表单(IEntity[]),需要注意的是这里获取的是一个IEntity类的数组而并非一个具体的对象。对于数组我们不能直接操作,但我们可以选择使用遍历的方式“一个一个地”操作其中的对象。


    让我们来一个一个解决问题,首先是目标区域长方体的“Position3f类”的(坐标)参数,对此我们先获取目标实体的位置信息([4.1]),查阅wiki很容易获得以下三个ZenGetter/Method(链接,注意要去IEntity类的界面找),但是注意!虽然wiki里写了有这个ZenGetter/Method,但实际直接写会给报错数组越界:(别问我是怎么知道的)

……

#loader contenttweaker    
#modloaded tconstruct
     
 import mods.contenttweaker.tconstruct.TraitBuilder;
     
import crafttweaker.player.IPlayer;
import crafttweaker.entity.IEntityLivingBase;
     
var everBurningAmber = TraitBuilder.create("ever_burning_amber");
everBurningAmber.color = 0xcb4b16;
everBurningAmber.localizedName = "「炽燃不灭的琥珀」";
everBurningAmber.localizedDescription = "「烈定!」\n玩家攻击时有概率对周围5*5*5的非己方实体额外造成2.0点固定伤害并点燃所有实体,该效果触发时造成伤害提高50%,并治疗玩家2.0点生命值。";
everBurningAmber.calcDamage = function(trait, tool, attacker, target, originalDamage, currentDamage, isCritical) {
        var dmg as float = currentDamage;//定义一个dmg的变量储存目前的伤害值
        if(attacker.world.remote)return dmg;//事件代码规范不解释
        if(attacker instanceof IPlayer){//instanceof判定转化,注意这里使用了IPlayer类的关键词,需要导包!
            var player as IPlayer = attacker;//用一个叫player的变量储存玩家信息
            if(player.world.random.nextDouble()<0.1f){//随机数检测器,设定概率为10%
                //获取目标长方体范围
                var Xt = target.getX() as double;
                var Yt = target.getY() as double;
                var Zt = target.getZ() as double;
                var areaStart = crafttweaker.util.Position3f.create( ( Xt + 2.0d ) , ( Yt + 2.0d ) , ( Zt + 2.0d ) );
                var areaEnd = crafttweaker.util.Position3f.create( ( Xt - 2.0d ) , ( Yt - 2.0d ) , ( Zt - 2.0d ) );
                for entity in target.world.getEntitiesInArea( areaStart , areaEnd ){
                    if(entity instanceof IEntityLivingBase){//记得导包!!!
                        var entitylivingbase as IEntityLivingBase = entity;
                        //IPlayer类判定
                        if(entitylivingbase instanceof IPlayer){//记得导包!!!
                            var areaplayer as IPlayer = entitylivingbase;
                            if(areaplayer.uuid!=player.uuid){//玩家uuid判定,非攻击者执行
                                areaplayer.health -= 2.0f;//固定伤害2.0点
                                areaplayer.setFire(5);//着火5s
                            }
                        }
                        else{//非IPlayer类执行
                            entitylivingbase.health -= 2.0f;//固定伤害2.0点
                            entitylivingbase.setFire(5);//着火5s
                        }
                    }
                }
                player.health+=2.0f;
                dmg *=1.5f;
            }
        }
        return dmg;//记得返回修改后的伤害值
    };
    everBurningAmber.register();


经过嫁接合并魔改查WIKI,最终修改完成的脚本如下:



import crafttweaker.world.IWorld;
import crafttweaker.event.IEntityEvent;
import crafttweaker.event.EntityLivingHurtEvent;
import crafttweaker.damage.IDamageSource;
import crafttweaker.entity.IEntityLivingBase;
import crafttweaker.player.IPlayer;
import crafttweaker.events.IEventManager;
import crafttweaker.event.CommandEvent;
import crafttweaker.command.ICommand;
import crafttweaker.event.PlayerRightClickItemEvent;
events.onPlayerRightClickItem (function (event as crafttweaker.event.PlayerRightClickItemEvent)  {
        var player as IPlayer = event.player;
        if(!isNull(player.currentItem)&&<item:hbm:gun_b93>.matches(player.currentItem)){
                //获取目标长方体范围
                var Xt = player.getX() as double;
                var Yt = player.getY() as double;
                var Zt = player.getZ() as double;
                var areaStart = crafttweaker.util.Position3f.create( ( Xt + 32.0d ) , ( Yt + 32.0d ) , ( Zt + 32.0d ) );
                var areaEnd = crafttweaker.util.Position3f.create( ( Xt - 32.0d ) , ( Yt - 32.0d ) , ( Zt - 32.0d ) );
                for entity in player.world.getEntitiesInArea( areaStart , areaEnd ){
                    if(entity instanceof IEntityLivingBase){//记得导包!!!
                        var entitylivingbase as IEntityLivingBase = entity;
                            entitylivingbase.addPotionEffect(<potion:hbm:potion.hbm_bang>.makePotionEffect(60,0));
                            entitylivingbase.setFire(5);//着火5s
                    }
                }

        }

});


需要[CoT]ContentTweaker[CrT]CraftTweaker以及B.A.S.E

效果是你只要在物品栏里右键B93能量手枪,不管对没对准目标射没射中,以你为原点半径32格往上32格往下32格里的所有实体(注意是不分敌我的,如果要分敌我还请大佬赐教)会被点燃5秒,随即在!!!效果结束后自爆。在血月时用起来效果非常震撼,爆炸就是艺术!