EntityHuman.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. package me.km.entities;
  2. import io.netty.buffer.ByteBuf;
  3. import java.nio.charset.StandardCharsets;
  4. import me.km.KajetansMod;
  5. import me.km.networking.ModPacketHandler;
  6. import me.km.snuviscript.ScriptEvents;
  7. import net.minecraft.entity.EntityAgeable;
  8. import net.minecraft.client.renderer.entity.RenderZombie;
  9. import net.minecraft.entity.Entity;
  10. import net.minecraft.entity.EntityCreature;
  11. import net.minecraft.entity.EntityLiving;
  12. import net.minecraft.entity.SharedMonsterAttributes;
  13. import net.minecraft.entity.ai.EntityAISwimming;
  14. import net.minecraft.entity.ai.EntityAIWatchClosest;
  15. import net.minecraft.entity.ai.EntityAIWatchClosest2;
  16. import net.minecraft.entity.player.EntityPlayer;
  17. import net.minecraft.init.SoundEvents;
  18. import net.minecraft.nbt.NBTTagCompound;
  19. import net.minecraft.util.DamageSource;
  20. import net.minecraft.util.ResourceLocation;
  21. import net.minecraft.util.SoundCategory;
  22. import net.minecraft.util.SoundEvent;
  23. import net.minecraft.util.math.AxisAlignedBB;
  24. import net.minecraft.util.text.ITextComponent;
  25. import net.minecraft.util.text.TextComponentString;
  26. import net.minecraft.world.World;
  27. import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData;
  28. import net.minecraftforge.fml.relauncher.Side;
  29. import net.minecraftforge.fml.relauncher.SideOnly;
  30. public class EntityHuman extends EntityCreature implements IEntityAdditionalSpawnData
  31. {
  32. private final static String STEVE = "Steve";
  33. @SideOnly(Side.CLIENT)
  34. private ResourceLocation texture;
  35. private String name;
  36. private float scale;
  37. private byte slim;
  38. private float originalWidth;
  39. private float originalHeight;
  40. public EntityHuman(World w)
  41. {
  42. super(w);
  43. this.name = STEVE;
  44. this.scale = 1;
  45. this.originalWidth = width;
  46. this.originalHeight = height;
  47. this.slim = 0;
  48. }
  49. // -------------------------------------------------------------------------
  50. // size modifier
  51. // -------------------------------------------------------------------------
  52. public byte getSlim()
  53. {
  54. return slim;
  55. }
  56. public void setSlim(byte slim)
  57. {
  58. this.slim = slim;
  59. }
  60. public void setSlim(boolean b)
  61. {
  62. this.slim = (byte) (b ? 1 : 0);
  63. if(!this.world.isRemote)
  64. {
  65. ModPacketHandler.sendHumanScaleUpdate(this);
  66. }
  67. }
  68. public boolean isSlim()
  69. {
  70. return this.slim == 1;
  71. }
  72. public final float getScale()
  73. {
  74. return scale;
  75. }
  76. public final void setScale(float scale)
  77. {
  78. this.scale = scale;
  79. this.setSize(originalWidth * scale, originalHeight * scale);
  80. if(!this.world.isRemote)
  81. {
  82. ModPacketHandler.sendHumanScaleUpdate(this);
  83. }
  84. }
  85. // -------------------------------------------------------------------------
  86. // texture stuff
  87. // -------------------------------------------------------------------------
  88. @SideOnly(Side.CLIENT)
  89. public ResourceLocation getTexture()
  90. {
  91. return texture;
  92. }
  93. @SideOnly(Side.CLIENT)
  94. public void setTexture(ResourceLocation texture)
  95. {
  96. this.texture = texture;
  97. }
  98. @Override
  99. public void readEntityFromNBT(NBTTagCompound com)
  100. {
  101. super.readEntityFromNBT(com);
  102. if(com.hasKey("HumanName"))
  103. {
  104. this.name = com.getString("HumanName");
  105. }
  106. if(com.hasKey("Scale"))
  107. {
  108. this.scale = com.getFloat("Scale");
  109. this.setSize(originalWidth * scale, originalHeight * scale);
  110. }
  111. if(com.hasKey("Slim"))
  112. {
  113. this.slim = com.getByte("Slim");
  114. }
  115. }
  116. @Override
  117. public void writeEntityToNBT(NBTTagCompound com)
  118. {
  119. super.writeEntityToNBT(com);
  120. com.setString("HumanName", name);
  121. com.setFloat("Scale", scale);
  122. com.setByte("Slim", slim);
  123. }
  124. @Override
  125. public void writeSpawnData(ByteBuf buf)
  126. {
  127. byte[] b = name.getBytes(StandardCharsets.UTF_8);
  128. buf.writeInt(b.length);
  129. buf.writeBytes(b);
  130. buf.writeFloat(scale);
  131. buf.writeByte(slim);
  132. }
  133. @Override
  134. public void readSpawnData(ByteBuf buf)
  135. {
  136. int length = buf.readInt();
  137. name = buf.readBytes(length).toString(StandardCharsets.UTF_8);
  138. setTexture(HumanSkinLoader.INSTANCE.getTexture(name, loc -> setTexture(loc)));
  139. scale = buf.readFloat();
  140. this.setSize(originalWidth * scale, originalHeight * scale);
  141. slim = buf.readByte();
  142. }
  143. // -------------------------------------------------------------------------
  144. @Override
  145. public void addVelocity(double x, double y, double z)
  146. {
  147. }
  148. @Override
  149. public void applyEntityCollision(Entity entityIn)
  150. {
  151. }
  152. @Override
  153. public boolean attackEntityFrom(DamageSource source, float amount)
  154. {
  155. if(source == DamageSource.OUT_OF_WORLD)
  156. {
  157. this.setDead();
  158. return false;
  159. }
  160. if(!KajetansMod.singlePlayer)
  161. {
  162. Entity ent = source.getTrueSource();
  163. if(ent instanceof EntityPlayer)
  164. {
  165. KajetansMod.scripts.getEvent(ScriptEvents.class).onHumanHurt((EntityPlayer) ent, this);
  166. }
  167. }
  168. else
  169. {
  170. this.setDead();
  171. }
  172. return false;
  173. }
  174. @Override
  175. protected void initEntityAI()
  176. {
  177. this.tasks.addTask(0, new EntityAISwimming(this));
  178. this.tasks.addTask(1, new EntityAIWatchClosest2(this, EntityPlayer.class, 3.0F, 1.0F));
  179. this.tasks.addTask(2, new EntityAIWatchClosest(this, EntityLiving.class, 8.0F));
  180. }
  181. public void setName(String name)
  182. {
  183. this.name = name;
  184. if(!this.world.isRemote)
  185. {
  186. ModPacketHandler.sendHumanUpdate(this);
  187. }
  188. }
  189. @Override
  190. protected void applyEntityAttributes()
  191. {
  192. super.applyEntityAttributes();
  193. this.getAttributeMap().registerAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).setBaseValue(1);
  194. this.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.1d);
  195. this.getAttributeMap().registerAttribute(SharedMonsterAttributes.ATTACK_SPEED);
  196. }
  197. @Override
  198. protected SoundEvent getSwimSound()
  199. {
  200. return SoundEvents.ENTITY_PLAYER_SWIM;
  201. }
  202. @Override
  203. protected SoundEvent getSplashSound()
  204. {
  205. return SoundEvents.ENTITY_PLAYER_SPLASH;
  206. }
  207. @Override
  208. public SoundCategory getSoundCategory()
  209. {
  210. return SoundCategory.NEUTRAL;
  211. }
  212. @Override
  213. protected SoundEvent getHurtSound(DamageSource ds)
  214. {
  215. if (ds == DamageSource.ON_FIRE)
  216. {
  217. return SoundEvents.ENTITY_PLAYER_HURT_ON_FIRE;
  218. }
  219. else
  220. {
  221. return ds == DamageSource.DROWN ? SoundEvents.ENTITY_PLAYER_HURT_DROWN : SoundEvents.ENTITY_PLAYER_HURT;
  222. }
  223. }
  224. @Override
  225. protected SoundEvent getDeathSound()
  226. {
  227. return SoundEvents.ENTITY_PLAYER_DEATH;
  228. }
  229. @Override
  230. public double getYOffset()
  231. {
  232. return -0.35D;
  233. }
  234. @Override
  235. public float getAIMoveSpeed()
  236. {
  237. return (float) this.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).getAttributeValue();
  238. }
  239. @Override
  240. protected SoundEvent getFallSound(int heightIn)
  241. {
  242. return heightIn > 4 ? SoundEvents.ENTITY_PLAYER_BIG_FALL : SoundEvents.ENTITY_PLAYER_SMALL_FALL;
  243. }
  244. @SideOnly(Side.CLIENT)
  245. @Override
  246. public boolean getAlwaysRenderNameTagForRender()
  247. {
  248. return true;
  249. }
  250. @Override
  251. public String getName()
  252. {
  253. return name;
  254. }
  255. @Override
  256. public ITextComponent getDisplayName()
  257. {
  258. return new TextComponentString(getName());
  259. }
  260. @Override
  261. public float getEyeHeight()
  262. {
  263. float f = getDefaultEyeHeight();
  264. if(this.height == 1.65F)
  265. {
  266. f -= 0.08F;
  267. }
  268. return f;
  269. }
  270. public float getDefaultEyeHeight()
  271. {
  272. return 1.62F;
  273. }
  274. }