From 53bf0551085fe2112429aa7783b11ea6daf0ec8d Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Sat, 4 Mar 2017 15:54:26 +0800 Subject: [PATCH 01/17] =?UTF-8?q?=E3=80=90=E4=B8=BBMOD=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E3=80=91=E5=85=BC=E5=AE=B9=E8=87=B3104?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.properties | 2 +- src/main/java/cn/paindar/academymonster/ability/AIArcGen.java | 2 +- .../java/cn/paindar/academymonster/ability/AIBodyIntensify.java | 2 +- .../java/cn/paindar/academymonster/ability/AIDirectedShock.java | 2 +- .../java/cn/paindar/academymonster/ability/AIElectronBomb.java | 2 +- .../java/cn/paindar/academymonster/ability/AIFleshRipping.java | 2 +- .../java/cn/paindar/academymonster/ability/AILightShield.java | 2 +- .../cn/paindar/academymonster/ability/AIPenetrateTeleport.java | 2 +- src/main/java/cn/paindar/academymonster/ability/AIRailgun.java | 2 +- .../java/cn/paindar/academymonster/ability/AIThunderClap.java | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/build.properties b/build.properties index 3330ca6..e018749 100644 --- a/build.properties +++ b/build.properties @@ -9,6 +9,6 @@ ccl_ver = 1.1.3.136 ccc_ver = 1.0.6.43 lambdalib_ver = 1.2.3 -academycraft_ver = 1.0.6 +academycraft_ver = 1.0.4 diff --git a/src/main/java/cn/paindar/academymonster/ability/AIArcGen.java b/src/main/java/cn/paindar/academymonster/ability/AIArcGen.java index 0b7a3fd..3088451 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIArcGen.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIArcGen.java @@ -34,7 +34,7 @@ public class AIArcGen extends BaseSkill private float slowdown; public AIArcGen(EntityLivingBase speller, float exp) { - super(speller, (int)lerpf(40,20,exp), exp,ArcGen.getFullName()); + super(speller, (int)lerpf(40,20,exp), exp,"arc_gen"); damage=lerpf(5,9,exp); range=lerpf(6,15,exp); prob=lerpf(0,0.6f,exp); diff --git a/src/main/java/cn/paindar/academymonster/ability/AIBodyIntensify.java b/src/main/java/cn/paindar/academymonster/ability/AIBodyIntensify.java index 928d72f..749f052 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIBodyIntensify.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIBodyIntensify.java @@ -15,7 +15,7 @@ public class AIBodyIntensify extends BaseSkill { public AIBodyIntensify(EntityLivingBase speller, float exp) { - super(speller, (int)lerpf(300, 100,exp), exp,BodyIntensify.getFullName()); + super(speller, (int)lerpf(300, 100,exp), exp,"body_intensify"); } diff --git a/src/main/java/cn/paindar/academymonster/ability/AIDirectedShock.java b/src/main/java/cn/paindar/academymonster/ability/AIDirectedShock.java index 42d0682..2086275 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIDirectedShock.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIDirectedShock.java @@ -25,7 +25,7 @@ public class AIDirectedShock extends BaseSkill private float damage; public AIDirectedShock(EntityLivingBase speller, float exp) { - super(speller, (int)lerpf(60, 20, exp), exp,DirectedShock.getFullName()); + super(speller, (int)lerpf(60, 20, exp), exp,"dir_shock"); damage=lerpf(7, 15,exp); } diff --git a/src/main/java/cn/paindar/academymonster/ability/AIElectronBomb.java b/src/main/java/cn/paindar/academymonster/ability/AIElectronBomb.java index a483d51..79106f6 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIElectronBomb.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIElectronBomb.java @@ -27,7 +27,7 @@ public class AIElectronBomb extends BaseSkill private float damage; public AIElectronBomb(EntityLivingBase speller,float exp) { - super(speller,(int)lerpf(40,10, exp), exp,ElectronBomb.getFullName()); + super(speller,(int)lerpf(40,10, exp), exp,"electron_bomb"); damage=lerpf(6, 12, exp); maxDistance=lerpf(7,15,exp); } diff --git a/src/main/java/cn/paindar/academymonster/ability/AIFleshRipping.java b/src/main/java/cn/paindar/academymonster/ability/AIFleshRipping.java index 6012747..32af7cc 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIFleshRipping.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIFleshRipping.java @@ -23,7 +23,7 @@ public class AIFleshRipping extends BaseSkill private float damage; public AIFleshRipping(EntityLivingBase speller, float skillExp) { - super(speller, (int)lerpf(90, 40, skillExp), skillExp,FleshRipping.getFullName()); + super(speller, (int)lerpf(90, 40, skillExp), skillExp,"flesh_ripping"); maxDistance=lerpf(2, 5, skillExp); damage=lerpf(5, 12, skillExp); } diff --git a/src/main/java/cn/paindar/academymonster/ability/AILightShield.java b/src/main/java/cn/paindar/academymonster/ability/AILightShield.java index d938432..ee344ba 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AILightShield.java +++ b/src/main/java/cn/paindar/academymonster/ability/AILightShield.java @@ -32,7 +32,7 @@ public class AILightShield extends BaseSkill public AILightShield(EntityLivingBase speller, float exp) { - super(speller, (int)lerpf(100,40,exp), exp, LightShield.getFullName()); + super(speller, (int)lerpf(100,40,exp), exp, "light_shield"); maxTime=(int)lerpf(100,300,exp); touchDamage=lerpf(2, 6, exp); absorbDamage=lerpf(150,300,exp); diff --git a/src/main/java/cn/paindar/academymonster/ability/AIPenetrateTeleport.java b/src/main/java/cn/paindar/academymonster/ability/AIPenetrateTeleport.java index 8bf42a4..ed9171a 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIPenetrateTeleport.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIPenetrateTeleport.java @@ -19,7 +19,7 @@ public class AIPenetrateTeleport extends BaseSkill { private float maxDistance; public AIPenetrateTeleport(EntityLivingBase speller,float exp) { - super(speller,(int)lerpf(200, 100, exp), exp,PenetrateTeleport.getFullName()); + super(speller,(int)lerpf(200, 100, exp), exp,"penetrate_teleport"); maxDistance=lerpf(3,10, getSkillExp()); } diff --git a/src/main/java/cn/paindar/academymonster/ability/AIRailgun.java b/src/main/java/cn/paindar/academymonster/ability/AIRailgun.java index 02b4dca..da83fc8 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIRailgun.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIRailgun.java @@ -47,7 +47,7 @@ public class AIRailgun extends BaseSkill private EntityCoinThrowingNative coin; public AIRailgun(EntityLivingBase speller, float exp) { - super(speller, (int)lerpf(800, 600, exp), exp,Railgun.getFullName()); + super(speller, (int)lerpf(800, 600, exp), exp,"railgun"); maxIncrement=(int)lerpf(12,25,exp); damage=lerpf(20, 50, exp); } diff --git a/src/main/java/cn/paindar/academymonster/ability/AIThunderClap.java b/src/main/java/cn/paindar/academymonster/ability/AIThunderClap.java index 2c55fbc..759b042 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIThunderClap.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIThunderClap.java @@ -21,7 +21,7 @@ public class AIThunderClap extends BaseSkill private float distance=15; public AIThunderClap(EntityLivingBase speller, float exp) { - super(speller,(int) lerpf(600,300,exp), exp, ThunderClap.getFullName()); + super(speller,(int) lerpf(600,300,exp), exp,"thunder_clap"); damage=lerpf(18,120,exp); range=lerpf(10,25,exp); } From a9b11e1c5951a4e8de940113178503651c5f56c8 Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Sat, 4 Mar 2017 16:39:12 +0800 Subject: [PATCH 02/17] =?UTF-8?q?=E3=80=90S11N=E5=BC=82=E5=B8=B8=E3=80=91?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BC=82=E5=B8=B8=E7=9A=84=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/paindar/academymonster/ability/AIArcGen.java | 2 +- .../java/cn/paindar/academymonster/ability/AIBodyIntensify.java | 2 +- .../java/cn/paindar/academymonster/ability/AIDirectedShock.java | 2 +- .../java/cn/paindar/academymonster/ability/AIElectronBomb.java | 2 +- .../java/cn/paindar/academymonster/ability/AIFleshRipping.java | 2 +- .../java/cn/paindar/academymonster/ability/AILightShield.java | 2 +- .../cn/paindar/academymonster/ability/AIPenetrateTeleport.java | 2 +- src/main/java/cn/paindar/academymonster/ability/AIRailgun.java | 2 +- .../java/cn/paindar/academymonster/ability/AIThunderClap.java | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/cn/paindar/academymonster/ability/AIArcGen.java b/src/main/java/cn/paindar/academymonster/ability/AIArcGen.java index 3088451..6b03bcb 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIArcGen.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIArcGen.java @@ -34,7 +34,7 @@ public class AIArcGen extends BaseSkill private float slowdown; public AIArcGen(EntityLivingBase speller, float exp) { - super(speller, (int)lerpf(40,20,exp), exp,"arc_gen"); + super(speller, (int)lerpf(40,20,exp), exp,"electromaster.arc_gen"); damage=lerpf(5,9,exp); range=lerpf(6,15,exp); prob=lerpf(0,0.6f,exp); diff --git a/src/main/java/cn/paindar/academymonster/ability/AIBodyIntensify.java b/src/main/java/cn/paindar/academymonster/ability/AIBodyIntensify.java index 749f052..4fa0a6b 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIBodyIntensify.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIBodyIntensify.java @@ -15,7 +15,7 @@ public class AIBodyIntensify extends BaseSkill { public AIBodyIntensify(EntityLivingBase speller, float exp) { - super(speller, (int)lerpf(300, 100,exp), exp,"body_intensify"); + super(speller, (int)lerpf(300, 100,exp), exp,"electromaster.body_intensify"); } diff --git a/src/main/java/cn/paindar/academymonster/ability/AIDirectedShock.java b/src/main/java/cn/paindar/academymonster/ability/AIDirectedShock.java index 2086275..eff2152 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIDirectedShock.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIDirectedShock.java @@ -25,7 +25,7 @@ public class AIDirectedShock extends BaseSkill private float damage; public AIDirectedShock(EntityLivingBase speller, float exp) { - super(speller, (int)lerpf(60, 20, exp), exp,"dir_shock"); + super(speller, (int)lerpf(60, 20, exp), exp,"vecmanip.dir_shock"); damage=lerpf(7, 15,exp); } diff --git a/src/main/java/cn/paindar/academymonster/ability/AIElectronBomb.java b/src/main/java/cn/paindar/academymonster/ability/AIElectronBomb.java index 79106f6..0b22ad1 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIElectronBomb.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIElectronBomb.java @@ -27,7 +27,7 @@ public class AIElectronBomb extends BaseSkill private float damage; public AIElectronBomb(EntityLivingBase speller,float exp) { - super(speller,(int)lerpf(40,10, exp), exp,"electron_bomb"); + super(speller,(int)lerpf(40,10, exp), exp,"meltdowner.electron_bomb"); damage=lerpf(6, 12, exp); maxDistance=lerpf(7,15,exp); } diff --git a/src/main/java/cn/paindar/academymonster/ability/AIFleshRipping.java b/src/main/java/cn/paindar/academymonster/ability/AIFleshRipping.java index 32af7cc..adba028 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIFleshRipping.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIFleshRipping.java @@ -23,7 +23,7 @@ public class AIFleshRipping extends BaseSkill private float damage; public AIFleshRipping(EntityLivingBase speller, float skillExp) { - super(speller, (int)lerpf(90, 40, skillExp), skillExp,"flesh_ripping"); + super(speller, (int)lerpf(90, 40, skillExp), skillExp,"teleporter.flesh_ripping"); maxDistance=lerpf(2, 5, skillExp); damage=lerpf(5, 12, skillExp); } diff --git a/src/main/java/cn/paindar/academymonster/ability/AILightShield.java b/src/main/java/cn/paindar/academymonster/ability/AILightShield.java index ee344ba..ad2c292 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AILightShield.java +++ b/src/main/java/cn/paindar/academymonster/ability/AILightShield.java @@ -32,7 +32,7 @@ public class AILightShield extends BaseSkill public AILightShield(EntityLivingBase speller, float exp) { - super(speller, (int)lerpf(100,40,exp), exp, "light_shield"); + super(speller, (int)lerpf(100,40,exp), exp, "meltdowner.light_shield"); maxTime=(int)lerpf(100,300,exp); touchDamage=lerpf(2, 6, exp); absorbDamage=lerpf(150,300,exp); diff --git a/src/main/java/cn/paindar/academymonster/ability/AIPenetrateTeleport.java b/src/main/java/cn/paindar/academymonster/ability/AIPenetrateTeleport.java index ed9171a..091d001 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIPenetrateTeleport.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIPenetrateTeleport.java @@ -19,7 +19,7 @@ public class AIPenetrateTeleport extends BaseSkill { private float maxDistance; public AIPenetrateTeleport(EntityLivingBase speller,float exp) { - super(speller,(int)lerpf(200, 100, exp), exp,"penetrate_teleport"); + super(speller,(int)lerpf(200, 100, exp), exp,"teleporter.penetrate_teleport"); maxDistance=lerpf(3,10, getSkillExp()); } diff --git a/src/main/java/cn/paindar/academymonster/ability/AIRailgun.java b/src/main/java/cn/paindar/academymonster/ability/AIRailgun.java index da83fc8..932858c 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIRailgun.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIRailgun.java @@ -47,7 +47,7 @@ public class AIRailgun extends BaseSkill private EntityCoinThrowingNative coin; public AIRailgun(EntityLivingBase speller, float exp) { - super(speller, (int)lerpf(800, 600, exp), exp,"railgun"); + super(speller, (int)lerpf(800, 600, exp), exp,"electromaster.railgun"); maxIncrement=(int)lerpf(12,25,exp); damage=lerpf(20, 50, exp); } diff --git a/src/main/java/cn/paindar/academymonster/ability/AIThunderClap.java b/src/main/java/cn/paindar/academymonster/ability/AIThunderClap.java index 759b042..5f173db 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIThunderClap.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIThunderClap.java @@ -21,7 +21,7 @@ public class AIThunderClap extends BaseSkill private float distance=15; public AIThunderClap(EntityLivingBase speller, float exp) { - super(speller,(int) lerpf(600,300,exp), exp,"thunder_clap"); + super(speller,(int) lerpf(600,300,exp), exp,"electromaster.thunder_clap"); damage=lerpf(18,120,exp); range=lerpf(10,25,exp); } From 042220c53b5ade242b962db4b524cbcc6912124e Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Tue, 7 Mar 2017 21:23:25 +0800 Subject: [PATCH 03/17] =?UTF-8?q?=E3=80=90=E9=9B=B7=E5=87=BB=E4=B9=8B?= =?UTF-8?q?=E6=9E=AA=E3=80=91=E6=B7=BB=E5=8A=A0=E9=9B=B7=E5=87=BB=E4=B9=8B?= =?UTF-8?q?=E6=9E=AA=E6=8A=80=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../academymonster/ability/AIThunderBolt.java | 118 ++++++++++++++++++ .../academymonster/core/AcademyMonster.java | 4 +- .../entity/ai/EntityAIThunderBlot.java | 72 +++++++++++ .../network/MessageThunderBolt.java | 71 +++++++++++ .../network/NetworkManager.java | 15 +++ 5 files changed, 279 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/paindar/academymonster/ability/AIThunderBolt.java create mode 100644 src/main/java/cn/paindar/academymonster/entity/ai/EntityAIThunderBlot.java create mode 100644 src/main/java/cn/paindar/academymonster/network/MessageThunderBolt.java diff --git a/src/main/java/cn/paindar/academymonster/ability/AIThunderBolt.java b/src/main/java/cn/paindar/academymonster/ability/AIThunderBolt.java new file mode 100644 index 0000000..8be41de --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/ability/AIThunderBolt.java @@ -0,0 +1,118 @@ +package cn.paindar.academymonster.ability; + +import cn.academy.core.client.sound.ACSounds; +import cn.academy.vanilla.electromaster.client.effect.ArcPatterns; +import cn.academy.vanilla.electromaster.entity.EntityArc; +import cn.lambdalib.util.entityx.handlers.Life; +import cn.lambdalib.util.generic.RandUtils; +import cn.lambdalib.util.helper.Motion3D; +import cn.lambdalib.util.mc.EntitySelectors; +import cn.lambdalib.util.mc.Raytrace; +import cn.lambdalib.util.mc.WorldUtils; +import cn.paindar.academymonster.entity.EntityArcNative; +import cn.paindar.academymonster.network.NetworkManager; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; + +import java.util.List; +import java.util.function.Predicate; + +import static cn.lambdalib.util.generic.MathUtils.lerpf; + +/** + * Created by Paindar on 2017/3/7. + */ +public class AIThunderBolt extends BaseSkill +{ + private float aoeDamage; + private float damage; + private static float range=20f; + private static float aoeRange=7f; + + public AIThunderBolt(EntityLivingBase speller, float exp) + { + super(speller, (int)lerpf(200,100,exp), exp, "electromaster.thunder_bolt"); + aoeDamage = lerpf(9.6f, 17.4f, exp); + damage = lerpf(16f, 29f, exp); + } + + public void spell() + { + MovingObjectPosition result = Raytrace.traceLiving(speller, range); + Vec3 end; + if(result == null) { + end = new Motion3D(speller).move(range).getPosVec(); + } else { + end = result.hitVec; + if(result.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) { + end.yCoord += result.entityHit.getEyeHeight(); + } + } + + boolean hitEntity = !(result == null || result.entityHit == null); + Predicate exclusion= (hitEntity)? EntitySelectors.exclude(speller) : EntitySelectors.exclude(speller, result.entityHit); + EntityLivingBase target = (hitEntity)? (EntityLivingBase)result.entityHit : null; + List aoes = WorldUtils.getEntities( + speller.worldObj, end.xCoord, end.yCoord, end.zCoord, + aoeRange, EntitySelectors.living().and(exclusion)); + + + if(target != null) + { + attack(target, damage); + if(getSkillExp() > 0.2 && RandUtils.ranged(0, 1) < 0.8 ) { + target.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 40, 3)); + } + } + + for(Entity e:aoes) + { + attack((EntityLivingBase) e, aoeDamage); + + if (getSkillExp() > 0.2 && RandUtils.ranged(0, 1) < 0.8) + { + ((EntityLivingBase)e).addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 20, 3)); + } + } + List list= WorldUtils.getEntities(speller, 40, EntitySelectors.player()); + for(Entity e:list) + { + NetworkManager.sendThunderBoltTo(speller,target,aoes,(EntityPlayerMP)e); + } + + super.spell(); + } + + public float getMaxDistance(){return range;} + + @SideOnly(Side.CLIENT) + public static void spawnEffect(EntityLivingBase ori,EntityLivingBase target,List aoes) + { + for(int i= 0 ;i<2;i++) + { + EntityArcNative mainArc = new EntityArcNative(ori, ArcPatterns.strongArc); + mainArc.length = range; + ori.worldObj.spawnEntityInWorld(mainArc); + mainArc.addMotionHandler(new Life(20)); + } + + for(Entity e:aoes) + { + EntityArcNative aoeArc = new EntityArcNative(ori, ArcPatterns.aoeArc); + aoeArc.lengthFixed = false; + aoeArc.setFromTo(target.posX, target.posY,target.posZ, + e.posX, e.posY + e.getEyeHeight(), e.posZ); + aoeArc.addMotionHandler(new Life(RandUtils.rangei(15, 25))); + ori.worldObj.spawnEntityInWorld(aoeArc); + } + + ACSounds.playClient(ori, "em.arc_strong", 0.6f); + } +} diff --git a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java index cf3483b..842d297 100644 --- a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java +++ b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java @@ -16,6 +16,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IEntityOwnable; import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.entity.boss.IBossDisplayData; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.monster.IMob; import net.minecraftforge.common.config.Configuration; @@ -71,10 +72,11 @@ void initSkill() registerSkill(AIDirectedShock.class, 2,EntityAIDirectedShock.class,5); registerSkill(AIElectronBomb.class, 1,EntityAIElectronBomb.class,5); registerSkill(AIFleshRipping.class, 1,EntityAIFleshRipping.class,5); - registerSkill(AILightShield.class,70f,EntityAILightShield.class,5); + registerSkill(AILightShield.class,1f,EntityAILightShield.class,5); registerSkill(AIMineRay.class,0.7f,EntityAIMineRay.class,5); registerSkill(AIPenetrateTeleport.class, 2,EntityAIPenetrateTeleport.class,4); registerSkill(AIRailgun.class, 0.3f,EntityAIRailgun.class,5); + registerSkill(AIThunderBolt.class,70f,EntityAIThunderBlot.class,5); registerSkill(AIThunderClap.class,0.4f,EntityAIThunderClap.class,5); } diff --git a/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIThunderBlot.java b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIThunderBlot.java new file mode 100644 index 0000000..0a09b18 --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIThunderBlot.java @@ -0,0 +1,72 @@ +package cn.paindar.academymonster.entity.ai; + +import cn.lambdalib.util.mc.BlockSelectors; +import cn.lambdalib.util.mc.EntitySelectors; +import cn.lambdalib.util.mc.Raytrace; +import cn.paindar.academymonster.ability.AIThunderBolt; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.util.MovingObjectPosition; + +/** + * Created by Paindar on 2017/3/7. + */ +public class EntityAIThunderBlot extends EntityAIBase +{ + private final EntityLiving speller; + private EntityLivingBase target; + private AIThunderBolt skill; + + public EntityAIThunderBlot(EntityLiving speller,AIThunderBolt skill) + { + this.speller=speller; + this.skill=skill; + } + + /** + * Returns whether the EntityAIBase should begin execution. + */ + @Override + public boolean shouldExecute() { + EntityLivingBase target=speller.getAttackTarget(); + if (target==null||skill.isSkillInCooldown()) + return false; + double dist=speller.getDistanceSqToEntity(target); + return !skill.isSkillInCooldown() && dist >= 2.25 && dist <= skill.getMaxDistance() * skill.getMaxDistance(); + } + + + /** + * Execute a one shot task or start executing a continuous task + */ + public void startExecuting() + { + this.target =this.speller.getAttackTarget(); + } + + /** + * Resets the task + */ + public void resetTask() + { + this.target = null; + } + + /** + * Update the task. + */ + public void updateTask(){ + if (target!=null ) { + MovingObjectPosition trace = Raytrace.traceLiving(speller,skill.getMaxDistance(), EntitySelectors.living(), BlockSelectors.filNothing); + if (trace != null && trace.typeOfHit== MovingObjectPosition.MovingObjectType.ENTITY) + { + if(trace.entityHit==target) + { + skill.spell(); + } + } + } + } +} diff --git a/src/main/java/cn/paindar/academymonster/network/MessageThunderBolt.java b/src/main/java/cn/paindar/academymonster/network/MessageThunderBolt.java new file mode 100644 index 0000000..38c6522 --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/network/MessageThunderBolt.java @@ -0,0 +1,71 @@ +package cn.paindar.academymonster.network; + +import cn.paindar.academymonster.ability.AIThunderBolt; +import cpw.mods.fml.common.network.ByteBufUtils; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Paindar on 2017/3/7. + */ +public class MessageThunderBolt implements IMessage +{ + public static class Handler implements IMessageHandler + { + @Override + @SideOnly(Side.CLIENT) + public IMessage onMessage(MessageThunderBolt msg, MessageContext ctx) + { + EntityLivingBase ori=(EntityLivingBase) Minecraft.getMinecraft().theWorld.getEntityByID(msg.nbt.getInteger("origin")); + EntityLivingBase target=(EntityLivingBase) Minecraft.getMinecraft().theWorld.getEntityByID(msg.nbt.getInteger("target")); + List aoes=new ArrayList<>(); + int list[]=msg.nbt.getIntArray("list"); + for(int i:list) + { + aoes.add( Minecraft.getMinecraft().theWorld.getEntityByID(i)); + } + AIThunderBolt.spawnEffect(ori,target,aoes); + return null; + } + } + + NBTTagCompound nbt=new NBTTagCompound(); + + public MessageThunderBolt(){} + + public MessageThunderBolt(EntityLivingBase ori, EntityLivingBase target, List aoes) + { + int[] list=new int[aoes.size()]; + for(int i=0;i list, EntityPlayerMP player) + { + if(!player.getEntityWorld().isRemote) + { + MessageThunderBolt msg = new MessageThunderBolt(ori,target,list); + instance.sendTo(msg, player); + } + else + throw new IllegalStateException("Wrong context side!"); + } } From ba59c2869f09bf0db9c4cc2ac95d51d62baf717b Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Thu, 9 Mar 2017 20:16:04 +0800 Subject: [PATCH 04/17] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9EBOSS=E3=80=91?= =?UTF-8?q?=E6=96=B0=E5=A2=9EBOSS=EF=BC=9A=E8=87=AA=E7=A7=B0=E7=9A=84?= =?UTF-8?q?=E8=B6=85=E7=94=B5=E7=A3=81=E7=82=AE=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../academymonster/ability/BaseSkill.java | 3 +- .../academymonster/core/AcademyMonster.java | 21 +- .../academymonster/core/ClientProxy.java | 2 + .../core/GlobalEventHandle.java | 31 ++- .../support/terminal/ui/BossHealthBar.java | 194 ++++++++++++++++++ .../academymonster/entity/EntityLoader.java | 13 +- .../entity/ai/EntityAIFakeRailgunAttack.java | 104 ++++++++++ .../entity/boss/EntityFakeRaingun.java | 114 ++++++++++ .../entity/boss/render/RenderFakeRailgun.java | 78 +++++++ .../assets/academymonster/lang/en_US.lang | 4 +- .../assets/academymonster/lang/zh_CN.lang | 4 +- .../academymonster/textures/gui/hp_bar.png | Bin 0 -> 20453 bytes 12 files changed, 551 insertions(+), 17 deletions(-) create mode 100644 src/main/java/cn/paindar/academymonster/core/support/terminal/ui/BossHealthBar.java create mode 100644 src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFakeRailgunAttack.java create mode 100644 src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java create mode 100644 src/main/java/cn/paindar/academymonster/entity/boss/render/RenderFakeRailgun.java create mode 100644 src/main/resources/assets/academymonster/textures/gui/hp_bar.png diff --git a/src/main/java/cn/paindar/academymonster/ability/BaseSkill.java b/src/main/java/cn/paindar/academymonster/ability/BaseSkill.java index 5e7a5c3..fe51560 100644 --- a/src/main/java/cn/paindar/academymonster/ability/BaseSkill.java +++ b/src/main/java/cn/paindar/academymonster/ability/BaseSkill.java @@ -30,7 +30,7 @@ public BaseSkill(EntityLivingBase speller,int maxCooldown,float abilityExp,Strin FMLCommonHandler.instance().bus().register(this); } - float getSkillExp(){return skillExp;} + public float getSkillExp(){return skillExp;} protected int getMaxCooldown(){return maxCooldown;} @@ -88,5 +88,4 @@ public boolean available() public String getUnlocalizedSkillName(){return "ac.ability." + skillName + ".name";} public String getSkillName(){return StatCollector.translateToLocal(skillName);} - } diff --git a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java index 842d297..7e2a33a 100644 --- a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java +++ b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java @@ -113,7 +113,7 @@ public void serverStopping(FMLServerStoppingEvent event) public void addSkill(EntityLiving entity) { - if(entity.worldObj.isRemote ||!isClassAllowed(entity)) + if(entity.worldObj.isRemote) return; List> tempList= new ArrayList<>(skillList); List tempProbList=new ArrayList<>(probList); @@ -236,7 +236,16 @@ public void refreshSkills(EntityLiving entity,String skillStr) Class aClass; Constructor[] tempConstructor; Class[] parameterTypes; - float randExp=Float.parseFloat(skillInfo[1]); + float randExp=0; + try + { + randExp=Float.parseFloat(skillInfo[1]); + } + catch(NumberFormatException e) + { + System.out.println("Failed to translate "+entity + " in "+skillStr); + e.printStackTrace(); + } int id=skillList.indexOf(skillClass); try { @@ -278,7 +287,7 @@ public void refreshSkills(EntityLiving entity,String skillStr) } - private boolean isClassAllowed(EntityLiving entity) + static boolean isClassAllowed(EntityLiving entity) { if (entity instanceof EntityMob || (entity instanceof IMob)) { @@ -286,7 +295,7 @@ private boolean isClassAllowed(EntityLiving entity) { return false; } - if (checkEntityClassAllowed(entity)) + if (!checkEntityClassAllowed(entity)) { return true; } @@ -294,9 +303,9 @@ private boolean isClassAllowed(EntityLiving entity) return false; } - private boolean checkEntityClassAllowed(EntityLiving entity) + private static boolean checkEntityClassAllowed(EntityLiving entity) { - return entity instanceof EntityMob; + return entity instanceof IBossDisplayData; } diff --git a/src/main/java/cn/paindar/academymonster/core/ClientProxy.java b/src/main/java/cn/paindar/academymonster/core/ClientProxy.java index 509d21c..f576948 100644 --- a/src/main/java/cn/paindar/academymonster/core/ClientProxy.java +++ b/src/main/java/cn/paindar/academymonster/core/ClientProxy.java @@ -1,6 +1,7 @@ package cn.paindar.academymonster.core; import cn.paindar.academymonster.core.support.terminal.ui.AIMScannerUI; +import cn.paindar.academymonster.core.support.terminal.ui.BossHealthBar; import cn.paindar.academymonster.entity.EntityLoader; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.common.event.FMLInitializationEvent; @@ -17,6 +18,7 @@ public class ClientProxy extends CommonProxy public void preInit(FMLPreInitializationEvent event) { super.preInit(event); + BossHealthBar.preInit(); EntityLoader.registerRenders(); } diff --git a/src/main/java/cn/paindar/academymonster/core/GlobalEventHandle.java b/src/main/java/cn/paindar/academymonster/core/GlobalEventHandle.java index a01f723..0e4744f 100644 --- a/src/main/java/cn/paindar/academymonster/core/GlobalEventHandle.java +++ b/src/main/java/cn/paindar/academymonster/core/GlobalEventHandle.java @@ -1,13 +1,20 @@ package cn.paindar.academymonster.core; +import cn.paindar.academymonster.ability.BaseSkill; +import cn.paindar.academymonster.core.support.terminal.ui.BossHealthBar; import cn.paindar.academymonster.entity.SkillExtendedEntityProperties; +import cn.paindar.academymonster.entity.boss.EntityFakeRaingun; import cn.paindar.academymonster.network.NetworkManager; import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityTracker; +import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.world.WorldServer; +import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.event.entity.EntityEvent; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.player.PlayerEvent; @@ -31,12 +38,23 @@ public void onEntityConstruct(EntityEvent.EntityConstructing event) @SubscribeEvent public void onEntityJoinedWorld(EntityJoinWorldEvent event) { - if(!event.world.isRemote && event.entity instanceof EntityLiving) + if(!event.world.isRemote && event.entity instanceof EntityLiving && event.entity instanceof EntityMob) { SkillExtendedEntityProperties data = SkillExtendedEntityProperties.get(event.entity); String savedSkills=data.getSkillData(); - //AcademyMonster.log.info("entity "+event.entity+" have skills:"+savedSkills); - if(savedSkills.equals("")) + if(event.entity instanceof EntityFakeRaingun) + { + String string=""; + if(data.getSkillData().equals("")) + { + for (BaseSkill skill : ((EntityFakeRaingun) event.entity).skillList) + { + string += skill.getUnlocalizedSkillName() + "~" + skill.getSkillExp() + "-"; + } + data.setSkillData(string); + } + } + else if(savedSkills.equals("")) { AcademyMonster.instance.addSkill((EntityLiving)event.entity); } @@ -66,4 +84,11 @@ public void playerStartedTracking(PlayerEvent.StartTracking e) { } } + @SubscribeEvent + @SideOnly(Side.CLIENT) + public void onPreRenderGameOverlay(RenderGameOverlayEvent.Pre event) + { + BossHealthBar.flushHealthBar(event); + } + } diff --git a/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/BossHealthBar.java b/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/BossHealthBar.java new file mode 100644 index 0000000..584e811 --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/BossHealthBar.java @@ -0,0 +1,194 @@ +package cn.paindar.academymonster.core.support.terminal.ui; + +import cn.lambdalib.cgui.gui.CGui; +import cn.lambdalib.cgui.gui.Widget; +import cn.lambdalib.cgui.gui.WidgetContainer; +import cn.lambdalib.cgui.gui.component.DrawTexture; +import cn.lambdalib.cgui.gui.component.TextBox; +import cn.lambdalib.util.client.auxgui.AuxGui; +import cn.lambdalib.util.client.auxgui.AuxGuiHandler; +import cn.lambdalib.util.client.font.IFont; +import cn.lambdalib.util.helper.Color; +import cn.lambdalib.util.helper.GameTimer; +import cn.lambdalib.util.mc.WorldUtils; +import cn.paindar.academymonster.core.AcademyMonster; +import cn.paindar.academymonster.entity.boss.EntityFakeRaingun; +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityClientPlayerMP; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.entity.Entity; +import net.minecraft.entity.boss.IBossDisplayData; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.glu.GLU; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; + +/** + * Created by Paindar on 2017/3/8. + */ +@SideOnly(Side.CLIENT) +public class BossHealthBar extends AuxGui +{ + private static int ticks=0; + private static float flushRange=20f; + private static Minecraft mc; + private static WidgetContainer loaded ; + private static List existedList=new ArrayList<>(); + private static AuxGui current = null; + private static List list=new ArrayList<>(); + private static Widget healWidget; + + public static void preInit() + { + mc = FMLClientHandler.instance().getClient(); + loaded=new WidgetContainer(); + Widget board=new Widget().size(1200,400); + loaded.addWidget("backBroad",board,true); + Widget skillList=new Widget(550,-430,1000,125); + healWidget=new Widget(700,70) .addComponent(new TextBox( + new IFont.FontOption(50, IFont.FontAlign.CENTER,new Color(1,1,1,0.6))).setContent("A Test Skill")); + + Widget healBar= new Widget(700,70).pos(30,60).addComponent(new TextBox(new IFont.FontOption(40, IFont.FontAlign.CENTER,new Color(1,1,1,0.6))).setContent("A Test Health")); + Widget barTextures=new Widget(700,70).pos(0,10).addComponent(new DrawTexture(new ResourceLocation("academymonster:textures/gui/hp_bar.png")).setColor(new Color(1,1,1,0.6))); + healBar.addWidget("textures",barTextures); + healWidget.addWidget("heal_bar",healBar); + skillList.addWidget("skillItem",healWidget); + board.addWidget("skill",skillList); + } + + CGui gui; + Widget root; + + BossHealthBar() + { + gui = new CGui(); + gui.addWidget(root = loaded.getWidget("backBroad").copy()); + requireTicking=true; + + initGui(); + } + + private void initGui() + { + Widget skillPart=root.getWidget("skill"); + skillPart.removeWidget("skillItem"); + } + + @Override + public void tick() + { + EntityClientPlayerMP player=mc.thePlayer; + if(player == null || list == null) + return ; + for(Widget widget:existedList) + { + widget.dispose(); + } + existedList.clear(); + Widget widget = root.getWidget("skill"); + int i=0; + for(IBossDisplayData entity:list) + { + Widget w=healWidget.copy().pos(30,30+150*i); + w.getComponent(TextBox.class).setContent(((Entity)entity).getCommandSenderName()); + float per=entity.getHealth()/entity.getMaxHealth(); + Widget healBar=w.getWidget("heal_bar"); + healBar.getComponent(TextBox.class).setContent(String.format("%.2f/%.2f",entity.getHealth(),entity.getMaxHealth())); + healBar.getWidget("textures").size(700*per,50); + i++; + existedList.add(w); + widget.addWidget(w); + } + + } + + private static void createNewHealthBar(List list) + { + for(Widget widget:existedList) + widget.dispose(); + for(Entity e:list) + { + AcademyMonster.log.info("Boss: "+list); + } + } + + public static void flushHealthBar(RenderGameOverlayEvent.Pre event) + { + List tmpList=WorldUtils.getEntities(mc.thePlayer, flushRange, (Entity entity) -> (!entity.isDead && entity instanceof IBossDisplayData)); + list.clear(); + for(Entity entity:tmpList) + { + if(entity instanceof IBossDisplayData) + { + list.add((IBossDisplayData)entity); + } + } + if (current == null && list.size() != 0) + { + current = new BossHealthBar(); + AuxGuiHandler.register(current); + } + else if (current != null && list.size() == 0) + { + current.dispose(); + current=null; + } + + } + + @Override + public boolean isForeground() + { + return false; + } + + @Override + public void draw(ScaledResolution scaledResolution) + { + float aspect = (float)mc.displayWidth / mc.displayHeight; + + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glPushMatrix(); + GL11.glLoadIdentity(); + + GLU.gluPerspective(50, + aspect, + 1f, 100); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glPushMatrix(); + GL11.glLoadIdentity(); + + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4d(1, 1, 1, 1); + + double scale = 1.0 / 310; + + GL11.glTranslated(-3, .5, -4); + + //GL11.glTranslated(1, -1.8, 0); + + GL11.glScaled(scale, -scale, scale); + gui.draw(); + + GL11.glPopMatrix(); + + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glPopMatrix(); + + GL11.glMatrixMode(GL11.GL_MODELVIEW); + + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glCullFace(GL11.GL_BACK); + } +} diff --git a/src/main/java/cn/paindar/academymonster/entity/EntityLoader.java b/src/main/java/cn/paindar/academymonster/entity/EntityLoader.java index 32e2a55..f4cef1c 100644 --- a/src/main/java/cn/paindar/academymonster/entity/EntityLoader.java +++ b/src/main/java/cn/paindar/academymonster/entity/EntityLoader.java @@ -1,11 +1,9 @@ package cn.paindar.academymonster.entity; -import cn.academy.vanilla.electromaster.client.renderer.RendererCoinThrowing; -import cn.academy.vanilla.meltdowner.client.render.RenderMdShield; import cn.academy.vanilla.meltdowner.entity.EntityMdBall; -import cn.academy.vanilla.meltdowner.entity.EntityMineRayBasic; -import cn.academy.vanilla.meltdowner.entity.EntityMineRayExpert; import cn.paindar.academymonster.core.AcademyMonster; +import cn.paindar.academymonster.entity.boss.EntityFakeRaingun; +import cn.paindar.academymonster.entity.boss.render.RenderFakeRailgun; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.relauncher.Side; @@ -36,6 +34,7 @@ public static void registerRenders() registerEntityRender(EntityArcNative.class,new EntityArcNative.Renderer()); registerEntityRender(EntityMineRayNative.class,new EntityMineRayNative.R()); registerEntityRender(EntityLightShield.class,new EntityLightShield.R()); + registerEntityRender(EntityFakeRaingun.class,new RenderFakeRailgun()); } public static void registerEntity() @@ -43,6 +42,12 @@ public static void registerEntity() registerEntity(EntityMineRayNative.class,"am_mine_ray_eff",15,1,true); registerEntity(EntityLightShield.class,"am_light_shield_eff",15,1,true); registerEntity(EntityCoinThrowingNative.class,"am_coin_throwing_eff",15,1,true); + registerEntity(EntityFakeRaingun.class,"am_fake_railgun",40,1,true); + for(BiomeGenBase biome:BiomeGenBase.getBiomeGenArray()) + { + if(biome != null && biome != BiomeGenBase.sky && biome !=BiomeGenBase.hell) + registerEntitySpawn(EntityFakeRaingun.class,100,1,1,EnumCreatureType.monster,biome); + } } @SideOnly(Side.CLIENT) diff --git a/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFakeRailgunAttack.java b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFakeRailgunAttack.java new file mode 100644 index 0000000..161f8cc --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFakeRailgunAttack.java @@ -0,0 +1,104 @@ +package cn.paindar.academymonster.entity.ai; + +import cn.lambdalib.util.generic.MathUtils; +import cn.lambdalib.util.mc.BlockSelectors; +import cn.lambdalib.util.mc.EntitySelectors; +import cn.lambdalib.util.mc.Raytrace; +import cn.paindar.academymonster.ability.*; +import cn.paindar.academymonster.entity.boss.EntityFakeRaingun; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; + +import java.util.List; + +/** + * Created by Paindar on 2017/3/8. + */ +public class EntityAIFakeRailgunAttack extends EntityAIBase +{ + private final EntityFakeRaingun speller; + private EntityLivingBase target; + private int tick=0; + + public EntityAIFakeRailgunAttack(EntityFakeRaingun speller) + { + this.speller=speller; + } + /** + * Returns whether the EntityAIBase should begin execution. + */ + @Override + public boolean shouldExecute() + { + if(speller.getAttackTarget()!=null) + { + target=speller.getAttackTarget(); + return true; + } + return false; + } + + @Override + public void updateTask() + { + List list=speller.skillList; + tick=(tick++)%10; + if(tick>=3) + return; + for(BaseSkill skill:list) + { + if(skill.available()) + { + MovingObjectPosition result= Raytrace.rayTraceBlocks(speller.worldObj, + Vec3.createVectorHelper(speller.posX, speller.posY, speller.posZ), + Vec3.createVectorHelper(target.posX, target.posY, target.posZ), BlockSelectors.filNormal); + if(skill instanceof AIThunderClap) + { + if(result==null) ((AIThunderClap)skill).spell(target.posX,target.posY,target.posZ); + } + else if(skill instanceof AIRailgun) + { + skill.spell(); + } + else if(skill instanceof AIThunderBolt) + { + MovingObjectPosition trace = Raytrace.traceLiving(speller,((AIThunderBolt)skill).getMaxDistance(), EntitySelectors.living(), BlockSelectors.filNothing); + if (trace != null && trace.typeOfHit== MovingObjectPosition.MovingObjectType.ENTITY) + { + if(trace.entityHit==target) + { + skill.spell(); + } + } + } + else if(skill instanceof AIBodyIntensify) + { + skill.spell(); + } + else if (skill instanceof AIArcGen) + { + if (result != null && result.typeOfHit== MovingObjectPosition.MovingObjectType.ENTITY) + { + if(result.entityHit==target) + { + skill.spell(); + } + } + else if (result != null && result.typeOfHit== MovingObjectPosition.MovingObjectType.BLOCK) + { + Block block=speller.worldObj.getBlock(result.blockX,result.blockY,result.blockZ); + if(block.getMaterial()== Material.wood) + { + skill.spell(); + } + } + } + break; + } + } + } +} diff --git a/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java b/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java new file mode 100644 index 0000000..ed7b578 --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java @@ -0,0 +1,114 @@ +package cn.paindar.academymonster.entity.boss; + +import cn.academy.ability.ModuleAbility; +import cn.academy.ability.item.ItemInductionFactor; +import cn.academy.crafting.ModuleCrafting; +import cn.academy.vanilla.ModuleVanilla; +import cn.lambdalib.util.generic.RandUtils; +import cn.paindar.academymonster.ability.*; +import cn.paindar.academymonster.entity.SkillExtendedEntityProperties; +import cn.paindar.academymonster.entity.ai.EntityAIFakeRailgunAttack; +import net.minecraft.entity.Entity; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.*; +import net.minecraft.entity.boss.IBossDisplayData; +import net.minecraft.entity.monster.EntityMob; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.stats.AchievementList; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeModContainer; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Created by Paindar on 2017/3/7. + */ +public class EntityFakeRaingun extends EntityMob implements IBossDisplayData +{ + public List skillList=new ArrayList<>(); + public EntityFakeRaingun(World p_i1738_1_) + { + super(p_i1738_1_); + this.setHealth(this.getMaxHealth()); + this.getNavigator().setCanSwim(true); + this.tasks.addTask(0, new EntityAISwimming(this)); + this.tasks.addTask(4, new EntityAIFakeRailgunAttack(this)); + this.tasks.addTask(5, new EntityAIWander(this, 1.0D)); + this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); + this.tasks.addTask(7, new EntityAILookIdle(this)); + this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); + this.targetTasks.addTask(2, new EntityAIHurtByTarget(this, false)); + this.experienceValue = 50; + skillList.add(new AIThunderClap(this,0.5f+ RandUtils.rangef(0,0.5f))); + skillList.add(new AIRailgun(this,0.5f+ RandUtils.rangef(0,0.5f))); + skillList.add(new AIThunderBolt(this,0.5f+ RandUtils.rangef(0,0.5f))); + skillList.add(new AIBodyIntensify(this,0.5f+ RandUtils.rangef(0,0.5f))); + skillList.add(new AIArcGen(this,0.5f+ RandUtils.rangef(0,0.5f))); + } + + public void writeEntityToNBT(NBTTagCompound nbt) + { + super.writeEntityToNBT(nbt); + nbt.setFloat("ThunderClap",skillList.get(0).getSkillExp()); + nbt.setFloat("Railgun",skillList.get(1).getSkillExp()); + nbt.setFloat("ThunderBolt",skillList.get(2).getSkillExp()); + nbt.setFloat("BodyIntensify",skillList.get(3).getSkillExp()); + nbt.setFloat("ArcGen",skillList.get(4).getSkillExp()); + } + + + public void readEntityFromNBT(NBTTagCompound nbt) + { + super.readEntityFromNBT(nbt); + skillList.clear(); + skillList.add(new AIThunderClap(this,nbt.getFloat("ThunderClap"))); + skillList.add(new AIRailgun(this,nbt.getFloat("Railgun"))); + skillList.add(new AIThunderBolt(this,nbt.getFloat("ThunderBolt"))); + skillList.add(new AIBodyIntensify(this,nbt.getFloat("BodyIntensify"))); + skillList.add(new AIArcGen(this,nbt.getFloat("ArcGen"))); + } + + public int getTotalArmorValue() + { + return 4; + } + + /** + * Drop 0-2 items of this living's type. @param par1 - Whether this entity has recently been hit by a player. @param + * par2 - Level of Looting used to kill this mob. + */ + protected void dropFewItems(boolean p_70628_1_, int p_70628_2_) + { + this.dropItem(Items.iron_ingot, RandUtils.nextInt(5)); + this.dropItem(Item.getItemFromBlock(Blocks.iron_block), RandUtils.nextInt(2)); + this.dropItem(ModuleVanilla.coin,RandUtils.nextInt(5)+3); + if(RandUtils.nextFloat()<=1) + this.dropItem(ModuleAbility.inductionFactor.create(ModuleVanilla.electromaster).getItem(),1); + + } + + protected boolean isAIEnabled() + { + return true; + } + + protected void applyEntityAttributes() + { + super.applyEntityAttributes(); + this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(40.0D); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.50D); + this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(60); + } + + public void mountEntity(Entity p_70078_1_) + { + this.ridingEntity = null; + } +} diff --git a/src/main/java/cn/paindar/academymonster/entity/boss/render/RenderFakeRailgun.java b/src/main/java/cn/paindar/academymonster/entity/boss/render/RenderFakeRailgun.java new file mode 100644 index 0000000..9c5b9e3 --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/entity/boss/render/RenderFakeRailgun.java @@ -0,0 +1,78 @@ +package cn.paindar.academymonster.entity.boss.render; + +import cn.paindar.academymonster.entity.boss.EntityFakeRaingun; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +/** + * Created by Paindar on 2017/3/7. + */ +@SideOnly(Side.CLIENT) +public class RenderFakeRailgun extends RendererLivingEntity +{ + private static final ResourceLocation textures = new ResourceLocation("textures/entity/steve.png"); + public ModelBiped modelBipedMain; + public ModelBiped modelArmorChestplate; + public ModelBiped modelArmor; + + public RenderFakeRailgun() + { + super(new ModelBiped(0.0F), 0.5F); + this.modelBipedMain = (ModelBiped)this.mainModel; + this.modelArmorChestplate = new ModelBiped(1.0F); + this.modelArmor = new ModelBiped(0.5F); + } + + + public void doRender(EntityFakeRaingun entity, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) + { + GL11.glColor3f(1.0F, 1.0F, 1.0F); + + double d3 = p_76986_4_ - (double)entity.yOffset; + + super.doRender((EntityLivingBase)entity, p_76986_2_, d3, p_76986_6_, p_76986_8_, p_76986_9_); + this.modelArmorChestplate.aimedBow = this.modelArmor.aimedBow = this.modelBipedMain.aimedBow = false; + this.modelArmorChestplate.isSneak = this.modelArmor.isSneak = this.modelBipedMain.isSneak = false; + this.modelArmorChestplate.heldItemRight = this.modelArmor.heldItemRight = this.modelBipedMain.heldItemRight = 0; + } + + protected void preRenderCallback(EntityFakeRaingun entity, float partialTickTime) + { + float f1 = 0.9375F; + GL11.glScalef(f1, f1, f1); + } + + + protected void preRenderCallback(EntityLivingBase p_77041_1_, float p_77041_2_) + { + this.preRenderCallback((EntityFakeRaingun)p_77041_1_, p_77041_2_); + } + + public void doRender(EntityLivingBase p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) + { + this.doRender((EntityFakeRaingun)p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); + } + + public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) + { + this.doRender((EntityFakeRaingun)p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); + } + + /** + * Returns the location of an entity's texture. Doesn't seem to be called unless you call Render.bindEntityTexture. + * + * @param p_110775_1_ + */ + @Override + protected ResourceLocation getEntityTexture(Entity p_110775_1_) + { + return textures; + } +} diff --git a/src/main/resources/assets/academymonster/lang/en_US.lang b/src/main/resources/assets/academymonster/lang/en_US.lang index 923fed6..c27152c 100644 --- a/src/main/resources/assets/academymonster/lang/en_US.lang +++ b/src/main/resources/assets/academymonster/lang/en_US.lang @@ -3,4 +3,6 @@ am.app.aim_scanner_skill_list.name=Skill List: ac.settings.prop.open_aim_scanner=Open AIM Scanner am.aim_scanner_skill_list.notinstalled=You have not yet installed the AIM Scanner app. ac.app.aim_scanner.name=AIM Scanner -ac.ability.MineRay.name=Mine Ray \ No newline at end of file +ac.ability.MineRay.name=Mine Ray + +entity.academymonster.am_fake_railgun.name=Fake Railgun \ No newline at end of file diff --git a/src/main/resources/assets/academymonster/lang/zh_CN.lang b/src/main/resources/assets/academymonster/lang/zh_CN.lang index 987feb1..c822637 100644 --- a/src/main/resources/assets/academymonster/lang/zh_CN.lang +++ b/src/main/resources/assets/academymonster/lang/zh_CN.lang @@ -3,4 +3,6 @@ am.app.aim_scanner_skill_list.name=技能列表: ac.settings.prop.open_aim_scanner=开启AIM扫描仪 am.aim_scanner_skill_list.notinstalled=你还没有安装AIM扫描仪 ac.app.aim_scanner.name=AIM扫描仪 -ac.ability.MineRay.name=采矿光束 \ No newline at end of file +ac.ability.MineRay.name=采矿光束 + +entity.academy-monster.am_fake_railgun.name=自称的超电磁炮者 \ No newline at end of file diff --git a/src/main/resources/assets/academymonster/textures/gui/hp_bar.png b/src/main/resources/assets/academymonster/textures/gui/hp_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..d02385bda570d6c6a9c9f6f432cbfb27bb5f0b55 GIT binary patch literal 20453 zcmcG#Wm6qpw647fZowtECj@tQhlK=!yDi+^9Tu*^Ex5aTaCdiicjxfz+V45P;H{e7 zv#a_;&#vk@u6x{Lbf|)y1Tq310ssI&mXZ`z1OOm=Kd;^4U_Q@ofvGm16TGdYx&r`! zi1FV60Z2{91pp9a%|t{L6ijU#Z5&K(Y)PaVy6oYuV7m1_gC3}b3eZOEy zZbFfu?vHevK=%Ovmym9*-i}oQuMm|sfG+^sIeH58fvt~#76mF*07)!hlMMX;5h6wr zFi8J<5EC$n3#d}6H9`O+005S5p2B2+5@f*XtrR~rV6ixU6$h}GLr@F{h=c&7{E(pd zBG?MhQ}$D&{nFJ9$SxBkqlfCMfbdmsV3zpe+YSwIj#7(35!3_trU=uH0!TQ&07Qr| z#vn<6klBpWotwqFwn0sj5P+_cKVwNU(=3=xeQ#tA+J(s8K=iyJYD} zY2+A^2av#VBme;KY3koQr$EfX{_fU3=)m&gwlC-1;?jnUpY&?uy)EJk6aZCj;$m5M zZ*Lybb^xNvsneoZ6R@lTFx`04W?6yH)I2+wW(U z5G>L^%(AYp>Hi4Zx^TYe!-xtZQFQU53d8LB5+MA=O%(d}yNi1fs=f*mFB>g&3$^Ya z6DRV)Cc2j2i7gI{9&TngZd))sl+Yj?hCV4b7|kGRk!&0eCnXAsOka{U&Nq+b2#ooQ ztZ&dh?@O_;d91c1`8AzACRe1E;B(B%APIBWYgn5EQ-WX3FUZ+1PJ+!v#CT!-*$z{V ztSH*Pi8&Ticy&a4z708rQ!VrmvugC4H@k5HY<_H9V>TY{NY@HkD{L zLqatUXDs}#O#KTuiZ9{57^iSLfvDY<{xLBUYCtuSBFaxA0l|vwYA20y-8eDnBLh}-y$Aq7|fJ(H9&_?vNo89&7&870|9 zS?%ZjPfx7aVe~)Te^mZ>|2Zi6t?ZyIFy~f+_`6gYrBp}7t3X`2R$-?YeiplQu9#4{ zwV1tPT+u}_T4CasZf=L}oBy*Ra!qiMcy_R4?r+1!{%?__*!|4LS8BrZ_9~Dkv=+&- z2AVZbr$A@u7kp<151^8WLkXx16bs7Ow;O}_+F!kS$+eU&Jx)4~JnlgUNhd&8J#StP zD)%nuSax6TST;DbKf^vdS-x&A8*X;(l;~Z((ow)e_XQ;xuv0KVx{}b_9Pn zeE0QeZA#+K>NfWd=lEj&Vv3l9krj?T=9?uGr{U#jjNze0vRTvAW#Cp3+K6dOY_DnV zlvM8bCaUuglN~l!9DY!l4S_)!>$>r(1+Tt=8S_eBZ(iSS2lZHjMJlLes&2+{baaq* zwQR9$=roFJF5MzizhkLw(I-EUxAaOa-a|Ak3Hu0e>S%qK4P32Byp-gIC z>xA~iYF^b+0bex@DUCaAq@k!ht-RMc&1wU48#9`En)*)3dYS3;^%UVW^%Ule>t6q! z^4{uxf^d`oop7GVk;l{C(P`A#(zfj+Z;Q33xVO0HNYw=2>w~$e%sD^OouQnY-My*0j~~C9B!BQNBK}(id6!H2fj$9=;2q+sg;FZM)H( zjKZ|S?wgnc1|4S|b)A=XBKg{Ms?2#ttHG6C&CT`^4?S*vKI7-{BS`*!{x4bXSs@(- z9b_AP9pv8g-YMR&ubD4A&m(WqkDXg?*VtEb(0UO6Aod{I{qX#1AuS+@p;DmoVcDP~ zp<7`Xkod8Lk>HWliS6TUx^S-XpA1=6O=wf6u!i9>ur%TO(ji!t|5elp}W0{y?miN4qpx|Q(4k?Q-3Eq8dmJB z<}~B%AB~S>y6~#AsmFM71|_2>)d=hbkO(U<;L7h6TFVk*TnDBF$%}R5MCSaeZfug~ zjoZ&q`E$>?#^WXOY#J;t?$pl$FRw`B7W*x(nfyjpMRb0>Y+}i7iH<8FJs~|;5!o!U zj%IDnaO zE~zogvH^NOej-Qo$M$TGsZwaFs$FbyRlnLK>lACnCJ$G_aiM3@R%|hHHM^Yl8ZjNI zNqke-R#Q~IHg{XSj#3Pm&d(R2@mFR2Q=Bj~VqI~o(QJsN|HnxA!aQkCQ^n^e&L7<} z+p?mH$13rr{cTk_-8s)YH>>64b?L_8vlGdayc6rP2ldWM>2`CWxyj&5Sguxf zcGkdKDY8crNpjonrTN+{r=6v`)Z1$O{Ms$F_wV~gfv3lg!r|ZXp4FbQjTE28JGc`` zH=1egPNy=uT&rxpzwH-?5xE(JI)oA(jUV0@Ogn~718mW%nb{dX_^zII{o{8EjS4d} z~d=lQa zZ(EX;nl>lK4M<}7flx}8w2gcDL-BX-xY4Ao(%^IC*>db4?N#r86E;} zUMQ!tSU%MziJ_#T?56^y1OR*k0Dz~D&-n-daAE`ij`aWl?qmP}$0kmJfcd$}F% z_)N)6&az_wL&40_ogp_Z#XV-FEjSG&g!;c@YYBB0+MfjOe+OLk|GgvuqayzQaig1V zYmXf9gZN{iQ$d?n3nBSi>qq&^>93WaaQ^$r*-SEbe*0%~9|`orFUrpmmQfA^kDbUB zX+ri2)_nZLGF3#|(ciC`#!S*b*bSdL2;@}@?LE2ZpDmWJ+dRwA`t5lk+37*J;d<}?By86^S&l;4*yk0DlUVo9Wo7E60McQg`9DL3HOUgToz01g99>9 z&}C(t9KiB)=BPL4%4829SIsOrSD_Fq(#sBii0f>q=mF(5Q-!xb4W!7Hxz}M_V z&utJPx_#KmQuZd7-u!(I1UdxUT4RSchl+AXMKx)Vjt4D*;)1oDDa-tjpXiMr4rWhC z(MIhpN1bT%N@vN9atPL*{>3UJtNZd4dV)YqlV41}gs;MENcf^XaR*JNR=-C-K|>v# zqYYoY#t-t}e1zU=P$d=K>RTI3dDvpUttFOG8 zZ(0C4`fjiH8gb1)kFA_yEVVwo@{ThD^0^$cPG|;J)`9pd35VW<_yc$=8ilh|mMTGfPmHwiMaIG^37Q{nxo`)}^81pu66tjDT{Bubl>hcxONcyb z_~JL++rHO2c&TIQ=viwz4)k90G?t=o=S6%;hVT5|{=Q0WryQPQ>R!J%N*h>~3^LHx z`O*dYqNT$Pg*(yA+jJs60A)yZsr=UkiGO_I?-V2SPN>vBzWkPJ%s55?tZADgqGU?w zrP0#_n=YuGqab$K;AwA`+M^&^p84)$>fG84b!*#*sYJA_c?0llcMx_SU%s zD?n-dnIlVjZRH(xbs|)~G}&x?MVneYAYh*HNda`AntvXwnQN zWd%-yblLLn4ivl;=@YJ8_;x$l%apIW1p#g@B@GGLb5$WFbcE6c|uc9Si_V{03 z%u0NCm_3IS+ge1!|BE@ixc^>%qCfshvs_ouwl4MwS|N{(<|X3yXtVGxkLHm#Zx&X3 zvui)PnRf%dfRHpPZ#`ju#wSqgmnG8lwsE2AYzL;ZkfK zS?BR%1siilEu6H4;S}N#meZ%eJbc*Y)#!Dtmg)U6G7n-)2T=i|2EM*L+$@VbW(d%6 z9&Q-=sPt)%=LDQY6y1J@hraRp7VCp7W34M$thy^>?a_lIPfxcCmCyM`GHp*Mi#2t( z&ANBT>PxpRO_~E5;BJi08ixMJV_j_x`akq|`1OdgDfe*tHJHMIvxB?Mv(UVbK5mXD8*?So?mS0MCK7COGwJY6= z1Cj4G7syw7*gINUUevapvtHUuN<}sbClW}CaWph~`g@4=D$d__Df9&L3@I>4H0F$W z0^?(Efk7wSdzF=xs6LRmDp@PnnhZcDaqJ=FN=tyOS)Am33@P+j(p;5`N=%xy3Rm*S z(!9BY*1hJ;E0QM7eDGOOjDNM`m{`*)ScG_R1Z|7mSLG~?pvnARzCziLyeC=8>cT-Q zw36Iw-E*1S--&} zD`t?-&Tt@M6uBp4FNAt=WCN?=z8rU zmYotkQUL9gxWK`4%<)A)xTyCTPw93q5hqkrPAV6+lU?Lk zCE!iS5>A>^_lwm2d{pcU_5bZBUT6A>(tDT-0_*&;xEt#_S8XZ2Y&1I{i zFY-=5>b-2F;!$d2=lxG%nttl7qJ+r-c!ge#8H26Ah0i7X@XlvcHL0$C~3zF*3Izq=E?GpN+%ipUvc>-_EKEt-o$# zl_G+ZkHa$)N?5&yFpkxv9fGnf*I_nnNR>v4APTtr^2U)xn zWyS1Fb%Wzkl6}QyvrhVc_Hyx>K6}8| zbG#s>0fR5vz%n7?_)>J^4%}F!pWi?h_L$eiYL=_&0m)Oe=@Id0;9?QG)QP?DSQEg8 z6wj0`*%diWuMZFOD|q)`v4^Xtv|`?q}Ia7#>z!wWt)U& zoMw|)+(xQDJbwGP-~rl;I+Vkp4ANLHjkJpwUp=qXV$ZK2<%Ln|Zn2>VLZJ-VO!Xl< z(cujl$AU3gO*JJhW8slW=x+ZJm(yJ1h3x4=9Rf$UJVSQXie}%n=Ahr?2c+~y?m0?6 z4$`GLo>`-(S~-%cnjoqgFN0r!7DU^pGNT05r8UN=*f9|kv5PEB5S&b6Y2HlNr{{|< z1-k=8OffJXHj=r7&^N*gVTsCvNKa{C4iTEOPC)e)9vkfUg;TT<-J*N|0`Y_>FZ z7P)4fc;mg~D8{72=^th}oM}=x%*YyWa?}l6F)BkYm^DMr&9wHrbeIlj$@H0X?wg`` zGYd+rB+w@%9lifX3j{@CS9DF0u&q*SC6r&!FcrNDIiP3VErmTV!cztVvYT@|R5F4l znur%7j{e%Y3wQ*0e3g8jaykh3`m#M>{sOP*oC`GMx7ylirKnYd>M)N3)RG>&ZG=BN zQ_ZLcrk_lw02>!H(a+AIA!MfhAepS6NHQNxVC0Y|l1g+|Or>L>RhXN9*ps1Iuu~21 zX>t2&!rNS-G^7ajzzz!YC3YYm!a1=0seo!kE>ni%v4=#hDRp8mmwWFo^X}Rce@r5* z&9YO8{2oB6SpjQEYdyd)l$DBs^j%{Vvw{@t4%jj`#;-{+Z=skVM;syBzXMK+^3*rfv8g$qXC8O*U;= zM$NDar_w@h>iLe0nBY3xPr+Xz zWc7UVj$R3Y0x_ST#SghE!KA6p6b$1@p7tRU%9#;`NWbjVHv!-|uy1R=l?QZ6)WmFk zIB;(fuE2Z3lNNji^K9fE$TmS#R*+3Q%4MFzxsGg3{kpl8w@u@A zhaYVBHz}{)P$E_);XC%l+P~)T-?B0gt)kHlDTBj2_#EUN`7ze^N zCidwQ)W$XBYbmw|$FzgCRnqf_c2>t~{-Id4d)Gd4xwG+REG&VihR6pG$OjJTz`+9? zz@Tx^;ky7EWC)ls!9E;M;BV##fmZmPC%L!iGGZi?>Ym5fg1g)s%J&zumg5@Y4s$9C z7Dvl}(>+2IK&$EJT&BNVt`~-y4(Dz!fyePEXDZf}F1$5F_Xte$6N{rFo|gH0=ie5! z2AY-0)~ognvxylbO@9TK7d8CpnvUNu!44_wcZY8N(V5brYX41IXRE9Yw0#7}I^tw+ z%Lud3p{|_yXG2k9w*q*duuwyRew`#pRRT>a9 zO$R~gAG;*K*oLQ#xgC$DMAa_<@u~`_L8(qj`7b8CVHj*J1_+{r43Gla6uBDfwiX^e z$FCxJ2r=*~{V$y+5VuMmtdvQqsv7U<@_wHmb{wvTEW|-$*l3z9y$$`EsUc@kO^p(& zs>n^!1s!e@^qP++@6I6K{j^D*+a@p?PN7?|T-HM1c7keoo&EjmhKnEPG6rtK^D7J5 zeQ#!MOeSH>QLWfN>W$_E;Bbm;IpNb@8NI4M!GSO6-5HBH5`3!!wj*8r?!uy*p6~Va zignX=>M8;XkP@)7fX9P&)J*Xu=v0o*$2e;~(@;eEVwoFFRndh~6k zBUV?76YKXW)3pp8A^U41^K&jGu6+3jx)>8YkKGYI>V>@oT=-t*#?rf;` z;iCK~%YUqQX7T4xicjJ_Od$mhx;0mm%Anj*5K>wzi1d-v!@89fDCK@<#EG%lUzcj7 z{)4p6p}Fs%DOm=`XYaUGOS0NSN)H5zC(SoxzBUs56}0flnk4FFL;=vyhrO`pL>h{f zk#&IH@n3J^KwVVUb+*p+XWl-H2U0fYz{r>N(oV6n_QBtTD~bJ^RlR?9K)w2e9I^#C zs>|UiY%i3xs5N6;HSz-?Zzu3;g47kDVeCW%tK>IR6Ragq04?n>i@Y8ahAKmJh@y}x zeRycyoI^>;X|9|J;u)=4?JiOUMBhohaJ#5-kj(CxaEXN;ZH1#v-1HHq-ty2O#!$LL zQ%U!~KT`)J_m374(OV*(W6*?Io_u@}|JgKKH<^Xe*KK|H5A^=FwkV^&KFP7jZfM-% zBo&V1>2PAcb*=rfj!CN8miTs%E2!0^N4GUvdgT9GS!pY3R;8Plrf@E6UUe#d37xN{ zP15wYnnVHN!I@{!l6ZB)DS53is zN4fC`_$um;EOObE;##c_@%b(dVo5}s5Y+Hwgl;d($vQVB;!pRc`|h4b+QRw65RXHl z68dT75?1G%!y;oX6+^{x^@8T2KrZDfP2ryDXe7#2{#!HBv2t1@yBMY>I&b0cYwsr0 z08cu9>tBGGSC+svGR@zC!_V|o6O}hhq`>QE_J!#sxP-r6z zxV%Tm4#WA)tvRjMjO;({4s+z>wJmG61zvd!-%ck`FQZnT9|P4;1EV*xkNV=DKjR+` z(ZM^IwbKW9gLqtjqEjWLkHWkd)W^(Sxs&^=V5i@yQIe6pBs@dM2Dg+a1b<--afwf1 z(GQC`j9&831Nql-`E$k}YQGHEnmZ7NXx*cP`6wL!xp~zp707ha8ma^=5kL-XrznFG z_qq4n1}T}+5;?5GqfR@T?u~`{;*IdAa64L=UPqwkpXtQk?TnSo(6+z(6S@2Mzk1Ee zI4Gk+wa-4LvJtzuZ$ycv5MfOf{#-^WsprJm*;%Y=M5Lxu8NB+bp4Hj4zu5om#Xqa> z_>*q=wf9i6O(xbzJK<0im(Y#92~)B`IJvb;^&iHr!9Ky7ouyYgq5OT=SsYTsLVhcZ zm&p|L(9gK5GK5?&rWg#|q$G%3QZ!+F{Z!D9(eexG2U0P$kEUv<7`XngPi9Ca$?8q= z2IA%4=AWx04ttr)q2EtOOj;KjQ}ef2&gnLEzdrPjN-NMsMYpE+Rzl6;q1|nfW3Y_v z4<1LZPIvoz1>e%cl{T8|>~0h0jg&wo*W%oECoMj`Ps4nj9fx(jZP6!F{q?z+xF_n0{ZV35cloNLBLe?%0hVRbIDU>o{&9k3SmMa?L&^k~;{K>DOI-blx*& zeCF-uoc#Cx$|S!T68ViaG**V2iazv`+0R~H9EZP2Hoy7dJ)NJ!RwTGuvS+sRBRlHw+d@O^}S!41vE8E!V~2mFjhqfb!v+0 z@%;i#pjviT3$?DFe;3b%#tA=m<#RQpi$sIktE?DwLiP(pSzjldtpw;WIa=y)q(b){ zIxKLB@h9`frs>(st0g+R+gpJ6z4R8!nzX-H&3~RfX+0QZi~5|OU~N~?i++58n1l0f zkEHzK+#5HVM55u>Zz{-C$PejUlb=$rj!<()6TPKc)>-V&sB57IOqp{qpRMN)~Z?O9w%-U)6kwYm9Ul4{4o{DY`w`iy*wGR zm!I45QRL^ftL_K^9X`>_BpXmVP?E$5gB%RL@HY)9iK8{uo!cvx6 zI7l(1M>%Qk*hp7Ip)H#eZTC<>vZO3)!n*93>2p|IUgPml%>+nCP~P+-7%XB(NN$0f zY}kAWi}#0LAexfCjvbhOSP$=vw}LCq7RerYC(HBO(0`ANo*GZKn@D*3Kp@7O)h2{A zy?Q+e)t@t|rn56lNZHyI8Vc_yqt!t&+hZ+XYaTiOV6rlV#& zk@;B%%5(A@W(KwK>^^Hrb8s`s#n{HbK^;>5Z*I=qUWXMzo6&s9kBWAw6dpT_{@vuvs<$MBTjZefuZN=({@){VasKdhf+amT} zWmY_7)^G>8{xKzDP3Zt1-kYCI{g@$$Y0gC%M7%*o(RPdGPg_vrCTiBr7`kOFniq!- zHfM@T>0RmP@-Xs@-TacCD;z*=ild}gHrA!RZnSKv0?wUV?T!4@wCWckuO@JhJHrLj z@)F=^>;ESLz@5{nYahwM`>FGPd2~bgb1$BnopeKe_oz{y2BlhE5!}h6SXL*K)g%<}mid1P4{Y-RDmloWOva<(=w;!&v(O9u2SUBhPuCN>>rq%yIiw#G3w$OtNfP5n;TAycTSh zU2P<+61jHFONwS7CbHY=X-!;svWW zElzyCmY|xM0)RHQ^o&TmOtPO*Lo(!E_B_MAmMO(juruHF8G?51UyxCl=g-aLuHawd zYbLQ6_QG!Rh*C|Ro%1_Ns5xSd_zeZs zRlQED;=+dV`wDGCCDLFkp0Vq$?@j%mT_@G5;MNwq+v%>C1?zpH-5lqUUZuXCd&ho1a)9k3%+PkZr=j?S(!y0l>^vo_o%Yw6&l`1I#e zQ-(s+P(tUJcgY{L(wJ85(rhK(Xidu(@m1X+au0$pIW3rNirz1-p7^p+Q6d#oz6i!Q z{PtczSYavGdC9~N#D;AtmjA{!{Hyn_V^3#bM&oX#ouZ3U2G!1VNdsn78cWYxXeuy2 zie~T5>3qmSjSHop|CDV$LD$x+DEORDXjHgOzI7MgS*q1B=L$!UfkGGJ_1GQ_CrFKI z2IX2Xkzvt2t*+T^^@YCs=jw}^d#@|p(S$nguF&}8U&r8^yB9b{C1i!Y9rah--Z=Ap(1U}Ll1st-Zc_*E zH0dgQ1>yQ7y`K#u_Fnbiw1_CKcnRb33ae$YDp+?gNcc4R4f=Py*~gO&({(gT7%O3> z)s?$*T=`i1^KR{Ou^pM`zS?d;++2Ng9*&&;*J7j##`fJZ;$F^tGFOSi2EdJB1!5j5K@GE$O};KR+$8NRSH}5UJnz+`xqSOh<{r zJ|dE2FE?8QXnw)Hew%;qnTwP*+(WQ=1W^70?ht6xCe1sK9c#k{H&f3p(WnN z*Wta}R3`4I_qwoZWFPSFkIuF$t9~1t@X{$x*IW+p6tx}Bx!1Y&H|;S>O=>FiUFd|B zu^_S3j^7c~cyR-3Vp!WdzG1x>o!;8ArJM(tyUFrcqS{ixdoHjX9zG)HKGzTBHeHGT zC9R(O{*4XYMJ4-y|1{L*7x?93Oi`g6nEJE~J$vm2-V^ccN#o^nMWLUUUk#aEMEiuN zwXdEx7W`|`!A3a@P2a#R&c-zM*P%tw`F3w#i|YjM;r-PK-ia>p9Yh*tlhLL!|3dld7iGAe2ygKKGoVk=G7$3!(;kkO(w7@|CAG3NhXZ z-}A$LuoX;b-qW!>?fjc@1sj#k?SZA(dDz2KZVh7iOVA=0fCVepn&`njbp7DK>kPvH z?OZV5{+f5gvCV2n;EzP;_C6;GU;Q6p72gLWJi+8hpX5)Tc!-uuNSyoY;uf73KaaOBc^Y>)p<_-r3>$8T=tiPmgb(&l?Me0cS01`pL! zG-MKZ#2--(8BummO+rm^kNs;e3B8?SdTLbi#WdKW;`rUYuudEs`VehqUSUS)u1HpC z_q6(;>srR7I-13hyg*S!Xlp@G>Q0$Iv$ww9wtm}*{$L(&M23@cA&wrPMg z6mBSP-2E|~R>A-?pu?PA6}NsQiAo#2ZpqzkTk-^spC)jqJE~=gTn}S@lZbdVl$Nf> zG!Q~1au)H3_WKoh(9S>>ui*i`h1gH9(K>qVkD=;s+)jCLap~T43nf38VRNOK#iogH zH3cv*RnjM9CNmNt3W4%KleEZtu0TCN&fzwH#^bP-y3-)qu6kAph^)M11#g}On9Dw0 z2*=1I9A!Z~(uw~(i@Qv~_x2QS{p;bSbk;W4_2ZML*$3q$tAnn+>&)RaI+f8;o~*9s zTE!#c>yJ)kLpu%$_<1j2l&jbg`xPp}+?{`S-bj3i+VzwC4L~PjR;Oih9|^DQk?PMl zP<6&i(v8Z@#E*PU&rvYT`u+v`SAmacO*AuI{1LvJt=FE&wK{v^YoPPZ`19tkgP%4{ z))O7?p{Q^Zyg0XH60W^`$|Bf9V_=!&$lM`Fide!ST&5MQ{very4MxjbnAUxsbut2N z#QD*LX0#}7YmOlwmqDnshI0!7oP$_N{W6b_Jt_pJ?AWR?g0b8>nWNNDTzQx_$8=6- zWAE>!!fjZ_8dNh`kDD!hm_p0x2+@oc)^71`mH2uk0(DfKe=A(Oyl0ZJG9BN9;7j`M z46ib;H}o{xf1u&-rrW5IHBtD>On>wTLGp-t6ap;o#sqKu&eUpmHm`#lM)&db?X*b_ z%-4~Yu{fr=U>gql{wZ9!ffp2j1-g>n?by_IIcfqH)QfTK1vTYU!Ho;pO2?B7g^>=E!zFP6) zJ+3$To1gx~Y0O6kc>NN~q2nKUW7pJPYMqQ$T9RX}+MWR!_1EnK(KIN@FW@vE=lF5g-Q zQdeEYBE$*wrUp68+TG)Q$mS0pTMUtx=_LQs@nzFyJF=2RvhoHoU{Z+{Mt$mejTZU9 zq1xk*YqrE~&-jpJ7-G>RK{aV>OT zk)}pzY*lsCUzCjw%)R3!Vnht*G(rnr4{0izL_0C+3?<7L;maSKy?b;xpwYrKAU0ke z9hFE?Q7FgPSgrr{-=nXEhK`rDra_XZnQ4}5JBUz1hW8lHdUHnZBO$JIEaSn#r~c-2 z`+b6DL=%Lkv)kw&>zOUJZ29XR5WaN#E{=49E8jg&81MhJ?r_`XS5tO)baWtgkE*Dz z^M|bdZZf-ta*-ju_p2Y?_)e}nNcE}lOHn`UUGkEFAK;@Gfy9m;RduTKFw~PR3e#8K zg#yvEzlJ+%hMFe{%XxPahTB~ICs9MJVJKJ76JhHYu7B#zoKRfnnw6C0SznWSETWEi zL!>{`ugo_arg!`AA5+_e|M32vo}@;DBnEkp=r}NFjNBG0#02Te#0zzBiN@b&2vR{9 z^T~oX)H}Id8u1V&U2<#HI;8J%^uQtsgex|*bFlr98tz`ZgFfEO*B*z^3uk`BNKNa_(^!VJF(os+`tb zL^iNG^@9eG=5F|1?9SoKpzuUo81D;6xY0XJ`mJD*Q7nGu3!&2P!$93b#kcOd{$7Xb zsr-lgjyANx?eu8v1-?_j{6r^z{Qshp*rtfSakjJjEb>BP{buW=vQdA!rS!f+j8lis zBmDJh``IBp=!tiLbJ`#$W`9mPF+o^csiHy0pfE12I0@9v*+$V~Z2|Yw*|VUOizN~t z;i}uDWkjS6jIQk+{l(G>ZPOp!*gc{DNOb4n_3cMdVuh+D4Yf!K&cyPk8(8Zk^q{(_b$k|=37$wWR>TlUD8kS zf#piP9TLG@F1vGZ`^}MoZ9L2I#!tQ@6Z~H@qb=gZK>LBN4X9mj)Khawe+QSKjDg-0 z+>^-PyMBR-yF}^x#TD>i@T0Fu#`L`6|>QPz^u|zqF zD3x_5(g~gpg2Dv}B6W3u2BJe8!45dgvK{uzH=6nEYAv*T!)3I9I0{vuy9b6?%?3LA zv&RNsFg8I`?SNr@kblW*isjeisDALsfeNtz!oW4EVK~Q%Z+eHzJj#yNog4VyTzBd4 zktf*hsC#FSv1$dd>{~SNUO{t~mj0Pdt%tL>lhj!3a&_FPr_RtT3m90u#Wy24_g5KQ z^C^N6#{nI&w+L4@BMCASvS2rfyKcf+O;od{1Ltk{m+PhTyK(c~>}jLsXnE0C@g>}j zbOq^yk_~n1C&zYzk5R_9TpA&Fb&|er(AbP>z%bQ!;k+ds{#1>Ws$ZI2 zMTf|?)O?3~E6#%$CdvPdhf@N#O&CZJnz&YS77xLYmtm=rB7tDXlyaU66o?qA^ZYlz zk~cQCv+lyT8{|PO6OD@kfrsdSnc#2```q$E1Pd(KXiC`J<{m)q_LQNInpsF#Iu(X#hXVg)G7U(#-+raB$Og z#i!ZoL`yYuG3e>vxbEcW7TSFYtf)6@)xa;9vZ$wp7}Q%uL4LdU@R#{|Kt_T$nXj!u z6GW)46LTBKuq4s1!&0e(tvkreMK(Cz<|fp&FdPMwaP4mI`4hA#M@|1IxBP9zd-cQH z*nr?%|GHG?p;n@)G_Zc;p{Po*m2R1wUr|iR3<0KU)rbGpo($NW)00 zawYQ_!wP{6xYmgAPSUcc1ljeFWKM(Vk?>Y>qSg(>kA*X>gTrObah?K#9b`kSl^z#? zbJaxi(0qn#-?DqM2eR&44fnj*3}>HH-=>+Dr|B51jXlAzWUPbw)oz(D>v3nrFbf(# zdqC7h^Mgju5)?k+vC^%1uB`)dCmPoJ76{%eEvK#iQJY*ytr#=z_DpCi#M z%5y-2HE;a6^=!DOaBgTFb4VWMP7D_ou(8RGb}HooU#2WsDI*mTsi|dTa~dOWxq3qv zV|-z%@r{8kh`OIL96bR3dJ6!yuD zZdKHvN^i6={GTBlwgQ1Cjy$ecYpcJ(OYilzQ)~8Cp*>f9gv>3>QB}AqtOK;oN8Y2Q z(W=&*{FP{;*1Kh4G;gUNTf^6)}A16={iYSF&hfo?NB1TJKGfChc1ih_~+%-6CKI_*(r(USuTRGl)eoi0`ILzpb zV5Y4emB})h`GI!cUQTKEW^G7IWk+(vi0DmVh5eGSdZYT`CN!jWd$5}y!#67RA<9u) zcKKc%6S~pHsi@ZJuh`12;gTUj+CC8X!q@mian463rYCm`xKIC8KRnX;*+}OLcHhF8 zoP5r`fg=B7s9HB%4J}~&`gEM7Pq6RjG0tg)R;lFAKJeY5t2nKtn45ZXH=2IW^Y*r1 zYCOY1*0fvof$$_2T;bAQpvwX-8BtMtN2 zTKMZ@2FR6Hnk(wdot2jC=n}zH=ImA&yrTY~vgh9kh~C~7ITcV+ptF*8^bw`1U@s_c zE^s=O3T^A(bJ*|^Y8v3`r@=b=vxv-c(og$TPD2B;!LcAPjl%2Qhwf^bXwI~PjUsoD zt<+Gl;{_&nuL=K&%V8EX2{oFd+?VLJB!g&aRM1ks7DtD6fpsc9e)F+7IV%Cxkq`;L zb58838elF4`6V*Gbxrfr5$&RjH+w=w><+Lty9B>Kotx0XD%7J z)8ssU7#ox*Mzj?fvfTYh;Vuz;LhzdxV5jpDDi$4MH1d-`}*ZQQR2 zA0%zvq|&%iEs%&f9d@5?Kc@Z*1{8$9h%hXMqfnY^$UtTg{b>$G%Y4W)dVW8{>f(so zkdkA3NAgt#f4J|N&bUZ`vy6M9)CE`0!^3+d4$u(MJWG*K(WCF zT)?lAwua)!;i7EDQFNifo$O1Q3yy*0-C*rj^dV?{Bdz0?O9rUT=dQ9}UOTJUjH!0^ z3_8*}J416vqSpx{&*IluT?~cjAK$(tI3ErDPmZhf@JvP2^goEE5)Tw~-EaQv)$FeI zb5W?&c{-!}-8j4cX995Dwd}`H$(6J#U3g|}{BLU|Nao_IW5|)s$(aGd-Iya@fp#=E z_vJIm)olB1l{7bDw8DL@`TQf5?u%Z&VKQ8EvwPBx!T#vYhv_l9Vkzuh)O@}{$-nxz zITugpk~mL$qh~fvAqh3MBz~sYkI&C+hQ2vl<6@lORW(p8O=%0Qe~!+E`N9bjco#Ci zOJhBF-n_vIg5D}l+8~$d5=$KshuIL}@?$WjY3k;7{<}vQ<$^7~8xzPx<^Qc588r8* z7X+NxAZ0FXi}LjN!?iDcC)zkq{ObzTNC`6^nE}K!@hdB#Nfp7wrh0$V7G@c}{nN zS!mMXKx1T36ZbM7=L^FT-l=CzoWf#kYq`Ov!}E)1+dv?~u<;(8-^gMpPFhgMK4+i1 zu5ph7qMFhcEjPL!Eg8Q@%l*be?JRB2)-w*#P%>=6QXMIG6YUI6p}Vn(1*(fJ|DGJwyZ#ONP>Q|g`9!vG#N^5I{rHQ8TfEt4g`jTgJuqaGd_Qvj zvsBd{@k`gj(-g@n>EDahIimsV`jQjDNH2{W*zJ(3Lvhl*_b9`ldTaf3tn8{`9aQ<~ z4!wY}3x4LHD{f_ax$nRBA#Gy9Sn*4>jEYeq!`G}mRgcV^Gs6^H`WY)u5NnVY;A!Vw z93z`?0A9Sz^U-4_%>9<5&$eL8N^6e{Oa2{_3Sgqgw(R(s+@=9Pi%6FVDD0lo`vDx2 zDrnL|O_5v$%{Ok@$FwzXniArb%~GzuP#ECZgW?>5zJ?Ubi-`b_Ty98 z8mm-mQz_yD$?)_Vis>)a=-Lic<4>G%=ROB6qdAZJH@W0X`RIQnJ-XALK(xkcikWnv zzJ(O|0sD~Tz!h<1P>BbVVU#2m$pJyn)Pomrn8SdGkkwGG@%K12)h;UwPwswFSSCSM zjnpkGE*IaoOu+jA_2M@i`5BRc&tE27s;4&pGp$of#$rf#IhI-maNzv=Ps<-5h-}BV z5Du)M=Z-XBfMDRX={PsNaQ9pxE~sMP$pq<*_B!IazjI`^lXP(%5Mh-g9~WXlhr= zc-xzWQ+q!zI%9t&0h3(XS(m-jpL>%fK+=-(n9 zbsPkRm-a|ZGeesB#0_uFc`5+d+$JWiw5}W(>smiTn=}w7C4Yj8%MgJ$+lWdyRqkl0sB4k;YA>Q?v^wNJQVC>fLV>%TF3j*ON@ z_5*eJmk7tj%n{rj#u|rJ(H?{iXYV`cjXM~mLPCgK|LVqzJ<}4U+#7Y7WE0gMPM%8W z)@VxQnbg*OTy@`Dhy`$!-o7W_FloNPXqyrW+ih|y>ZtL6iHy3~eIx?$@anEYzffAH z-J~&_uliEHt<^EdHcA~R+oTad3ZaSfeo<~E@M1F7>)#W|NB-!0kkM)@e$#7Y!pq&; z<(C1{kt*m!q55It;e)6caZTf3b#W;T73pA>KwYNdF`_w0pWroZEMZf@=>+?%_T;78 za}tWBDw%r~2eb=e*ss~KZw!yXpr!A^R9?S!_@3eCik5|y(0(k*_O^ZxfedMU4kn*e zgG^OohjgG9A`Kg|(7^a&d+)<4-vMLW3VDDb7JGV4UHM#JsoAm0qaGEc_r7f}_C!Pf z66FFCE~{F%9K&|)h!;~Q3+ ze9;OOkgHbk)e>}Ke;AF*CK(6~WVE+^>W+o8s1x0!+FJ)o`N>!qE9GS(t^DuQxn+s1 zo0mLlxJv!mhCE4SgI*|mCW9XFRCPH}h37l(I(PYu7!G{RfX8W@3SvVOX4)1Kb&X*= z#vdc@kBR0Ae9sWwM(RsmA_iYE@c51Q9#zf4=tU$&d$7Lgc`~G#wE0L3{^%c6@0Xy4 zDFt%adBZ-hCF2Q>!gkAG?rA)MrN~BOX0a{bvK^mL&Y^^8*l> z%R;DM#QRc%F}rNx%*V@oX(Ro6I2NpB1Jb#X8gO$aH7DY5fz-nxuI%G8j9`FV{zsd0 zzkgg0wB8X{jgx=Weu}hR3Rs9H8Tr+Z$Hou{Cr_d4g1y(jbU;nUWE8^UH$4E?C!|-f z{gWbFHha*V$x8Zr8S=w^fp3{sj8{j~R73CsT2|?trU4?8$^M-;lx{leN+8tW`vPGYT zM$t*=Lu=t0jkVgT2)sda@tCd}9`ur1&xoureE>@L8<^zxpNiI=HV>r1ksbmrcZ&~~QyiEMz>`^;^J9{%(a$HIx;3!mj_*K<`vU0mK zDX9WI#SF$}BXtJ7CJy0@{GwjN2^B<&4--?ftWS%X8+fbP;N+7*y^7?2gxMo6%Eu%z zaPm)}C*yQW7wIO zs5E`!!O%{kCfKl%YIR)UOb&I^+va1nHdL8tU?dOx%Dd;q)5_jxk&HYr$1~1e7~yT> zYQNWQg3pV-_0T{V->j4t7kJkycDF@lIeN7lC3Sb|<_9hqs_h%4ZKPHFnnvAfc_jgN zW&g9vRQmFuE!HYN;M}zgot?7+fLGydTPdA6=3rmf~#ME$&yHobt7t z&_lJBPd!vzLl(ufdTF_%wqL(*(C;ds3+LAfgLJm;d5u`-c&~F<^w@Tlp3;3hZOg3( zSI2d)wib$^hsV|O>`4&mhMwRby4-tyjmA^xD{~Y{&5yShMcw42 zZx}2~c zxOa7Fjl1mgeU$6n~l!9^5#Ca8-Cz&hb z8Ij;XZjdhHn0_W8?W;}eZuv&&6VlUA2{8w;G=@R@rPk91BSY8VK`<&z?`)zrC*ceB zZ&0D98ZA21M(b^Wy$b=Gbp6+(%2YM#i|it^YK2R+-&opENG`>FV*7NcmFW@w3bM#H0q!H&6aA^*z-ZGosMb#NQTfoA$`K8^n)+S#mWV@SNON7{c zq^Dj(EgjHdn|u;ADRPm|Ib-%#1~!`zs1l^}{CC?D#d&(x6!oYRpS{f!TOPUX;>3<= z=y!xZ!AvQ~MdBm5-q_2bFE4vcuBS%p$168UXwUd6Pmt5Iu`t}cE$i{|-vy{!huXVB z4lG3b7=?T8#1@iwPQoO17mXG(YPq-^Uz%bp(uZh~f-OKsWyhjow?qdKZ?roI2rei?qRrl?XSsZ689Q5>V6He)ebFif6 z5Kw~KR@|R>bNW^z)EW-vB=m07K3D4wnd~vNX{DHHEtGFR3^pjt zRHGSFV!S|BR*Q-bGr8JM+=8Fa3*>TQW2W@SRP*i6)$H7}SQcFn>K9PwiS_XIOxAeC zrg<)XVqM z(0=SX)5Z_nsICm_9tQBNZPj>lZ?D?(2D>+O*zvJ8&Cr!enN?7om< z^7xC7ZBa{=W2_6{;CN)bsMQUa^K=QPb~6I6x53RzlC%FFCG~6sNbd2;ODf@a)KI{a z(of$>fIhk*F=cSdWm&Mrt$R%{u4yx!X$V_E zg=v>zxt5%^%e60rDX1n;ir0d2QscU(e4k!-4F9^>lGNxtXvx$;^_Cy0H^<6T#@Y6W zrrDSKW5XVD!ZM8NVWBk{%T4K)9tPb!tpXOXT$ti#MPnQ{>=W*{=r%pJC6s&cv7JPHj zUF9_UvobC=Qe0+_ac~MJE*2m}wf1CR5r25RYHtptQ>(m$MCZ>x(DOMm*(uMtg|4Eb z(j5fafFKV)b#b0@=b__+cJG}(xa&I;{Yl~~EHz1ybw>SNm-;&}BP|epCC{clBZPmB z;xh3pF5CZBhz<|=aAOEC;wiiucLKkTE+wUv=1?1U_jDGa6s^jOKOZ&U<&3_26x2~O z{Y#?6(d4Fmz~&J*Wu`uyt;Kw+TDG9XR8%Ok5YG7k9}lqqqRgzY{we9`xYNcz4VLVBOO4KRybqs6Avq&(NDzIG*{u?ba z6iE3}5T9Y>#Kw-p5)UTPlrn2he;o!JZkg(Ah!+NAbZ8z>F&9Yka}%|@YfN7A*BN`} z?{zLJQtYn{2t$M_bwkFJFULQO{Y*&4@oAn#V=Ju0ZCeUZPc}Lp!M~`u6NJUaD)iaP zf7ROdeYhw!+E3!01vYQ*@)7UGUmN;pZvOvW9s==p2-ri=Ofw-T=q-~RR%}{a07jcT zq!7aWT&fk{KKYb)srM<^6^CU&8*Ugt7E!Jqj>)(cKZ=F%-kNmNTp#Cm6h$14?JNFZ z32nARGiKfLFX_=L0i3pLw5jxSoiil0{%nq;;n2p7R+^KUe*nPKP1lJA;@HT!R2vh;YfJ8s$@fsefw2#?)urZw7+^N z-6%vNv*Q{kXLHo3y2EQyGq-4sYmiAB=zpwWFR?Ackm&LAQ+mQfp7h{F9^@)^?~3vj zvYj^_N5%0G(Pxz^B@h0mD5Ud2uExK+Ma%$y{PzEx{t&AFKK*YOW7tLBk$r1xK1$aI TrUv$!RQ6r8bg+1R-YfoJ-j!An literal 0 HcmV?d00001 From 5e7c032cde57b7262076bc46e50f8b5c3cfabe53 Mon Sep 17 00:00:00 2001 From: voidcl Date: Fri, 10 Mar 2017 13:47:39 +0800 Subject: [PATCH 05/17] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=AB=98=E9=80=9F?= =?UTF-8?q?=E9=97=AA=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加高速闪现进入怪物技能表,2s进行一次闪烁,无CD,与玩家相隔小于3单位禁止释放高速闪现 --- .../academymonster/ability/AIFlashing.java | 65 ++++++++++++++ .../academymonster/core/AcademyMonster.java | 4 +- .../entity/ai/EntityAIFlashing.java | 87 +++++++++++++++++++ 3 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 src/main/java/cn/paindar/academymonster/ability/AIFlashing.java mode change 100644 => 100755 src/main/java/cn/paindar/academymonster/core/AcademyMonster.java create mode 100644 src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFlashing.java diff --git a/src/main/java/cn/paindar/academymonster/ability/AIFlashing.java b/src/main/java/cn/paindar/academymonster/ability/AIFlashing.java new file mode 100644 index 0000000..2bf930e --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/ability/AIFlashing.java @@ -0,0 +1,65 @@ +package cn.paindar.academymonster.ability; + +import cn.lambdalib.util.mc.EntitySelectors; +import cn.lambdalib.util.mc.WorldUtils; +import cn.paindar.academymonster.network.NetworkManager; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayerMP; + +import java.util.List; + +import static cn.lambdalib.util.generic.MathUtils.lerpf; + +/** + * Created by voidcl on 2017/3/10. + */ +public class AIFlashing extends BaseSkill{ + private float maxDistance; + private int time; + private int maxtime; + public AIFlashing(EntityLivingBase speller, float exp) { + super(speller,(int)lerpf(200, 100, exp), exp,"teleporter.flashing"); + isChanting=true; + time=0; + maxtime=20; + maxDistance=lerpf(3,10, getSkillExp()); + } + + public float getMaxDistance(){return maxDistance;} + + public void spell(double x, double y, double z) + { + if(isSkillInCooldown()) + return; + if(speller.isRiding()) + speller.mountEntity(null); + speller.setPositionAndUpdate(x,y,z); + isChanting=true; + speller.fallDistance = 0; + if(!speller.worldObj.isRemote) + { + List list= WorldUtils.getEntities(speller, 25, EntitySelectors.player()); + for(Entity e:list) + { + + NetworkManager.sendSoundTo("tp.tp",speller,.5f,(EntityPlayerMP)e); + } + } + time=0; + } + @Override + protected void onTick() + { + if(!isChanting) + { + return; + } + if(time>=maxtime) + { + isChanting=false; + return; + } + time ++; + } +} diff --git a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java old mode 100644 new mode 100755 index 7e2a33a..38bcb67 --- a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java +++ b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java @@ -76,9 +76,9 @@ void initSkill() registerSkill(AIMineRay.class,0.7f,EntityAIMineRay.class,5); registerSkill(AIPenetrateTeleport.class, 2,EntityAIPenetrateTeleport.class,4); registerSkill(AIRailgun.class, 0.3f,EntityAIRailgun.class,5); - registerSkill(AIThunderBolt.class,70f,EntityAIThunderBlot.class,5); + registerSkill(AIThunderBolt.class,0.7f,EntityAIThunderBlot.class,5); registerSkill(AIThunderClap.class,0.4f,EntityAIThunderClap.class,5); - + registerSkill(AIFlashing.class,100,EntityAIFlashing.class,5); } @EventHandler diff --git a/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFlashing.java b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFlashing.java new file mode 100644 index 0000000..5cd5e0b --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFlashing.java @@ -0,0 +1,87 @@ +package cn.paindar.academymonster.entity.ai; + +import cn.lambdalib.util.generic.RandUtils; +import cn.paindar.academymonster.ability.AIFlashing; +import cn.paindar.academymonster.ability.AIPenetrateTeleport; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.world.World; + +/** + * Created by voidcl on 2017/3/10. + */ +public class EntityAIFlashing extends EntityAIBase{ + + EntityLiving speller; + AIFlashing skill; + EntityLivingBase target; + + public EntityAIFlashing(EntityLiving zombie,AIFlashing skill) + { + speller=zombie; + this.skill=skill; + } + /** + * Returns whether the EntityAIBase should begin execution. + */ + @Override + public boolean shouldExecute() { + + //&& this.speller.getDistanceSqToEntity(this.speller.getAttackTarget())<=skill.getMaxDistance() + return this.speller.getAttackTarget() != null && !skill.isSkillInCooldown() && this.speller.getAttackTarget().isEntityAlive(); + } + + /** + * Execute a one shot task or start executing a continuous task + */ + public void startExecuting() + { + this.target =this.speller.getAttackTarget(); + } + + /** + * Resets the task + */ + public void resetTask() + { + this.target = null; + } + + private boolean hasPlace(World world , double x, double y, double z) + { + int ix=(int)x,iy=(int)y,iz=(int)z; + Block b1 = world.getBlock(ix, iy, iz); + Block b2 = world.getBlock(ix, iy + 1, iz); + return !b1.canCollideCheck(world.getBlockMetadata(ix, iy, iz), false) && !b2.canCollideCheck(world.getBlockMetadata(ix, iy + 1, iz), false); + } + + public void updateTask() + { + double dist=Math.sqrt(this.speller.getDistanceSqToEntity(target)); + double distBtwEntitys=dist; + dist=skill.getMaxDistance(); + if(target!=null && skill.available()&&distBtwEntitys>=3) + { + + double dx= (target.posX-speller.posX)/distBtwEntitys, + dy=(target.posY-speller.posY)/distBtwEntitys, + dz=(target.posZ-speller.posZ)/distBtwEntitys; + World world=speller.worldObj; + double x = speller.posX + dx * dist; + double y = speller.posY + dy * dist; + double z = speller.posZ + dz * dist; + + if(hasPlace(world,x+1+RandUtils.nextInt(1),y+1,z+1+RandUtils.nextInt(1))) + { + this.skill.spell(x,y,z); + speller.getNavigator().clearPathEntity(); + + } + + + } + + } +} From d3883980ac54111d8978b132e08477541a6729c4 Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Fri, 10 Mar 2017 23:21:47 +0800 Subject: [PATCH 06/17] =?UTF-8?q?=E3=80=90AIM=E6=89=AB=E6=8F=8F=E4=BB=AA?= =?UTF-8?q?=E3=80=91=E4=BF=AE=E5=A4=8D=E9=80=80=E5=87=BA=E4=B8=96=E7=95=8C?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E4=BB=AAUI=E4=B8=8D=E6=B6=88=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/support/terminal/ui/AIMScannerUI.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/AIMScannerUI.java b/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/AIMScannerUI.java index f98dc4f..0b8e033 100644 --- a/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/AIMScannerUI.java +++ b/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/AIMScannerUI.java @@ -168,6 +168,12 @@ private void initGui() public void tick() { EntityClientPlayerMP player=Minecraft.getMinecraft().thePlayer; + if(Minecraft.getMinecraft().theWorld==null) + { + current.dispose(); + current=null; + return ; + } if(player == null) return ; MovingObjectPosition trace=Raytrace.traceLiving(player,20, EntitySelectors.living().and(EntitySelectors.exclude(player))); From 510fa82e6a567a78fb9291d0a0de31807d3e5246 Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Fri, 10 Mar 2017 23:22:16 +0800 Subject: [PATCH 07/17] =?UTF-8?q?=E3=80=90BOSS=E8=A1=80=E6=9D=A1=E3=80=91?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AA=E5=BE=88=E4=B8=91=E7=9A=84?= =?UTF-8?q?BOSS=E8=A1=80=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/terminal/ui/BossHealthBar.java | 15 +-- .../core/support/terminal/ui/DrawHealBar.java | 103 ++++++++++++++++++ .../academymonster/textures/gui/hp_bar.png | Bin 20453 -> 5785 bytes 3 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 src/main/java/cn/paindar/academymonster/core/support/terminal/ui/DrawHealBar.java diff --git a/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/BossHealthBar.java b/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/BossHealthBar.java index 584e811..2e30a58 100644 --- a/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/BossHealthBar.java +++ b/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/BossHealthBar.java @@ -51,12 +51,12 @@ public static void preInit() loaded=new WidgetContainer(); Widget board=new Widget().size(1200,400); loaded.addWidget("backBroad",board,true); - Widget skillList=new Widget(550,-430,1000,125); - healWidget=new Widget(700,70) .addComponent(new TextBox( - new IFont.FontOption(50, IFont.FontAlign.CENTER,new Color(1,1,1,0.6))).setContent("A Test Skill")); + Widget skillList=new Widget(350,-480,1000,125); + healWidget=new Widget(900,133) .addComponent(new TextBox( + new IFont.FontOption(50, IFont.FontAlign.CENTER,new Color(1,0,0,0.8))).setContent("A Test Skill")); - Widget healBar= new Widget(700,70).pos(30,60).addComponent(new TextBox(new IFont.FontOption(40, IFont.FontAlign.CENTER,new Color(1,1,1,0.6))).setContent("A Test Health")); - Widget barTextures=new Widget(700,70).pos(0,10).addComponent(new DrawTexture(new ResourceLocation("academymonster:textures/gui/hp_bar.png")).setColor(new Color(1,1,1,0.6))); + Widget healBar= new Widget(900,100).pos(30,60).addComponent(new TextBox(new IFont.FontOption(40, IFont.FontAlign.CENTER,new Color(1,1,1,0.6))).setContent("A Test Health")); + Widget barTextures=new Widget(900,53).pos(30,22).addComponent(new DrawHealBar(new ResourceLocation("academymonster:textures/gui/hp_bar.png")).setColor(new Color(1,1,1,0.6))); healBar.addWidget("textures",barTextures); healWidget.addWidget("heal_bar",healBar); skillList.addWidget("skillItem",healWidget); @@ -91,17 +91,18 @@ public void tick() { widget.dispose(); } + existedList.clear(); Widget widget = root.getWidget("skill"); int i=0; for(IBossDisplayData entity:list) { - Widget w=healWidget.copy().pos(30,30+150*i); + Widget w=healWidget.copy().pos(30,30+130*i); w.getComponent(TextBox.class).setContent(((Entity)entity).getCommandSenderName()); float per=entity.getHealth()/entity.getMaxHealth(); Widget healBar=w.getWidget("heal_bar"); healBar.getComponent(TextBox.class).setContent(String.format("%.2f/%.2f",entity.getHealth(),entity.getMaxHealth())); - healBar.getWidget("textures").size(700*per,50); + healBar.getWidget("textures").getComponent(DrawHealBar.class).setDrawLen(per); i++; existedList.add(w); widget.addWidget(w); diff --git a/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/DrawHealBar.java b/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/DrawHealBar.java new file mode 100644 index 0000000..a41164e --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/core/support/terminal/ui/DrawHealBar.java @@ -0,0 +1,103 @@ +package cn.paindar.academymonster.core.support.terminal.ui; + +import cn.lambdalib.cgui.gui.Widget; +import cn.lambdalib.cgui.gui.component.Component; +import cn.lambdalib.cgui.gui.event.FrameEvent; +import cn.lambdalib.util.client.HudUtils; +import cn.lambdalib.util.client.RenderUtils; +import cn.lambdalib.util.helper.Color; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL20; + +/** + * Created by Paindar on 2017/3/10. + */ +public class DrawHealBar extends Component +{ + + public static final ResourceLocation MISSING = new ResourceLocation("lambdalib:textures/cgui/missing.png"); + public ResourceLocation texture; + public Color color; + public double zLevel; + public boolean writeDepth; + private float drawLen=1; + private int shaderId; + + public DrawHealBar() { + this(MISSING); + } + + public DrawHealBar(ResourceLocation texture) { + this(texture, Color.white()); + } + + public DrawHealBar(String name, ResourceLocation _texture, Color _color) { + super(name); + this.zLevel = 0.0D; + this.writeDepth = true; + this.shaderId = 0; + this.texture = _texture; + this.color = _color; + this.listen(FrameEvent.class, (w, e) -> { + GL11.glPushMatrix(); + GL11.glBlendFunc(770, 771); + GL11.glDisable(3008); + GL11.glDepthMask(this.writeDepth); + GL20.glUseProgram(this.shaderId); + this.color.bind(); + double preLevel = HudUtils.zLevel; + HudUtils.zLevel = this.zLevel; + if(this.texture != null && !this.texture.getResourcePath().equals("")) { + RenderUtils.loadTexture(this.texture); + HudUtils.rawRect(0, 0,0,0, w.transform.width*drawLen, w.transform.height,drawLen,1); + + } else { + HudUtils.colorRect(0.0D, 0.0D, w.transform.width, w.transform.height); + } + + HudUtils.zLevel = preLevel; + GL20.glUseProgram(0); + GL11.glDepthMask(true); + GL11.glPopMatrix(); + }); + } + + + public DrawHealBar(ResourceLocation _texture, Color _color) { + this("DrawHealBar", _texture, _color); + } + + public void setShaderId(int id) { + this.shaderId = id; + } + + public void setDrawLen(float len){drawLen=len;} + + public DrawHealBar setTex(ResourceLocation t) { + this.texture = t; + return this; + } + + public DrawHealBar setColor(Color c) { + this.color.from(c); + return this; + } + + public DrawHealBar setColor4i(int r, int g, int b, int a) { + this.color.setColor4d((double)r / 255.0D, (double)g / 255.0D, (double)b / 255.0D, (double)a / 255.0D); + return this; + } + + public DrawHealBar setColor4d(double _r, double _g, double _b, double _a) { + this.color.setColor4d(_r, _g, _b, _a); + return this; + } + + public static DrawHealBar get(Widget w) { + return (DrawHealBar)w.getComponent("DrawHealBar"); + } +} + diff --git a/src/main/resources/assets/academymonster/textures/gui/hp_bar.png b/src/main/resources/assets/academymonster/textures/gui/hp_bar.png index d02385bda570d6c6a9c9f6f432cbfb27bb5f0b55..00831e6eb8a73f7fb9395bd761cbdb00bfd68637 100644 GIT binary patch delta 3103 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 delta 17887 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 Da};DR From 783f19f3a57d6e2c8712ed4e85183a4bb26bb804 Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Sat, 11 Mar 2017 12:34:11 +0800 Subject: [PATCH 08/17] =?UTF-8?q?=E3=80=90=E5=85=89=E7=9B=BE=E3=80=91?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=89=E7=9B=BE=E7=89=B9=E6=95=88=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/paindar/academymonster/ability/AILightShield.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/cn/paindar/academymonster/ability/AILightShield.java b/src/main/java/cn/paindar/academymonster/ability/AILightShield.java index ad2c292..4654e7d 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AILightShield.java +++ b/src/main/java/cn/paindar/academymonster/ability/AILightShield.java @@ -53,6 +53,7 @@ public void spell() return; isChanting=true; shield = new EntityLightShield(speller); + shield.setPosition(speller.posX,speller.posY,speller.posZ); speller.worldObj.spawnEntityInWorld(shield); time=0; } From c30e8883e050561d85f3ebd180c0d8f79d4f0a40 Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Sat, 11 Mar 2017 12:34:26 +0800 Subject: [PATCH 09/17] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=8A=80=E8=83=BD?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=92=8CAI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ability/AIBodyIntensify.java | 2 +- .../academymonster/ability/AIFlashing.java | 22 +++++++++++---- .../academymonster/core/AcademyMonster.java | 4 +-- .../entity/ai/EntityAIFakeRailgunAttack.java | 24 ++++++++++++++-- .../entity/ai/EntityAIFlashing.java | 14 ++++++---- .../entity/boss/EntityFakeRaingun.java | 28 ++++++++++--------- .../assets/academymonster/config/default.cfg | 8 ++++++ 7 files changed, 71 insertions(+), 31 deletions(-) diff --git a/src/main/java/cn/paindar/academymonster/ability/AIBodyIntensify.java b/src/main/java/cn/paindar/academymonster/ability/AIBodyIntensify.java index 4fa0a6b..baa3e88 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIBodyIntensify.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIBodyIntensify.java @@ -25,7 +25,7 @@ private double getProbability() } private int getBuffTime() { - return (int)lerpf(3f,10f, getSkillExp()); + return (int)lerpf(30f,100f, getSkillExp()); } private int getBuffLevel() { diff --git a/src/main/java/cn/paindar/academymonster/ability/AIFlashing.java b/src/main/java/cn/paindar/academymonster/ability/AIFlashing.java index 2bf930e..ef6c475 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AIFlashing.java +++ b/src/main/java/cn/paindar/academymonster/ability/AIFlashing.java @@ -18,35 +18,43 @@ public class AIFlashing extends BaseSkill{ private float maxDistance; private int time; private int maxtime; + private int ilCD=0; public AIFlashing(EntityLivingBase speller, float exp) { super(speller,(int)lerpf(200, 100, exp), exp,"teleporter.flashing"); - isChanting=true; time=0; - maxtime=20; + maxtime=60; maxDistance=lerpf(3,10, getSkillExp()); } public float getMaxDistance(){return maxDistance;} + @Override + public boolean available() + { + return isChanting || !isSkillInCooldown(); + } + public void spell(double x, double y, double z) { - if(isSkillInCooldown()) + if((!isChanting && isSkillInCooldown())||ilCD>0) return; if(speller.isRiding()) speller.mountEntity(null); speller.setPositionAndUpdate(x,y,z); - isChanting=true; + if(!isChanting){ + isChanting=true; + time=0; + } speller.fallDistance = 0; + ilCD=5; if(!speller.worldObj.isRemote) { List list= WorldUtils.getEntities(speller, 25, EntitySelectors.player()); for(Entity e:list) { - NetworkManager.sendSoundTo("tp.tp",speller,.5f,(EntityPlayerMP)e); } } - time=0; } @Override protected void onTick() @@ -58,8 +66,10 @@ protected void onTick() if(time>=maxtime) { isChanting=false; + super.spell(); return; } + if(ilCD>0) ilCD--; time ++; } } diff --git a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java index 38bcb67..786e329 100755 --- a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java +++ b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java @@ -74,11 +74,11 @@ void initSkill() registerSkill(AIFleshRipping.class, 1,EntityAIFleshRipping.class,5); registerSkill(AILightShield.class,1f,EntityAILightShield.class,5); registerSkill(AIMineRay.class,0.7f,EntityAIMineRay.class,5); - registerSkill(AIPenetrateTeleport.class, 2,EntityAIPenetrateTeleport.class,4); + registerSkill(AIPenetrateTeleport.class, 1,EntityAIPenetrateTeleport.class,4); registerSkill(AIRailgun.class, 0.3f,EntityAIRailgun.class,5); registerSkill(AIThunderBolt.class,0.7f,EntityAIThunderBlot.class,5); registerSkill(AIThunderClap.class,0.4f,EntityAIThunderClap.class,5); - registerSkill(AIFlashing.class,100,EntityAIFlashing.class,5); + registerSkill(AIFlashing.class,0.2f,EntityAIFlashing.class,5); } @EventHandler diff --git a/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFakeRailgunAttack.java b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFakeRailgunAttack.java index 161f8cc..32932e4 100644 --- a/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFakeRailgunAttack.java +++ b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFakeRailgunAttack.java @@ -49,6 +49,7 @@ public void updateTask() tick=(tick++)%10; if(tick>=3) return; + boolean success=false; for(BaseSkill skill:list) { if(skill.available()) @@ -58,11 +59,23 @@ public void updateTask() Vec3.createVectorHelper(target.posX, target.posY, target.posZ), BlockSelectors.filNormal); if(skill instanceof AIThunderClap) { - if(result==null) ((AIThunderClap)skill).spell(target.posX,target.posY,target.posZ); + if(result==null) + { + ((AIThunderClap) skill).spell(target.posX, target.posY, target.posZ); + success=true; + } } else if(skill instanceof AIRailgun) { - skill.spell(); + MovingObjectPosition trace = Raytrace.traceLiving(speller,((AIRailgun)skill).getMaxDistance(), EntitySelectors.living(), BlockSelectors.filNothing); + if (trace != null && trace.typeOfHit== MovingObjectPosition.MovingObjectType.ENTITY) + { + if(trace.entityHit==target) + { + skill.spell(); + success=true; + } + } } else if(skill instanceof AIThunderBolt) { @@ -72,12 +85,14 @@ else if(skill instanceof AIThunderBolt) if(trace.entityHit==target) { skill.spell(); + success=true; } } } else if(skill instanceof AIBodyIntensify) { skill.spell(); + success=true; } else if (skill instanceof AIArcGen) { @@ -86,6 +101,7 @@ else if (skill instanceof AIArcGen) if(result.entityHit==target) { skill.spell(); + success=true; } } else if (result != null && result.typeOfHit== MovingObjectPosition.MovingObjectType.BLOCK) @@ -94,10 +110,12 @@ else if (result != null && result.typeOfHit== MovingObjectPosition.MovingObjectT if(block.getMaterial()== Material.wood) { skill.spell(); + success=true; } } } - break; + if(success) + break; } } } diff --git a/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFlashing.java b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFlashing.java index 5cd5e0b..a6a278c 100644 --- a/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFlashing.java +++ b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIFlashing.java @@ -9,6 +9,8 @@ import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.world.World; +import static java.lang.Math.sqrt; + /** * Created by voidcl on 2017/3/10. */ @@ -59,15 +61,15 @@ private boolean hasPlace(World world , double x, double y, double z) public void updateTask() { - double dist=Math.sqrt(this.speller.getDistanceSqToEntity(target)); - double distBtwEntitys=dist; + double dist=sqrt(this.speller.getDistanceSqToEntity(target)); + double distBtwEntities=dist; dist=skill.getMaxDistance(); - if(target!=null && skill.available()&&distBtwEntitys>=3) + if(target!=null && skill.available()&&distBtwEntities>=3) { - double dx= (target.posX-speller.posX)/distBtwEntitys, - dy=(target.posY-speller.posY)/distBtwEntitys, - dz=(target.posZ-speller.posZ)/distBtwEntitys; + double dx= (target.posX-speller.posX)/distBtwEntities, + dy=(target.posY-speller.posY)/distBtwEntities, + dz=(target.posZ-speller.posZ)/distBtwEntities; World world=speller.worldObj; double x = speller.posX + dx * dist; double y = speller.posY + dy * dist; diff --git a/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java b/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java index ed7b578..f729bdc 100644 --- a/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java +++ b/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java @@ -39,28 +39,30 @@ public EntityFakeRaingun(World p_i1738_1_) this.setHealth(this.getMaxHealth()); this.getNavigator().setCanSwim(true); this.tasks.addTask(0, new EntityAISwimming(this)); + this.tasks.addTask(2, new EntityAIAttackOnCollide(this, EntityPlayer.class, 8.0D, false)); this.tasks.addTask(4, new EntityAIFakeRailgunAttack(this)); this.tasks.addTask(5, new EntityAIWander(this, 1.0D)); this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F)); this.tasks.addTask(7, new EntityAILookIdle(this)); - this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true)); + this.targetTasks.addTask(1, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 8, true)); this.targetTasks.addTask(2, new EntityAIHurtByTarget(this, false)); this.experienceValue = 50; - skillList.add(new AIThunderClap(this,0.5f+ RandUtils.rangef(0,0.5f))); + + skillList.add(new AIArcGen(this,0.5f+ RandUtils.rangef(0,0.5f))); + skillList.add(new AIBodyIntensify(this,0.5f+ RandUtils.rangef(0,0.5f))); skillList.add(new AIRailgun(this,0.5f+ RandUtils.rangef(0,0.5f))); skillList.add(new AIThunderBolt(this,0.5f+ RandUtils.rangef(0,0.5f))); - skillList.add(new AIBodyIntensify(this,0.5f+ RandUtils.rangef(0,0.5f))); - skillList.add(new AIArcGen(this,0.5f+ RandUtils.rangef(0,0.5f))); + skillList.add(new AIThunderClap(this,0.5f+ RandUtils.rangef(0,0.5f))); } public void writeEntityToNBT(NBTTagCompound nbt) { super.writeEntityToNBT(nbt); - nbt.setFloat("ThunderClap",skillList.get(0).getSkillExp()); - nbt.setFloat("Railgun",skillList.get(1).getSkillExp()); - nbt.setFloat("ThunderBolt",skillList.get(2).getSkillExp()); - nbt.setFloat("BodyIntensify",skillList.get(3).getSkillExp()); - nbt.setFloat("ArcGen",skillList.get(4).getSkillExp()); + nbt.setFloat("ArcGen",skillList.get(0).getSkillExp()); + nbt.setFloat("BodyIntensify",skillList.get(1).getSkillExp()); + nbt.setFloat("Railgun",skillList.get(2).getSkillExp()); + nbt.setFloat("ThunderBolt",skillList.get(3).getSkillExp()); + nbt.setFloat("ThunderClap",skillList.get(4).getSkillExp()); } @@ -68,11 +70,11 @@ public void readEntityFromNBT(NBTTagCompound nbt) { super.readEntityFromNBT(nbt); skillList.clear(); - skillList.add(new AIThunderClap(this,nbt.getFloat("ThunderClap"))); - skillList.add(new AIRailgun(this,nbt.getFloat("Railgun"))); - skillList.add(new AIThunderBolt(this,nbt.getFloat("ThunderBolt"))); - skillList.add(new AIBodyIntensify(this,nbt.getFloat("BodyIntensify"))); skillList.add(new AIArcGen(this,nbt.getFloat("ArcGen"))); + skillList.add(new AIBodyIntensify(this,nbt.getFloat("BodyIntensify"))); + skillList.add(new AIThunderBolt(this,nbt.getFloat("ThunderBolt"))); + skillList.add(new AIRailgun(this,nbt.getFloat("Railgun"))); + skillList.add(new AIThunderClap(this,nbt.getFloat("ThunderClap"))); } public int getTotalArmorValue() diff --git a/src/main/resources/assets/academymonster/config/default.cfg b/src/main/resources/assets/academymonster/config/default.cfg index 6359707..a9d2eaa 100644 --- a/src/main/resources/assets/academymonster/config/default.cfg +++ b/src/main/resources/assets/academymonster/config/default.cfg @@ -25,6 +25,10 @@ am { prob: 1 } + Flashing + { + prob:0.2 + } FleshRipping { prob:1 @@ -54,6 +58,10 @@ am { prob:0.7 } + ThunderBolt + { + prob:0.7 + } ThunderClap { prob:0.4 From 5b82db0934bafb0638232ef9b215721a73fff90b Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Sat, 11 Mar 2017 20:47:25 +0800 Subject: [PATCH 10/17] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/paindar/academymonster/ability/AILightShield.java | 5 +---- .../paindar/academymonster/entity/EntityLightShield.java | 1 - .../academymonster/entity/ai/EntityAILightShield.java | 1 - .../academymonster/entity/boss/EntityFakeRaingun.java | 7 ------- 4 files changed, 1 insertion(+), 13 deletions(-) diff --git a/src/main/java/cn/paindar/academymonster/ability/AILightShield.java b/src/main/java/cn/paindar/academymonster/ability/AILightShield.java index 4654e7d..ba342d5 100644 --- a/src/main/java/cn/paindar/academymonster/ability/AILightShield.java +++ b/src/main/java/cn/paindar/academymonster/ability/AILightShield.java @@ -1,11 +1,9 @@ package cn.paindar.academymonster.ability; -import cn.academy.vanilla.meltdowner.skill.LightShield; -import cn.lambdalib.util.entityx.EntityAdvanced; + import cn.lambdalib.util.generic.MathUtils; import cn.lambdalib.util.mc.EntitySelectors; import cn.lambdalib.util.mc.WorldUtils; -import cn.paindar.academymonster.core.AcademyMonster; import cn.paindar.academymonster.entity.EntityLightShield; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.entity.Entity; @@ -15,7 +13,6 @@ import net.minecraftforge.event.entity.living.LivingHurtEvent; import java.util.List; -import java.util.function.Predicate; import static cn.lambdalib.util.generic.MathUtils.lerpf; diff --git a/src/main/java/cn/paindar/academymonster/entity/EntityLightShield.java b/src/main/java/cn/paindar/academymonster/entity/EntityLightShield.java index 834504f..328a5b6 100644 --- a/src/main/java/cn/paindar/academymonster/entity/EntityLightShield.java +++ b/src/main/java/cn/paindar/academymonster/entity/EntityLightShield.java @@ -9,7 +9,6 @@ import cn.lambdalib.util.generic.MathUtils; import cn.lambdalib.util.helper.GameTimer; import cn.lambdalib.util.helper.Motion3D; -import cn.paindar.academymonster.core.AcademyMonster; import cpw.mods.fml.common.network.ByteBufUtils; import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; import io.netty.buffer.ByteBuf; diff --git a/src/main/java/cn/paindar/academymonster/entity/ai/EntityAILightShield.java b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAILightShield.java index 66a04f4..fa4af67 100644 --- a/src/main/java/cn/paindar/academymonster/entity/ai/EntityAILightShield.java +++ b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAILightShield.java @@ -1,7 +1,6 @@ package cn.paindar.academymonster.entity.ai; import cn.paindar.academymonster.ability.AILightShield; -import cn.paindar.academymonster.core.AcademyMonster; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.ai.EntityAIBase; diff --git a/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java b/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java index f729bdc..94d0282 100644 --- a/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java +++ b/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java @@ -1,12 +1,9 @@ package cn.paindar.academymonster.entity.boss; import cn.academy.ability.ModuleAbility; -import cn.academy.ability.item.ItemInductionFactor; -import cn.academy.crafting.ModuleCrafting; import cn.academy.vanilla.ModuleVanilla; import cn.lambdalib.util.generic.RandUtils; import cn.paindar.academymonster.ability.*; -import cn.paindar.academymonster.entity.SkillExtendedEntityProperties; import cn.paindar.academymonster.entity.ai.EntityAIFakeRailgunAttack; import net.minecraft.entity.Entity; import net.minecraft.entity.SharedMonsterAttributes; @@ -17,14 +14,10 @@ import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.stats.AchievementList; import net.minecraft.world.World; -import net.minecraftforge.common.ForgeModContainer; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; /** From a6df04c64bba6de6a868b4f62eaf62456d8d3d16 Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Sun, 12 Mar 2017 04:07:43 +0800 Subject: [PATCH 11/17] =?UTF-8?q?=E3=80=90=E7=9F=A2=E9=87=8F=E5=8F=8D?= =?UTF-8?q?=E5=B0=84=E3=80=91=E6=B7=BB=E5=8A=A0=E6=96=B0=E6=8A=80=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E8=B0=83=E6=95=B4=E4=BA=86=E9=83=A8=E5=88=86=E6=A6=82?= =?UTF-8?q?=E7=8E=87=E5=92=8C=E7=BB=8F=E9=AA=8C=E5=85=AC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../academymonster/ability/AIVecReflect.java | 203 ++++++++++++++++++ .../academymonster/ability/BaseSkill.java | 7 + .../academymonster/core/AcademyMonster.java | 73 ++++--- .../entity/boss/EntityFakeRaingun.java | 2 +- .../assets/academymonster/config/default.cfg | 4 + 5 files changed, 258 insertions(+), 31 deletions(-) create mode 100644 src/main/java/cn/paindar/academymonster/ability/AIVecReflect.java diff --git a/src/main/java/cn/paindar/academymonster/ability/AIVecReflect.java b/src/main/java/cn/paindar/academymonster/ability/AIVecReflect.java new file mode 100644 index 0000000..c5014be --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/ability/AIVecReflect.java @@ -0,0 +1,203 @@ +package cn.paindar.academymonster.ability; + +import cn.academy.ability.api.event.ReflectEvent; +import cn.academy.vanilla.vecmanip.skill.EntityAffection; +import cn.lambdalib.util.generic.VecUtils; +import cn.lambdalib.util.helper.Motion3D; +import cn.lambdalib.util.mc.EntitySelectors; +import cn.lambdalib.util.mc.Raytrace; +import cn.lambdalib.util.mc.RichEntity; +import cn.lambdalib.util.mc.WorldUtils; +import cn.paindar.academymonster.core.AcademyMonster; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.projectile.EntityFireball; +import net.minecraft.entity.projectile.EntityLargeFireball; +import net.minecraft.entity.projectile.EntitySmallFireball; +import net.minecraft.entity.projectile.EntityThrowable; +import net.minecraft.util.DamageSource; +import net.minecraft.util.Vec3; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.event.entity.living.LivingDeathEvent; +import net.minecraftforge.event.entity.living.LivingHurtEvent; + +import java.util.List; + +import static cn.lambdalib.util.generic.MathUtils.lerpf; + +/** + * Created by Paindar on 2017/3/11. + */ +public class AIVecReflect extends BaseSkill +{ + private int time=0; + private int maxTime; + private float reflectRate; + public AIVecReflect(EntityLivingBase speller, float exp) + { + super(speller, (int)lerpf(400,300,exp), exp, "vecmanip.vec_reflection"); + maxTime=(int)lerpf(60,120,exp); + reflectRate=lerpf(0.3f,2f,exp); + MinecraftForge.EVENT_BUS.register(this); + } + @Override + public void spell() + { + throw new RuntimeException(); + } + + @Override + public void onTick() + { + if (time == 0) + { + if(isChanting) + { + isChanting = false; + super.spell(); + } + return; + } + time--; + if(speller==null) + return; + // + List entities = WorldUtils.getEntities(speller, 5, (Entity entity) -> (!EntityAffection.isMarked(entity))); + for (Entity entity : entities) + { + + if (entity instanceof EntityFireball) + { + createNewFireball((EntityFireball) entity); + } + else if(!(entity instanceof EntityLivingBase)) + { + reflect(entity, speller); + + EntityAffection.mark(entity); + } + + + } + } + + @SubscribeEvent + public void onReflect(ReflectEvent evt) + { + if (evt.target.equals(speller)&&isChanting) { + evt.setCanceled(true); + + Vec3 dpos = VecUtils.subtract(new RichEntity(evt.player).headPosition(), new RichEntity(speller).headPosition()); + } + } + + /** + * @param passby If passby=true, and this isn't a complete absorb, the action will not perform. Else it will. + * @return (Whether action had been really performed, processed damage) + */ + private float handleAttack(DamageSource dmgSource, float dmg,Boolean passby) + { + + float returnRatio = reflectRate; + if (!passby) { // Perform the action. + Entity sourceEntity = dmgSource.getSourceOfDamage(); + + if (sourceEntity != null && sourceEntity != speller) { + if(sourceEntity instanceof EntityLivingBase) + attack((EntityLivingBase) sourceEntity, returnRatio*dmg); + else + { + reflect(sourceEntity, speller); + EntityAffection.mark(sourceEntity); + } + } + return Math.max(0,dmg*(1-returnRatio)); + } else { + return Math.max(0,dmg*(1-returnRatio)); + } + } + + @SubscribeEvent + public void onLivingAttack(LivingAttackEvent evt) + { + if (evt.entityLiving.equals(speller)&&isChanting) { + + if ( handleAttack(evt.source, evt.ammount, true)<=0) { + evt.setCanceled(true); + } + } +} + @SubscribeEvent + public void onLivingHurt(LivingHurtEvent evt) + { + if(isSkillInCooldown()&&!isChanting) + return; + if(!isChanting) + { + isChanting = true; + time=maxTime; + } + if (evt.entityLiving.equals(speller)) + { + evt.ammount = handleAttack(evt.source, evt.ammount, false); + } +} + + private static void reflect(Entity entity,EntityLivingBase player) + { +// Vec3 lookPos = Vec3.createVectorHelper(player.posX-entity.posX,player.posY-entity.posY,player.posZ-entity.posZ); +// VecUtils.multiply(lookPos,20.0/lookPos.lengthVector()); + Vec3 lookPos = Raytrace.getLookingPos(player, 20).getLeft(); + double speed = VecUtils.vec(entity.motionX, entity.motionY, entity.motionZ).lengthVector(); + Vec3 vel = VecUtils.multiply(VecUtils.subtract(lookPos,(new RichEntity(entity)).headPosition()).normalize(),speed); + new RichEntity(entity).setVel(vel); + + } + + private void createNewFireball(EntityFireball source) + { + source.setDead(); + + EntityLivingBase shootingEntity = source.shootingEntity; + EntityFireball fireball = null; + if(source instanceof EntityLargeFireball) + { + fireball = new EntityLargeFireball(((EntityLargeFireball) source).worldObj, shootingEntity, shootingEntity.posX, + shootingEntity.posY, shootingEntity.posZ); + ((EntityLargeFireball)fireball).field_92057_e = ((EntityLargeFireball)source).field_92057_e; + } + else + { + if(source.shootingEntity==null) + { + fireball = new EntitySmallFireball(source.worldObj, source.posX, source.posY, source.posZ, + source.posX, source.posY, source.posZ); + + } + else + { + fireball = new EntitySmallFireball(source.worldObj, shootingEntity, shootingEntity.posX, + shootingEntity.posY, shootingEntity.posZ); + } + } + fireball.setPosition(source.posX, source.posY, source.posZ); + Vec3 lookPos = Raytrace.getLookingPos(speller, 20).getLeft(); + double speed = VecUtils.vec(source.motionX, source.motionY, source.motionZ).lengthVector(); + Vec3 vel = VecUtils.multiply(VecUtils.subtract(lookPos,(new RichEntity(source)).headPosition()).normalize(),speed); + new RichEntity(fireball).setVel(vel); + EntityAffection.mark(fireball); + source.worldObj.spawnEntityInWorld(fireball); + } + + @Override + @SubscribeEvent + public void onSpellerDeath(LivingDeathEvent event) + { + MinecraftForge.EVENT_BUS.unregister(this); + super.onSpellerDeath(event); + } + +} diff --git a/src/main/java/cn/paindar/academymonster/ability/BaseSkill.java b/src/main/java/cn/paindar/academymonster/ability/BaseSkill.java index fe51560..90412d0 100644 --- a/src/main/java/cn/paindar/academymonster/ability/BaseSkill.java +++ b/src/main/java/cn/paindar/academymonster/ability/BaseSkill.java @@ -8,6 +8,7 @@ import cpw.mods.fml.common.gameevent.TickEvent.ServerTickEvent; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.StatCollector; +import net.minecraftforge.event.entity.living.LivingDeathEvent; /** * Created by Paindar on 2017/2/9. @@ -88,4 +89,10 @@ public boolean available() public String getUnlocalizedSkillName(){return "ac.ability." + skillName + ".name";} public String getSkillName(){return StatCollector.translateToLocal(skillName);} + @SubscribeEvent + public void onSpellerDeath(LivingDeathEvent event) + { + + FMLCommonHandler.instance().bus().unregister(this); + } } diff --git a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java index 786e329..439174c 100755 --- a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java +++ b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java @@ -6,7 +6,6 @@ import cn.paindar.academymonster.core.command.CommandTest; import cn.paindar.academymonster.entity.SkillExtendedEntityProperties; import cn.paindar.academymonster.entity.ai.*; -import com.typesafe.config.Config; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.Mod.Instance; @@ -19,7 +18,6 @@ import net.minecraft.entity.boss.IBossDisplayData; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.monster.IMob; -import net.minecraftforge.common.config.Configuration; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -71,6 +69,7 @@ void initSkill() registerSkill(AIBodyIntensify.class, 1,EntityAIBodyIntensify.class,5); registerSkill(AIDirectedShock.class, 2,EntityAIDirectedShock.class,5); registerSkill(AIElectronBomb.class, 1,EntityAIElectronBomb.class,5); + registerSkill(AIFlashing.class,0.2f,EntityAIFlashing.class,5); registerSkill(AIFleshRipping.class, 1,EntityAIFleshRipping.class,5); registerSkill(AILightShield.class,1f,EntityAILightShield.class,5); registerSkill(AIMineRay.class,0.7f,EntityAIMineRay.class,5); @@ -78,7 +77,7 @@ void initSkill() registerSkill(AIRailgun.class, 0.3f,EntityAIRailgun.class,5); registerSkill(AIThunderBolt.class,0.7f,EntityAIThunderBlot.class,5); registerSkill(AIThunderClap.class,0.4f,EntityAIThunderClap.class,5); - registerSkill(AIFlashing.class,0.2f,EntityAIFlashing.class,5); + registerSkill(AIVecReflect.class, 0.3f,null,5); } @EventHandler @@ -153,18 +152,20 @@ public void addSkill(EntityLiving entity) BaseSkill skill; Class aClass; Constructor[] tempConstructor; - Class[] parameterTypes; + Class[] parameterTypes=new Class[2]; float randExp=RandUtils.rangef(0, 1); try { constructor = elem.getConstructor(EntityLivingBase.class, float.class); - skill = (BaseSkill) constructor.newInstance(entity, randExp * randExp); + skill = (BaseSkill) constructor.newInstance(entity, 1- randExp * randExp); aClass = aiList.get(id); - - tempConstructor = aClass.getDeclaredConstructors(); - parameterTypes = tempConstructor[0].getParameterTypes(); - constructor = aClass.getConstructor(parameterTypes[0], parameterTypes[1]); + if(aClass!=null) + { + tempConstructor = aClass.getDeclaredConstructors(); + parameterTypes = tempConstructor[0].getParameterTypes(); + constructor = aClass.getConstructor(parameterTypes[0], parameterTypes[1]); + } } catch(Exception e) @@ -174,15 +175,20 @@ public void addSkill(EntityLiving entity) throw new RuntimeException(); } EntityAIBase baseAI; - try{baseAI=(EntityAIBase)constructor.newInstance(entity,skill);} - catch (Exception e) + if(aClass!=null) { - AcademyMonster.log.error("param1: " + parameterTypes[0] + " , param2:" + parameterTypes[1]); - AcademyMonster.log.error("Argument: " + entity + " , " + skill); - e.printStackTrace(); - throw new RuntimeException(); + try + { + baseAI = (EntityAIBase) constructor.newInstance(entity, skill); + } catch (Exception e) + { + AcademyMonster.log.error("param1: " + parameterTypes[0] + " , param2:" + parameterTypes[1]); + AcademyMonster.log.error("Argument: " + entity + " , " + skill); + e.printStackTrace(); + throw new RuntimeException(); + } + entity.tasks.addTask(aiLevelList.get(id), baseAI); } - entity.tasks.addTask(aiLevelList.get(id),baseAI); string+= skill.getUnlocalizedSkillName()+"~"+randExp+"-"; prob*=factor; } @@ -235,7 +241,7 @@ public void refreshSkills(EntityLiving entity,String skillStr) BaseSkill skill; Class aClass; Constructor[] tempConstructor; - Class[] parameterTypes; + Class[] parameterTypes=new Class[2]; float randExp=0; try { @@ -243,8 +249,8 @@ public void refreshSkills(EntityLiving entity,String skillStr) } catch(NumberFormatException e) { - System.out.println("Failed to translate "+entity + " in "+skillStr); - e.printStackTrace(); + log.warn("Failed to translate "+entity + " in "+skillStr); + randExp=0; } int id=skillList.indexOf(skillClass); try @@ -253,10 +259,12 @@ public void refreshSkills(EntityLiving entity,String skillStr) skill = (BaseSkill) constructor.newInstance(entity, randExp); aClass = aiList.get(id); - - tempConstructor = aClass.getDeclaredConstructors(); - parameterTypes = tempConstructor[0].getParameterTypes(); - constructor = aClass.getConstructor(parameterTypes[0], parameterTypes[1]); + if(aClass!=null) + { + tempConstructor = aClass.getDeclaredConstructors(); + parameterTypes = tempConstructor[0].getParameterTypes(); + constructor = aClass.getConstructor(parameterTypes[0], parameterTypes[1]); + } } catch(Exception e) @@ -266,15 +274,20 @@ public void refreshSkills(EntityLiving entity,String skillStr) throw new RuntimeException(); } EntityAIBase baseAI; - try{baseAI=(EntityAIBase)constructor.newInstance(entity,skill);} - catch (Exception e) + if(aClass!=null) { - AcademyMonster.log.error("param1: " + parameterTypes[0] + " , param2:" + parameterTypes[1]); - AcademyMonster.log.error("Argument: " + entity + " , " + skill); - e.printStackTrace(); - throw new RuntimeException(); + try + { + baseAI = (EntityAIBase) constructor.newInstance(entity, skill); + } catch (Exception e) + { + AcademyMonster.log.error("param1: " + parameterTypes[0] + " , param2:" + parameterTypes[1]); + AcademyMonster.log.error("Argument: " + entity + " , " + skill); + e.printStackTrace(); + throw new RuntimeException(); + } + entity.tasks.addTask(aiLevelList.get(id), baseAI); } - entity.tasks.addTask(aiLevelList.get(id),baseAI); } } } diff --git a/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java b/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java index 94d0282..c3e4fb8 100644 --- a/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java +++ b/src/main/java/cn/paindar/academymonster/entity/boss/EntityFakeRaingun.java @@ -98,7 +98,7 @@ protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(40.0D); - this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.50D); + this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.20D); this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(60); } diff --git a/src/main/resources/assets/academymonster/config/default.cfg b/src/main/resources/assets/academymonster/config/default.cfg index a9d2eaa..bf03efb 100644 --- a/src/main/resources/assets/academymonster/config/default.cfg +++ b/src/main/resources/assets/academymonster/config/default.cfg @@ -66,6 +66,10 @@ am { prob:0.4 } + VecReflect + { + prob:0.3 + } } monster { From 98b6b9f96495ba270d89a6b5f601a1029f1a908a Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Sun, 12 Mar 2017 11:47:28 +0800 Subject: [PATCH 12/17] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=9D=9E=E9=87=8D=E8=A6=81=E7=9A=84=E6=8A=A5=E9=94=99=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/paindar/academymonster/core/AcademyMonster.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java index 439174c..6a71cb5 100755 --- a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java +++ b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java @@ -78,6 +78,7 @@ void initSkill() registerSkill(AIThunderBolt.class,0.7f,EntityAIThunderBlot.class,5); registerSkill(AIThunderClap.class,0.4f,EntityAIThunderClap.class,5); registerSkill(AIVecReflect.class, 0.3f,null,5); + registerSkill(AIScatterBomb.class,70f,EntityAIScatterBomb.class,5); } @EventHandler @@ -249,7 +250,7 @@ public void refreshSkills(EntityLiving entity,String skillStr) } catch(NumberFormatException e) { - log.warn("Failed to translate "+entity + " in "+skillStr); + //log.warn("Failed to translate "+entity + " in "+skillStr); randExp=0; } int id=skillList.indexOf(skillClass); From 86e23247cd4796ec8356dd637412149b614a3ff3 Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Sun, 12 Mar 2017 11:47:49 +0800 Subject: [PATCH 13/17] =?UTF-8?q?=E3=80=90=E7=94=B5=E5=AD=90=E5=85=89?= =?UTF-8?q?=E6=9D=9F=E3=80=91=E4=BF=AE=E5=A4=8D=E5=85=89=E7=90=83=E6=95=88?= =?UTF-8?q?=E6=9E=9C=E4=B8=8D=E6=98=BE=E7=A4=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../academymonster/entity/EntityLoader.java | 3 +- .../entity/EntityMdBallNative.java | 71 +++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/main/java/cn/paindar/academymonster/entity/EntityLoader.java b/src/main/java/cn/paindar/academymonster/entity/EntityLoader.java index f4cef1c..0d64d2e 100644 --- a/src/main/java/cn/paindar/academymonster/entity/EntityLoader.java +++ b/src/main/java/cn/paindar/academymonster/entity/EntityLoader.java @@ -28,7 +28,7 @@ public EntityLoader() @SideOnly(Side.CLIENT) public static void registerRenders() { - registerEntityRender(EntityMdBallNative.class, new EntityMdBall.R()); + registerEntityRender(EntityMdBallNative.class, new EntityMdBallNative.R()); registerEntityRender(EntityCoinThrowingNative.class,new EntityCoinThrowingNative.R()); registerEntityRender(EntityRailgunFXNative.class,new EntityRailgunFXNative.R()); registerEntityRender(EntityArcNative.class,new EntityArcNative.Renderer()); @@ -42,6 +42,7 @@ public static void registerEntity() registerEntity(EntityMineRayNative.class,"am_mine_ray_eff",15,1,true); registerEntity(EntityLightShield.class,"am_light_shield_eff",15,1,true); registerEntity(EntityCoinThrowingNative.class,"am_coin_throwing_eff",15,1,true); + registerEntity(EntityMdBallNative.class,"am_meltdown_ball_eff",15,1,true); registerEntity(EntityFakeRaingun.class,"am_fake_railgun",40,1,true); for(BiomeGenBase biome:BiomeGenBase.getBiomeGenArray()) { diff --git a/src/main/java/cn/paindar/academymonster/entity/EntityMdBallNative.java b/src/main/java/cn/paindar/academymonster/entity/EntityMdBallNative.java index 9684618..ebe81bf 100644 --- a/src/main/java/cn/paindar/academymonster/entity/EntityMdBallNative.java +++ b/src/main/java/cn/paindar/academymonster/entity/EntityMdBallNative.java @@ -1,5 +1,10 @@ package cn.paindar.academymonster.entity; +import cn.academy.core.Resources; +import cn.academy.core.client.ACRenderingHelper; +import cn.lambdalib.template.client.render.entity.RenderIcon; +import cn.lambdalib.util.client.RenderUtils; +import cn.lambdalib.util.client.shader.ShaderSimple; import cn.lambdalib.util.entityx.EntityAdvanced; import cn.lambdalib.util.entityx.EntityCallback; import cn.lambdalib.util.generic.MathUtils; @@ -7,11 +12,16 @@ import cn.lambdalib.util.helper.GameTimer; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; /** * Created by Paindar on 2017/2/10. @@ -232,5 +242,66 @@ private void updatePosition() { posZ = spawner.posZ + subZ; } + @SideOnly(Side.CLIENT) + public static class R extends RenderIcon + { + + ResourceLocation[] textures; + ResourceLocation glowTexture; + + public R() { + super(null); + textures = Resources.getEffectSeq("mdball", MAX_TETXURES); + glowTexture = Resources.getTexture("effects/mdball/glow"); + //this.minTolerateAlpha = 0.05f; + this.shadowOpaque = 0; + } + + @Override + public void doRender(Entity par1Entity, double x, double y, + double z, float par8, float par9) { + if(RenderUtils.isInShadowPass()) { + return; + } + + EntityMdBallNative ent = (EntityMdBallNative) par1Entity; + if(!ent.updateRenderTick()) + return; + + EntityPlayer clientPlayer = Minecraft.getMinecraft().thePlayer; + + //HACK: Force set the render pos to prevent glitches + { + x = ent.posX - clientPlayer.posX; + y = ent.posY - clientPlayer.posY; + z = ent.posZ - clientPlayer.posZ; + y += 1.6; + } + + GL11.glPushMatrix(); + { + ShaderSimple.instance().useProgram(); + GL11.glTranslated(ent.offsetX, ent.offsetY, ent.offsetZ); + + double alpha = ent.getAlpha(); + float size = ent.getSize(); + + //Glow texture + this.color.a = alpha * (0.3 + ent.alphaWiggle * 0.7); + this.icon = glowTexture; + this.setSize(0.7f * size); + super.doRender(par1Entity, x, y, z, par8, par9); + + //Core + this.color.a = alpha * (0.8 + 0.2 * ent.alphaWiggle); + this.icon = textures[ent.texID]; + this.setSize(0.5f * size); + super.doRender(par1Entity, x, y, z, par8, par9); + GL20.glUseProgram(0); + } + GL11.glPopMatrix(); + } + + } } From 302f0cfedf4775343244efe3db76d68699034453 Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Sun, 12 Mar 2017 11:48:02 +0800 Subject: [PATCH 14/17] =?UTF-8?q?=E3=80=90=E7=94=B5=E5=AD=90=E5=BC=B9?= =?UTF-8?q?=E6=95=A3=E5=B0=84=E3=80=91=E6=96=B0=E5=A2=9E=E7=94=B5=E5=AD=90?= =?UTF-8?q?=E5=BC=B9=E6=95=A3=E5=B0=84=E6=8A=80=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../academymonster/ability/AIScatterBomb.java | 111 ++++++++++++++++++ .../entity/ai/EntityAIScatterBomb.java | 60 ++++++++++ 2 files changed, 171 insertions(+) create mode 100644 src/main/java/cn/paindar/academymonster/ability/AIScatterBomb.java create mode 100644 src/main/java/cn/paindar/academymonster/entity/ai/EntityAIScatterBomb.java diff --git a/src/main/java/cn/paindar/academymonster/ability/AIScatterBomb.java b/src/main/java/cn/paindar/academymonster/ability/AIScatterBomb.java new file mode 100644 index 0000000..1133308 --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/ability/AIScatterBomb.java @@ -0,0 +1,111 @@ +package cn.paindar.academymonster.ability; + +import cn.lambdalib.util.generic.RandUtils; +import cn.lambdalib.util.generic.VecUtils; +import cn.lambdalib.util.helper.Motion3D; +import cn.lambdalib.util.mc.EntitySelectors; +import cn.lambdalib.util.mc.Raytrace; +import cn.lambdalib.util.mc.WorldUtils; +import cn.paindar.academymonster.entity.EntityMdBallNative; +import cn.paindar.academymonster.network.NetworkManager; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; + +import java.util.ArrayList; +import java.util.List; + +import static cn.lambdalib.util.generic.MathUtils.lerpf; + +/** + * Created by Paindar on 2017/3/12. + */ +public class AIScatterBomb extends BaseSkill +{ + private List ballList=new ArrayList<>(); + private float damage; + private float range; + private float time; + private final float maxTime=240; + public AIScatterBomb(EntityLivingBase speller, float exp) + { + super(speller, (int)lerpf(160,100,exp), exp, "meltdowner.scatter_bomb"); + damage=lerpf(3,9,exp); + range=lerpf(5,11,exp); + } + + @Override + public void spell() + { + if(isSkillInCooldown()) + return; + if(isChanting) + { + List trgList= WorldUtils.getEntities(speller,range, EntitySelectors.living().and(EntitySelectors.exclude(speller))); + Vec3 dst=new Motion3D(speller, 5, true).move(range).getPosVec(); + for(EntityMdBallNative ball:ballList) + { + Vec3 str= VecUtils.vec(ball.posX, ball.posY, ball.posZ); + if(!trgList.isEmpty()) + { + dst=new Motion3D(trgList.get(RandUtils.nextInt(trgList.size())),5,true).getPosVec(); + } + MovingObjectPosition trace = Raytrace.perform(speller.worldObj,str,dst + , EntitySelectors.exclude(speller).and(EntitySelectors.living())); + if (trace != null && trace.entityHit != null) + { + attack((EntityLivingBase) trace.entityHit, damage); + List list= WorldUtils.getEntities(speller, 25, EntitySelectors.player()); + for(Entity e:list) + { + NetworkManager.sendMdRayEffectTo(str,dst,(EntityPlayerMP)e); + } + } + ball.setDead(); + } + ballList.clear(); + isChanting=false; + super.spell(); + } + else + { + isChanting=true; + time=0; + + } + } + + @Override + public void onTick() + { + if(!isChanting) + return; + + time++; + if(speller.isDead) + { + isChanting=false; + for(EntityMdBallNative ball:ballList) + { + ball.setDead(); + super.spell(); + } + } + if(time>20&&time%10==0 && time<=100) + { + EntityMdBallNative ball=new EntityMdBallNative(speller,2333333); + ballList.add(ball); + speller.worldObj.spawnEntityInWorld(ball); + } + else if(time>=maxTime) + { + spell(); + } + } + + public int getBallSize(){return ballList.size();} + + public float getMaxDistance(){return range;} +} diff --git a/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIScatterBomb.java b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIScatterBomb.java new file mode 100644 index 0000000..42df0c8 --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIScatterBomb.java @@ -0,0 +1,60 @@ +package cn.paindar.academymonster.entity.ai; + +import cn.paindar.academymonster.ability.AIScatterBomb; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAIBase; + +/** + * Created by Paindar on 2017/3/12. + */ +public class EntityAIScatterBomb extends EntityAIBase +{ + private final EntityLiving speller; + private EntityLivingBase target; + private AIScatterBomb skill; + + public EntityAIScatterBomb(EntityLiving speller,AIScatterBomb skill) + { + this.speller=speller; + this.skill=skill; + } + + @Override + public boolean shouldExecute() + { + EntityLivingBase target=speller.getAttackTarget(); + if (target==null|| skill.isSkillInCooldown()) + return false; + double dist=speller.getDistanceSqToEntity(target); + return this.speller.getAttackTarget().isEntityAlive() && !skill.isSkillInCooldown() && dist >= 2.25 && dist <= skill.getMaxDistance() * skill.getMaxDistance(); + } + + public void startExecuting() + { + this.target =this.speller.getAttackTarget(); + } + + @Override + public void updateTask() + { + if(target!=null) + { + if(!skill.isChanting()) + { + skill.spell(); + } + else + { + double range = speller.getDistanceSqToEntity(target); + if (range <= skill.getMaxDistance() * skill.getMaxDistance()) + { + if(skill.getBallSize()>=7) + { + skill.spell(); + } + } + } + } + } +} From 3c86853fad6bcdc90f8b761400927d26c5ad3c40 Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Sun, 12 Mar 2017 14:12:23 +0800 Subject: [PATCH 15/17] =?UTF-8?q?=E3=80=90=E5=B7=A1=E8=88=AA=E5=85=89?= =?UTF-8?q?=E6=9D=9F=E7=82=AE=E3=80=91=E6=B7=BB=E5=8A=A0=E6=8A=80=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ability/AIElectronMissile.java | 87 +++++++++++++++++++ .../academymonster/core/AcademyMonster.java | 3 +- .../entity/ai/EntityAIElectronMissile.java | 38 ++++++++ .../assets/academymonster/config/default.cfg | 8 ++ 4 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/paindar/academymonster/ability/AIElectronMissile.java create mode 100644 src/main/java/cn/paindar/academymonster/entity/ai/EntityAIElectronMissile.java diff --git a/src/main/java/cn/paindar/academymonster/ability/AIElectronMissile.java b/src/main/java/cn/paindar/academymonster/ability/AIElectronMissile.java new file mode 100644 index 0000000..71ae069 --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/ability/AIElectronMissile.java @@ -0,0 +1,87 @@ +package cn.paindar.academymonster.ability; + +import cn.lambdalib.util.generic.VecUtils; +import cn.lambdalib.util.helper.Motion3D; +import cn.lambdalib.util.mc.EntitySelectors; +import cn.lambdalib.util.mc.WorldUtils; +import cn.paindar.academymonster.entity.EntityMdBallNative; +import cn.paindar.academymonster.network.NetworkManager; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.Vec3; + +import java.util.ArrayList; +import java.util.List; + +import static cn.lambdalib.util.generic.MathUtils.lerpf; + +/** + * Created by Paindar on 2017/3/12. + */ +public class AIElectronMissile extends BaseSkill +{ + private List ballList=new ArrayList<>(); + private int freq; + private int time; + private int maxTick; + private float range; + private float damage; + public AIElectronMissile(EntityLivingBase speller, float exp) + { + super(speller, (int)lerpf(800,400,exp), exp, "meltdowner.electron_missile"); + freq=(int)lerpf(20,10,exp); + maxTick=(int)lerpf(100,200,exp); + range=(int)lerpf(8,12,exp); + damage=lerpf(5,12,exp); + } + + @Override + public void spell() + { + if(!available()) + return; + isChanting=true; + time=0; + } + + @Override + public void onTick() + { + if(!isChanting) + return; + + time++; + if(speller.isDead || time>=maxTick) + { + isChanting=false; + super.spell(); + for(EntityMdBallNative ball:ballList) + { + ball.setDead(); + } + } + if(time%freq==0) + { + EntityMdBallNative ball=new EntityMdBallNative(speller,2333333); + ballList.add(ball); + speller.worldObj.spawnEntityInWorld(ball); + } + List list=WorldUtils.getEntities(speller,range,EntitySelectors.exclude(speller).and(EntitySelectors.living())); + if(!list.isEmpty() && !ballList.isEmpty()) + { + Vec3 str= VecUtils.vec(ballList.get(0).posX, ballList.get(0).posY, ballList.get(0).posZ); + Vec3 dst=new Motion3D(list.get(0),5,true).getPosVec(); + attack((EntityLivingBase) list.get(0), damage); + list= WorldUtils.getEntities(speller, 25, EntitySelectors.player()); + for(Entity e:list) + { + NetworkManager.sendMdRayEffectTo(str,dst,(EntityPlayerMP)e); + } + ballList.get(0).setDead(); + ballList.remove(0); + } + } + + public float getMaxDistance(){return range;} +} diff --git a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java index 6a71cb5..b85bf68 100755 --- a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java +++ b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java @@ -69,6 +69,7 @@ void initSkill() registerSkill(AIBodyIntensify.class, 1,EntityAIBodyIntensify.class,5); registerSkill(AIDirectedShock.class, 2,EntityAIDirectedShock.class,5); registerSkill(AIElectronBomb.class, 1,EntityAIElectronBomb.class,5); + registerSkill(AIElectronMissile.class,0.1f,EntityAIElectronMissile.class,5); registerSkill(AIFlashing.class,0.2f,EntityAIFlashing.class,5); registerSkill(AIFleshRipping.class, 1,EntityAIFleshRipping.class,5); registerSkill(AILightShield.class,1f,EntityAILightShield.class,5); @@ -78,7 +79,7 @@ void initSkill() registerSkill(AIThunderBolt.class,0.7f,EntityAIThunderBlot.class,5); registerSkill(AIThunderClap.class,0.4f,EntityAIThunderClap.class,5); registerSkill(AIVecReflect.class, 0.3f,null,5); - registerSkill(AIScatterBomb.class,70f,EntityAIScatterBomb.class,5); + registerSkill(AIScatterBomb.class,0.5f,EntityAIScatterBomb.class,5); } @EventHandler diff --git a/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIElectronMissile.java b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIElectronMissile.java new file mode 100644 index 0000000..124ad8d --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIElectronMissile.java @@ -0,0 +1,38 @@ +package cn.paindar.academymonster.entity.ai; + +import cn.paindar.academymonster.ability.AIElectronMissile; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAIBase; + +/** + * Created by Paindar on 2017/3/12. + */ +public class EntityAIElectronMissile extends EntityAIBase +{ + private final EntityLiving speller; + private EntityLivingBase target; + private AIElectronMissile skill; + + public EntityAIElectronMissile(EntityLiving speller,AIElectronMissile skill) + { + this.speller=speller; + this.skill=skill; + } + + @Override + public boolean shouldExecute() + { + EntityLivingBase target=speller.getAttackTarget(); + if (target==null|| !skill.available()) + return false; + double dist=speller.getDistanceSqToEntity(target); + return this.speller.getAttackTarget().isEntityAlive() && skill.available() && dist >= 2.25 && dist <= skill.getMaxDistance() * skill.getMaxDistance(); + } + + public void startExecuting() + { + skill.spell(); + } + +} diff --git a/src/main/resources/assets/academymonster/config/default.cfg b/src/main/resources/assets/academymonster/config/default.cfg index bf03efb..e065cb4 100644 --- a/src/main/resources/assets/academymonster/config/default.cfg +++ b/src/main/resources/assets/academymonster/config/default.cfg @@ -25,6 +25,10 @@ am { prob: 1 } + ElectronMissile + { + prob:0.1 + } Flashing { prob:0.2 @@ -70,6 +74,10 @@ am { prob:0.3 } + ScatterBomb + { + prob:0.5f + } } monster { From e1d22133fea42ea37516bcc5dbcc9155f181b97c Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Mon, 13 Mar 2017 12:26:25 +0800 Subject: [PATCH 16/17] =?UTF-8?q?=E3=80=90Meltdowner=E3=80=91=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=8E=9F=E5=AD=90=E5=85=89=E7=82=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../academymonster/ability/AIMeltdowner.java | 148 ++++++++++++++++++ .../academymonster/core/AcademyMonster.java | 1 + .../academymonster/entity/EntityLoader.java | 1 + .../entity/EntityMDRayNative.java | 65 ++++++++ .../entity/ai/EntityAIMeltdowner.java | 62 ++++++++ .../network/MessageMeltdownerEffect.java | 68 ++++++++ .../network/NetworkManager.java | 12 ++ .../assets/academymonster/config/default.cfg | 5 + 8 files changed, 362 insertions(+) create mode 100644 src/main/java/cn/paindar/academymonster/ability/AIMeltdowner.java create mode 100644 src/main/java/cn/paindar/academymonster/entity/EntityMDRayNative.java create mode 100644 src/main/java/cn/paindar/academymonster/entity/ai/EntityAIMeltdowner.java create mode 100644 src/main/java/cn/paindar/academymonster/network/MessageMeltdownerEffect.java diff --git a/src/main/java/cn/paindar/academymonster/ability/AIMeltdowner.java b/src/main/java/cn/paindar/academymonster/ability/AIMeltdowner.java new file mode 100644 index 0000000..9a8b8e4 --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/ability/AIMeltdowner.java @@ -0,0 +1,148 @@ +package cn.paindar.academymonster.ability; + +import cn.academy.core.event.BlockDestroyEvent; +import cn.lambdalib.util.generic.MathUtils; +import cn.lambdalib.util.generic.RandUtils; +import cn.lambdalib.util.generic.VecUtils; +import cn.lambdalib.util.helper.Motion3D; +import cn.lambdalib.util.mc.EntitySelectors; +import cn.lambdalib.util.mc.WorldUtils; +import cn.paindar.academymonster.config.AMConfig; +import cn.paindar.academymonster.network.NetworkManager; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Predicate; + +import static cn.lambdalib.util.generic.MathUtils.lerpf; +import static cn.lambdalib.util.generic.VecUtils.*; + +/** + * Created by Paindar on 2017/3/12. + */ +public class AIMeltdowner extends BaseSkill +{ + private static final double STEP = 0.5; + private float damage; + private float range =2; + private int maxIncrement = 16; + public AIMeltdowner(EntityLivingBase speller,float exp) + { + super(speller, (int)lerpf(800, 600, exp), exp,"meltdowner.meltdowner"); + maxIncrement=(int)lerpf(12,25,exp); + damage=lerpf(40, 150, exp); + } + + + public float getMaxDistance(){return maxIncrement;} + + private void destroyBlock(World world, int x, int y, int z) { + Block block = world.getBlock(x, y, z); + float hardness = block.getBlockHardness(world, x, y, z); + if(hardness < 0) + return ; + if(!MinecraftForge.EVENT_BUS.post(new BlockDestroyEvent(world, x, y, z))) + { + if(block.getMaterial() != Material.air) { + block.dropBlockAsItemWithChance(world, x, y, z, + world.getBlockMetadata(x, y, z), 0.05f, 0); + } + world.setBlockToAir(x, y, z); + } + } + + @Override + public void spell() + { + if(isSkillInCooldown()) + return; + super.spell(); + Motion3D motion=new Motion3D(speller, true).move(0.1).normalize(); + float yaw = -MathUtils.PI_F * 0.5f - motion.getRotationYawRadians(), + pitch = motion.getRotationPitchRadians(); + Set processed = new HashSet<>(); + World world=speller.worldObj; + Vec3 start = motion.getPosVec(); + Vec3 slope = motion.getMotionVec(); + + Vec3 vp0 = VecUtils.vec(0, 0, 1); + vp0.rotateAroundZ(pitch); + vp0.rotateAroundY(yaw); + + Vec3 vp1 = VecUtils.vec(0, 1, 0); + vp1.rotateAroundZ(pitch); + vp1.rotateAroundY(yaw); + + + /* Apply Entity Damage */ + { + Vec3 v0 = add(start, add(multiply(vp0, -range), multiply(vp1, -range))), + v1 = add(start, add(multiply(vp0, range), multiply(vp1, -range))), + v2 = add(start, add(multiply(vp0, range), multiply(vp1, range))), + v3 = add(start, add(multiply(vp0, -range), multiply(vp1, range))), + v4 = add(v0, multiply(slope, maxIncrement)), + v5 = add(v1, multiply(slope, maxIncrement)), + v6 = add(v2, multiply(slope, maxIncrement)), + v7 = add(v3, multiply(slope, maxIncrement)); + AxisAlignedBB aabb = WorldUtils.minimumBounds(v0, v1, v2, v3, v4, v5, v6, v7); + + Predicate areaSelector = target -> { + Vec3 dv = subtract(vec(target.posX, target.posY, target.posZ), start); + Vec3 proj = dv.crossProduct(slope); + return proj.lengthVector() < range * 1.2; + }; + List targets = WorldUtils.getEntities(speller.worldObj, aabb, EntitySelectors.everything().and(areaSelector).and(EntitySelectors.exclude(speller))); + + for (Entity e : targets) + { + if (e instanceof EntityLivingBase) + { + attack((EntityLivingBase) e, damage); + } else + { + e.setDead(); + } + } + } + + if(AMConfig.getBoolean("am.skill.meltdowner.destroyBlock",true)) + { + for(int i=1;i rr * rr) + continue; + Vec3 pos = VecUtils.add(str, + VecUtils.add( + VecUtils.multiply(vp0, s), + VecUtils.multiply(vp1, t))); + destroyBlock(world,(int) pos.xCoord,(int) pos.yCoord,(int) pos.zCoord); + } + } + } + } + if(!speller.worldObj.isRemote) + { + List list=WorldUtils.getEntities(speller, 40, EntitySelectors.player()); + for(Entity e:list) + { + NetworkManager.sendMeltdownerEffectTo(speller,maxIncrement,(EntityPlayerMP)e); + } + } + } +} diff --git a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java index b85bf68..3900ac0 100755 --- a/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java +++ b/src/main/java/cn/paindar/academymonster/core/AcademyMonster.java @@ -80,6 +80,7 @@ void initSkill() registerSkill(AIThunderClap.class,0.4f,EntityAIThunderClap.class,5); registerSkill(AIVecReflect.class, 0.3f,null,5); registerSkill(AIScatterBomb.class,0.5f,EntityAIScatterBomb.class,5); + registerSkill(AIMeltdowner.class,0.1f,EntityAIMeltdowner.class,5); } @EventHandler diff --git a/src/main/java/cn/paindar/academymonster/entity/EntityLoader.java b/src/main/java/cn/paindar/academymonster/entity/EntityLoader.java index 0d64d2e..2f7efba 100644 --- a/src/main/java/cn/paindar/academymonster/entity/EntityLoader.java +++ b/src/main/java/cn/paindar/academymonster/entity/EntityLoader.java @@ -31,6 +31,7 @@ public static void registerRenders() registerEntityRender(EntityMdBallNative.class, new EntityMdBallNative.R()); registerEntityRender(EntityCoinThrowingNative.class,new EntityCoinThrowingNative.R()); registerEntityRender(EntityRailgunFXNative.class,new EntityRailgunFXNative.R()); + registerEntityRender(EntityMDRayNative.class,new EntityMDRayNative.R()); registerEntityRender(EntityArcNative.class,new EntityArcNative.Renderer()); registerEntityRender(EntityMineRayNative.class,new EntityMineRayNative.R()); registerEntityRender(EntityLightShield.class,new EntityLightShield.R()); diff --git a/src/main/java/cn/paindar/academymonster/entity/EntityMDRayNative.java b/src/main/java/cn/paindar/academymonster/entity/EntityMDRayNative.java new file mode 100644 index 0000000..1545e05 --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/entity/EntityMDRayNative.java @@ -0,0 +1,65 @@ +package cn.paindar.academymonster.entity; + +import cn.academy.core.client.render.ray.RendererRayComposite; +import cn.academy.vanilla.meltdowner.client.render.MdParticleFactory; +import cn.lambdalib.particle.Particle; +import cn.lambdalib.util.generic.RandUtils; +import cn.lambdalib.util.generic.VecUtils; +import cn.lambdalib.util.helper.Motion3D; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.Vec3; + +/** + * Created by Paindar on 2017/3/13. + */ +public class EntityMDRayNative extends EntityRayBaseNative +{ + public EntityMDRayNative(EntityLivingBase _player, double length) { + this(_player, new Motion3D(_player, true), length); + } + + public EntityMDRayNative(EntityLivingBase spawner, Motion3D mo, double length) { + super(spawner); + + Vec3 start = mo.getPosVec(), end = mo.move(length).getPosVec(); + this.setFromTo(start, end); + this.blendInTime = 200; + this.blendOutTime = 700; + this.life = 50; + this.length = length; + } + + @Override + protected void onFirstUpdate() + { + super.onFirstUpdate(); + worldObj.playSound(posX, posY, posZ, "academy:md.meltdowner", 0.5f, 1.0f, false); + } + @Override + public void onUpdate() { + super.onUpdate(); + if(RandUtils.nextDouble() < 0.8) { + Particle p = MdParticleFactory.INSTANCE.next(worldObj, + new Motion3D(this, true).move(RandUtils.ranged(0, 10)).getPosVec(), + VecUtils.vec(RandUtils.ranged(-.03, .03), RandUtils.ranged(-.03, .03), RandUtils.ranged(-.03, .03))); + worldObj.spawnEntityInWorld(p); + } + } + + public static class R extends RendererRayComposite + { + + public R() { + super("mdray"); + this.cylinderIn.width = 0.17; + this.cylinderIn.color.setColor4i(216, 248, 216, 230); + + this.cylinderOut.width = 0.22; + this.cylinderOut.color.setColor4i(106, 242, 106, 50); + + this.glow.width = 1.5; + this.glow.color.a = 0.8; + } + + } +} diff --git a/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIMeltdowner.java b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIMeltdowner.java new file mode 100644 index 0000000..257fa41 --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/entity/ai/EntityAIMeltdowner.java @@ -0,0 +1,62 @@ +package cn.paindar.academymonster.entity.ai; + +import cn.paindar.academymonster.ability.AIMeltdowner; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAIBase; + +/** + * Created by Paindar on 2017/3/13. + */ +public class EntityAIMeltdowner extends EntityAIBase +{ + private final EntityLiving speller; + private EntityLivingBase target; + private AIMeltdowner skill; + + public EntityAIMeltdowner(EntityLiving speller, AIMeltdowner skill) + { + this.speller = speller; + this.skill = skill; + } + + /** + * Returns whether the EntityAIBase should begin execution. + */ + @Override + public boolean shouldExecute() + { + EntityLivingBase target=speller.getAttackTarget(); + if (target==null) + return false; + double dist=speller.getDistanceSqToEntity(target); + return this.speller.getAttackTarget().isEntityAlive() && !skill.isSkillInCooldown() && dist >= 2.25 && dist <= skill.getMaxDistance() * skill.getMaxDistance(); + } + + /** + * Execute a one shot task or start executing a continuous task + */ + public void startExecuting() + { + this.target = this.speller.getAttackTarget(); + } + + /** + * Resets the task + */ + public void resetTask() + { + this.target = null; + } + + /** + * Update the task. + */ + public void updateTask() + { + if(!skill.isSkillInCooldown()) + { + skill.spell(); + } + } +} diff --git a/src/main/java/cn/paindar/academymonster/network/MessageMeltdownerEffect.java b/src/main/java/cn/paindar/academymonster/network/MessageMeltdownerEffect.java new file mode 100644 index 0000000..22c18dd --- /dev/null +++ b/src/main/java/cn/paindar/academymonster/network/MessageMeltdownerEffect.java @@ -0,0 +1,68 @@ +package cn.paindar.academymonster.network; + +import cn.paindar.academymonster.entity.EntityMDRayNative; +import cn.paindar.academymonster.entity.EntityRailgunFXNative; +import cpw.mods.fml.common.network.ByteBufUtils; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.nbt.NBTTagCompound; + +/** + * Created by Paindar on 2017/3/13. + */ +public class MessageMeltdownerEffect implements IMessage +{ + public static class Handler implements IMessageHandler + { + @Override + @SideOnly(Side.CLIENT) + public IMessage onMessage(MessageMeltdownerEffect message, MessageContext ctx) + { + if (ctx.side == Side.CLIENT) + { + EntityLivingBase player= (EntityLivingBase) Minecraft.getMinecraft().theWorld.getEntityByID(message.nbt.getInteger("i")); + int dist=message.nbt.getInteger("dst"); + player.worldObj.spawnEntityInWorld(new EntityMDRayNative(player, dist)); + } + return null; + } + } + + NBTTagCompound nbt; + public MessageMeltdownerEffect(){} + + public MessageMeltdownerEffect(EntityLivingBase speller,int dist) + { + nbt=new NBTTagCompound(); + nbt.setInteger("i",speller.getEntityId()); + nbt.setInteger("dst",dist); + } + + /** + * Convert from the supplied buffer into your specific message type + * + * @param buf + */ + @Override + public void fromBytes(ByteBuf buf) + { + nbt= ByteBufUtils.readTag(buf); + } + + /** + * Deconstruct your message into the supplied byte buffer + * + * @param buf + */ + @Override + public void toBytes(ByteBuf buf) + { + ByteBufUtils.writeTag(buf, nbt); + } +} diff --git a/src/main/java/cn/paindar/academymonster/network/NetworkManager.java b/src/main/java/cn/paindar/academymonster/network/NetworkManager.java index 32cf7a3..3eb6de4 100644 --- a/src/main/java/cn/paindar/academymonster/network/NetworkManager.java +++ b/src/main/java/cn/paindar/academymonster/network/NetworkManager.java @@ -28,6 +28,7 @@ public static void init(FMLPreInitializationEvent event) registerMessage(MessageMdRayEffect.Handler.class, MessageMdRayEffect.class, Side.CLIENT); registerMessage(MessageFleshRippingEffect.Handler.class, MessageFleshRippingEffect.class, Side.CLIENT); registerMessage(MessageRailgunEffect.Handler.class, MessageRailgunEffect.class, Side.CLIENT); + registerMessage(MessageMeltdownerEffect.Handler.class, MessageMeltdownerEffect.class, Side.CLIENT); registerMessage(MessageSkillInfoSync.Handler.class, MessageSkillInfoSync.class,Side.CLIENT); registerMessage(MessageArcGenEffect.Handler.class, MessageArcGenEffect.class,Side.CLIENT); registerMessage(MessageThunderBolt.Handler.class, MessageThunderBolt.class,Side.CLIENT); @@ -95,6 +96,17 @@ public static void sendRailgunEffectTo(EntityLivingBase target,int dist, EntityP throw new IllegalStateException("Wrong context side!"); } + public static void sendMeltdownerEffectTo(EntityLivingBase target,int dist, EntityPlayerMP player) + { + if(!player.getEntityWorld().isRemote) + { + MessageMeltdownerEffect msg = new MessageMeltdownerEffect(target,dist); + instance.sendTo(msg, player); + } + else + throw new IllegalStateException("Wrong context side!"); + } + public static void sendEntitySkillInfoTo(EntityLivingBase entity, EntityPlayerMP player) { if(!player.getEntityWorld().isRemote) diff --git a/src/main/resources/assets/academymonster/config/default.cfg b/src/main/resources/assets/academymonster/config/default.cfg index e065cb4..b170c2a 100644 --- a/src/main/resources/assets/academymonster/config/default.cfg +++ b/src/main/resources/assets/academymonster/config/default.cfg @@ -41,6 +41,11 @@ am { prob:0.5 } + Meltdowner + { + prob:0.2 + destroyBlock=true; + } MineRay { prob:0.7 From 7ae7969a3722d9370e2ff3e21cb95639d545a869 Mon Sep 17 00:00:00 2001 From: Paindar <1944798085@qq.com> Date: Tue, 14 Mar 2017 00:37:25 +0800 Subject: [PATCH 17/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=88=B01.0.0pr4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.properties b/build.properties index e018749..7e9ce39 100644 --- a/build.properties +++ b/build.properties @@ -1,5 +1,5 @@ mod_name = AcademyMonster -mod_ver = 1.0.0pr3 +mod_ver = 1.0.0pr4 mod_group = cn.paindar mc_ver = 1.7.10 forge_ver = 10.13.4.1517-1.7.10