Java 基于级别的变量修饰符
我对这个问题很生气。 好吧,让我们开始吧。我想根据MySQL数据库中存储的级别为不同的minecraft事件添加一些修饰符(例如EntityDamageByEntityEvent中处理的伤害程度) 该级别系统将有99个级别(1到100),默认级别为50;例如,在EntityDamageByEntityEvent的情况下,我希望更改损坏,以便: a) 如果玩家等级为50,伤害不会被修改(只会乘以1) b) 如果玩家等级为1,造成的伤害将乘以1/3 c) 如果玩家达到100级,伤害将被3级抵消 到目前为止,还不错,但是对于17级或89级的玩家,我怎么能做到呢?我想知道的是如何转换,比方说,在1/3到3的范围内,1到100的比例,比50=1。。。有点激动人心。。。 提前谢谢,希望你能理解我 如果将点(1,1/3)、(50,1)和(100,3)绘制在图形上,您将看到它们没有形成一条直线。所以现在还不清楚你的伤害修正函数在这些点之间的行为 您可以采用分段线性方式,使用1到50之间的线性插值和(分别)50到100之间的线性插值:Java 基于级别的变量修饰符,java,math,bukkit,Java,Math,Bukkit,我对这个问题很生气。 好吧,让我们开始吧。我想根据MySQL数据库中存储的级别为不同的minecraft事件添加一些修饰符(例如EntityDamageByEntityEvent中处理的伤害程度) 该级别系统将有99个级别(1到100),默认级别为50;例如,在EntityDamageByEntityEvent的情况下,我希望更改损坏,以便: a) 如果玩家等级为50,伤害不会被修改(只会乘以1) b) 如果玩家等级为1,造成的伤害将乘以1/3 c) 如果玩家达到100级,伤害将被3级抵消 到目
final float scalingFactor;
if (level < 50) {
// Convert (1..50) range into (0..1) range.
final float interp = (level - 1) / 49.0;
// Convert (0..1) range into (1/3..3/3) range.
scalingFactor = ((interp * 2.0) + 1.0) / 3.0;
}
else {
// Convert (50..100) range into (0..1) range.
final float interp = (level - 50) / 50.0;
// Convert (0..1) range into (1..3) range.
scalingFactor = (interp * 2.0) + 1.0;
}
return damage * scalingFactor;
在分段线性方法中,1级和50级之间以及50级和100级之间的伤害从一级到下一级的差异是相同的,但50级到51级的伤害差异明显大于49级到50级
指数函数为你提供了一条平滑的曲线,其中每级伤害的差异在整个范围内逐渐增加。你可以这样做:
@EventHandler
public void damage(EntityDamageEvent e){
int i = e.getDamage();
if(e.getDamager() instanceof Player){
int level = //get players level here
float multiplier = (level >= 50 ? (1 + ((1/25) * (level - 50)) : ((1/3) + (1/75) * (level - 1)));
e.setDamage(i * multiplier);
}
}
如果玩家等级为1,伤害将增加1/3;如果等级为50,伤害将增加1;如果等级为100,伤害将增加3。这也适用于介于两者之间的所有数字
下面是它的工作原理:
- 在50(包括)和100(不包括)之间有50个数字,如果您想在该范围内逐渐添加2,则可以在每次数字增加时使用分数
,或2/50
1/25
- 您可以做同样的事情,只需在50个值内逐渐删除2/3,您可以在每次数字下降时删除
,或2/150
1/75
因此,例如,5级将为您提供
1/3+(1/75*(5-1))
=0.386666…=<代码>29/75原始伤害我真不敢相信我花了多长时间试图弄明白这个问题,哈卡,你能不能稍微改变一下你的设计,让1级乘以1,50级乘以3,100级乘以9?事实上,这意味着同样的事情,但实现将更加容易。事实证明,1-100有点奇怪。。。从1-50范围内有49个,50-100范围内有50个。你会重新考虑你的计算方法吗?是的。最后,我决定在两个不同的操作中分离函数,一个用于(1,1/3)和(50,1)之间的行,另一个用于(50,1)和(100,3)
@EventHandler
public void damage(EntityDamageEvent e){
int i = e.getDamage();
if(e.getDamager() instanceof Player){
int level = //get players level here
float multiplier = (level >= 50 ? (1 + ((1/25) * (level - 50)) : ((1/3) + (1/75) * (level - 1)));
e.setDamage(i * multiplier);
}
}