本篇教程由作者设定使用 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秒,随即在!!!效果结束后自爆。在血月时用起来效果非常震撼,爆炸就是艺术!