本篇教程来自MC百科(mcmod.cn) 未经允许禁止转载。
本教程只适用于 1.10.1 之后的版本。
星能力是一种由玩家站在处于激活状态的共鸣祭坛与星座共鸣所获得的新能力。玩家成功获得星能力后,可打开星芒宝典并点击“星能力”标签,这时你会看到下面的圆形树状图:
图上有三种技能点,带星座图案的技能点叫根源技能,根源技能点之后还有两种技能点,小的提供较弱的技能属性,带圆圈的大的提供较强的技能属性。
技能点的颜色代表着不同的状态,黄色代表已激活,品红色代表可选择,淡蓝色代表锁定。
星能力的等级上限由 9 级提高到 30(1.16是40)级,初始为 0 级,并获得一个技能点数。这时你可以通过点击连线上的技能点来激活技能,之后每升一级就能再获得一个技能点。在1.16移除了,变成宝石插槽了,其中最中间的技能点叫“奇点”,它的特殊之处在于激活这个之后,除了额外获得三个技能点数,还可以额外选择其他星座的星能力。
星能力等级经验的获取方式视不同的星座而定:
星座 | 获取方式 |
非攻座 | 伤害实体 |
遁甲座 | 受到伤害 |
虚御座 | 移动、游泳和飞行,但不包括骑马、划船、瞬移和乘坐矿车。 |
生息座 | 放置方块 |
解离座 | 破坏方块 |
如果玩家不慎选错了星座,你可以用更替之星或者辐射之星重新选择星座。但要注意:
更替之星适合星能力等级较低(0 - 10 级)时使用,它会把你的星能力等级和经验重置为 0,然后移除之前激活过的所有技能点。
辐射之星适合星能力等级较高(11 - 40级)时使用,它会根据辐射之星上的星座重新选择星座,同时你的星能力等级和经验不会被重置,移除之前激活过的所有技能点且技能点数会全部返还,以供重新选择。
在玩家选择技能点的时候,有时会难免选错技能点。这时,你可以用封闭印章屏蔽那些不喜欢的技能点。如果你的物品栏有封闭印章的话,那么它们会在你在打开图中界面时出现在左上角的格子里,只需把封闭印章从这个格子拖拽过来,放在你想屏蔽的技能点上即可,双击取消屏蔽。不会返还技能点数。
补充:最中间的奇点,选中后将可以点选另外四个根源技能,并且该根源的升级方式有效。使用此技巧可以快速升到30级以便洗点。
周围的固有技能,分别由五个需要用嘹望台观测的星座解锁,个人觉得只有贪狼座有用。
三个三角形围绕的顿悟技能,第一次点亮顿悟技能必须将三角形点全才能解锁。每个根源技能只能解锁对应的一个技能,例如:遁甲座对应解锁防御之道,虚御座对应运动之道。在利用奇点同时点亮两个以上根源技能时,点亮一个对应的顿悟以后将解锁技能树上其他对应的顿悟技能,可以直接消耗一个技能点点亮而不需要技能树有已经解锁的技能联系(连线),并且会把三角形周围的三个技能一同点亮,被连带点亮的三个技能不消耗技能点。注意解锁第一个顿悟技能时点亮三角形周围的三个技能是需要消耗技能点的。技巧:拥有多个顿悟技能享受更高的经验获取量能快速升级。
根据虚御座的经验增长,每次 playertick 时,added 为 0,进行判断:
如果走了就对 added 增加走的距离和 500 中的较小值 ;
如果跑了就加跑的距离和 500 中的较小值,并在 added 的基础上*1.2;
如果飞了就对 added 增加飞的距离和 500 中的较小值,并在 added 的基础上*0.4;
如果使用鞘翅飞行就对 added 增加鞘翅飞行的距离和 500 中的较小值,并在 added 的基础上*0.8,且 added 最大为 500,如果 added 大于 0 就对 added*0.025 ,然后 added*expMultiplier (配置文件中的 Exp_Multiplier) 。
代码如下:
public void onPlayerTick(EntityPlayer player, Side side) {
if (side == Side.SERVER && player instanceof EntityPlayerMP) {
UUID uuid = player.getUniqueID();
StatisticsManager manager = ((EntityPlayerMP) player).getStatFile();
int walked = manager.readStat(StatList.WALK_ONE_CM);
int sprint = manager.readStat(StatList.SPRINT_ONE_CM);
int flown = manager.readStat(StatList.FLY_ONE_CM);
int elytra = manager.readStat(StatList.AVIATE_ONE_CM);
int lastWalked = this.moveTrackMap.computeIfAbsent(StatList.WALK_ONE_CM, s -> new HashMap<>()).computeIfAbsent(uuid, u -> walked);
int lastSprint = this.moveTrackMap.computeIfAbsent(StatList.SPRINT_ONE_CM, s -> new HashMap<>()).computeIfAbsent(uuid, u -> sprint);
int lastFly = this.moveTrackMap.computeIfAbsent(StatList.FLY_ONE_CM, s -> new HashMap<>()).computeIfAbsent(uuid, u -> flown);
int lastElytra = this.moveTrackMap.computeIfAbsent(StatList.AVIATE_ONE_CM, s -> new HashMap<>()).computeIfAbsent(uuid, u -> elytra);
float added = 0;
if (walked > lastWalked) {
added += Math.min(walked - lastWalked, 500F);
if (added >= 500F) {
added = 500F;
}
this.moveTrackMap.get(StatList.WALK_ONE_CM).put(uuid, walked);
}
if (sprint > lastSprint) {
added += Math.min(sprint - lastSprint, 500F);
if (added >= 500F) {
added = 500F;
}
added *= 1.2F;
this.moveTrackMap.get(StatList.SPRINT_ONE_CM).put(uuid, sprint);
}
if (flown > lastFly) {
added += Math.min(flown - lastFly, 500F);
added *= 0.4F;
this.moveTrackMap.get(StatList.FLY_ONE_CM).put(uuid, flown);
}
if (elytra > lastElytra) {
added += Math.min(elytra - lastElytra, 500F);
added *= 0.8F;
this.moveTrackMap.get(StatList.AVIATE_ONE_CM).put(uuid, flown);
}
if (!PlayerActivityManager.INSTANCE.isPlayerActiveServer(player)) {
return;
}
if (added > 0) {
PlayerProgress prog = ResearchManager.getProgress(player, side);
added *= 0.025F;
added *= expMultiplier;
added = PerkAttributeHelper.getOrCreateMap(player, side).modifyValue(player, prog, AttributeTypeRegistry.ATTR_TYPE_INC_PERK_EFFECT, added);
added = PerkAttributeHelper.getOrCreateMap(player, side).modifyValue(player, prog, AttributeTypeRegistry.ATTR_TYPE_INC_PERK_EXP, added);
added = AttributeEvent.postProcessModded(player, AttributeTypeRegistry.ATTR_TYPE_INC_PERK_EXP, added);
float xpGain = added;
LogCategory.PERKS.info(() -> "Grant " + xpGain + " exp to " + player.getName() + " (Vicio)");
ResearchManager.modifyExp(player, xpGain);
}
}
}
然后这行 added = PerkAttributeHelper.getOrCreateMap(player, side).modifyValue(player, prog, AttributeTypeRegistry.ATTR_TYPE_INC_PERK_EFFECT, added);
是added加星能力增强的总和。
这行 added = PerkAttributeHelper.getOrCreateMap(player, side).modifyValue(player, prog, AttributeTypeRegistry.ATTR_TYPE_INC_PERK_EXP, added);
是进行经验获取提高计算,首先把星能力增强全加起来再加1为perkEffectModifier,
然后进行经验获取增加的计算,是每个增加分开计算,先点的先乘,added乘(perkEffectModifier*星能力增加数值+1),接着进行堆叠乘算的计算,同样也是先点先算,added* (星能力堆叠增加数值*perkEffectModifier+1)。
最后,这行added = AttributeEvent.postProcessModded(player, AttributeTypeRegistry.ATTR_TYPE_INC_PERK_EXP, added);是给予玩家added值的经验。
附上modifyValue的代码
public float modifyValue(EntityPlayer player, PlayerProgress progress, String type, float value) {
PerkAttributeType attributeType = AttributeTypeRegistry.getType(type);
if (attributeType == null) return value;
float perkEffectModifier = 1F;
if (!type.equals(AttributeTypeRegistry.ATTR_TYPE_INC_PERK_EFFECT)) {
perkEffectModifier = modifyValue(player, progress, AttributeTypeRegistry.ATTR_TYPE_INC_PERK_EFFECT, 1F);
}
for (PerkAttributeModifier mod : getModifiersByType(attributeType, PerkAttributeModifier.Mode.ADDITION)) {
value += (mod.getValue(player, progress) * perkEffectModifier);
float test = value;
}
float multiply = value;
for (PerkAttributeModifier mod : getModifiersByType(attributeType, PerkAttributeModifier.Mode.ADDED_MULTIPLY)) {
value += multiply * (mod.getValue(player, progress) * perkEffectModifier);
float test = value;
}
for (PerkAttributeModifier mod : getModifiersByType(attributeType, PerkAttributeModifier.Mode.STACKING_MULTIPLY)) {
value *= ((mod.getValue(player, progress) - 1F) * perkEffectModifier) + 1F;
float test = value;
}
return value;
}
所以如果能力上线够高叠避役座经验加成能叠的很高(dj2中测试)。