EntityHuman.java 7.9 KB

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