EntityHuman.java 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. package me.km.entities;
  2. import me.km.Server;
  3. import me.km.overrides.ModEntityPlayerMP;
  4. import net.minecraft.entity.Entity;
  5. import net.minecraft.entity.CreatureEntity;
  6. import net.minecraft.entity.EntitySize;
  7. import net.minecraft.entity.EntityType;
  8. import net.minecraft.entity.Pose;
  9. import net.minecraft.entity.SharedMonsterAttributes;
  10. import net.minecraft.entity.ai.goal.LookAtGoal;
  11. import net.minecraft.entity.ai.goal.LookRandomlyGoal;
  12. import net.minecraft.entity.ai.goal.SwimGoal;
  13. import net.minecraft.entity.player.PlayerEntity;
  14. import net.minecraft.nbt.CompoundNBT;
  15. import net.minecraft.network.datasync.DataParameter;
  16. import net.minecraft.network.datasync.DataSerializers;
  17. import net.minecraft.network.datasync.EntityDataManager;
  18. import net.minecraft.util.DamageSource;
  19. import net.minecraft.util.ResourceLocation;
  20. import net.minecraft.util.SoundCategory;
  21. import net.minecraft.util.SoundEvent;
  22. import net.minecraft.util.text.ITextComponent;
  23. import net.minecraft.world.World;
  24. import net.minecraftforge.api.distmarker.Dist;
  25. import net.minecraftforge.api.distmarker.OnlyIn;
  26. import net.minecraft.util.SoundEvents;
  27. public class EntityHuman extends CreatureEntity
  28. {
  29. private static final DataParameter<String> SKIN_NAME = EntityDataManager.createKey(EntityHuman.class, DataSerializers.STRING);
  30. private static final DataParameter<Float> SCALE = EntityDataManager.createKey(EntityHuman.class, DataSerializers.FLOAT);
  31. private static final DataParameter<Boolean> SLIM = EntityDataManager.createKey(EntityHuman.class, DataSerializers.BOOLEAN);
  32. private float lastScale = 1.0f;
  33. private final float originalWidth;
  34. private final float originalHeight;
  35. private EntitySize size;
  36. public EntityHuman(EntityType<EntityHuman> type, World w)
  37. {
  38. super(type, w);
  39. this.originalWidth = getWidth();
  40. this.originalHeight = getHeight();
  41. size = ModEntities.HUMAN.getSize();
  42. }
  43. @Override
  44. protected void registerData()
  45. {
  46. super.registerData();
  47. this.getDataManager().register(SKIN_NAME, "Steve");
  48. this.getDataManager().register(SCALE, 1.0f);
  49. this.getDataManager().register(SLIM, false);
  50. }
  51. // -------------------------------------------------------------------------
  52. // size modifier
  53. // -------------------------------------------------------------------------
  54. public boolean isSlim()
  55. {
  56. return this.getDataManager().get(SLIM);
  57. }
  58. public void setSlim(boolean slim)
  59. {
  60. this.getDataManager().set(SLIM, slim);
  61. }
  62. public final float getScale()
  63. {
  64. return this.getDataManager().get(SCALE);
  65. }
  66. public final void setScale(float scale)
  67. {
  68. this.getDataManager().set(SCALE, scale);
  69. updateSize(scale);
  70. }
  71. private void updateSize(float scale)
  72. {
  73. this.setSize(originalWidth * scale, originalHeight * scale);
  74. }
  75. public void setSkinName(String name)
  76. {
  77. this.getDataManager().set(SKIN_NAME, name);
  78. }
  79. public String getSkinName()
  80. {
  81. return this.getDataManager().get(SKIN_NAME);
  82. }
  83. // -------------------------------------------------------------------------
  84. // texture stuff
  85. // -------------------------------------------------------------------------
  86. @OnlyIn(Dist.CLIENT)
  87. public ResourceLocation getTexture()
  88. {
  89. return HumanSkinLoader.INSTANCE.getTexture(getSkinName());
  90. }
  91. @Override
  92. public void readAdditional(CompoundNBT com)
  93. {
  94. super.readAdditional(com);
  95. if(com.contains("HumanName"))
  96. {
  97. setSkinName(com.getString("HumanName"));
  98. }
  99. if(com.contains("Scale"))
  100. {
  101. setScale(com.getFloat("Scale"));
  102. }
  103. if(com.contains("Slim"))
  104. {
  105. setSlim(com.getBoolean("Slim"));
  106. }
  107. }
  108. @Override
  109. public void writeAdditional(CompoundNBT com)
  110. {
  111. super.writeAdditional(com);
  112. com.putString("HumanName", getSkinName());
  113. com.putFloat("Scale", getScale());
  114. com.putBoolean("Slim", isSlim());
  115. }
  116. @Override
  117. public void addVelocity(double x, double y, double z)
  118. {
  119. }
  120. @Override
  121. public void knockBack(Entity entityIn, float strength, double xRatio, double zRatio)
  122. {
  123. }
  124. @Override
  125. public void applyEntityCollision(Entity entityIn)
  126. {
  127. }
  128. @Override
  129. public boolean attackEntityFrom(DamageSource source, float amount)
  130. {
  131. if(source == DamageSource.OUT_OF_WORLD)
  132. {
  133. this.remove();
  134. return false;
  135. }
  136. if(!world.isRemote)
  137. {
  138. Entity ent = source.getTrueSource();
  139. if(ent instanceof ModEntityPlayerMP)
  140. {
  141. Server.scriptEvents.onHumanHurt((ModEntityPlayerMP) ent, this);
  142. }
  143. }
  144. return false;
  145. }
  146. @Override
  147. protected void registerGoals()
  148. {
  149. this.goalSelector.addGoal(0, new SwimGoal(this));
  150. this.goalSelector.addGoal(1, new LookAtGoal(this, PlayerEntity.class, 6.0F));
  151. this.goalSelector.addGoal(2, new LookRandomlyGoal(this));
  152. }
  153. @Override
  154. protected void registerAttributes()
  155. {
  156. super.registerAttributes();
  157. this.getAttributes().registerAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).setBaseValue(1);
  158. this.getAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.1d);
  159. this.getAttributes().registerAttribute(SharedMonsterAttributes.ATTACK_SPEED);
  160. }
  161. @Override
  162. protected SoundEvent getSwimSound()
  163. {
  164. return SoundEvents.ENTITY_PLAYER_SWIM;
  165. }
  166. @Override
  167. protected SoundEvent getSplashSound()
  168. {
  169. return SoundEvents.ENTITY_PLAYER_SPLASH;
  170. }
  171. @Override
  172. public SoundCategory getSoundCategory()
  173. {
  174. return SoundCategory.NEUTRAL;
  175. }
  176. @Override
  177. protected SoundEvent getHurtSound(DamageSource ds)
  178. {
  179. if (ds == DamageSource.ON_FIRE)
  180. {
  181. return SoundEvents.ENTITY_PLAYER_HURT_ON_FIRE;
  182. }
  183. else
  184. {
  185. return ds == DamageSource.DROWN ? SoundEvents.ENTITY_PLAYER_HURT_DROWN : SoundEvents.ENTITY_PLAYER_HURT;
  186. }
  187. }
  188. @Override
  189. protected SoundEvent getDeathSound()
  190. {
  191. return SoundEvents.ENTITY_PLAYER_DEATH;
  192. }
  193. @Override
  194. public double getYOffset()
  195. {
  196. return -0.35D;
  197. }
  198. @Override
  199. public float getAIMoveSpeed()
  200. {
  201. return (float) this.getAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).getValue();
  202. }
  203. @Override
  204. protected SoundEvent getFallSound(int heightIn)
  205. {
  206. return heightIn > 4 ? SoundEvents.ENTITY_PLAYER_BIG_FALL : SoundEvents.ENTITY_PLAYER_SMALL_FALL;
  207. }
  208. @OnlyIn(Dist.CLIENT)
  209. @Override
  210. public boolean getAlwaysRenderNameTagForRender()
  211. {
  212. return true;
  213. }
  214. @Override
  215. public ITextComponent getDisplayName()
  216. {
  217. return getName();
  218. }
  219. @Override
  220. public float getEyeHeight(Pose p_213307_1_)
  221. {
  222. float f = getDefaultEyeHeight();
  223. if(getHeight() == 1.65F)
  224. {
  225. f -= 0.08F;
  226. }
  227. f *= getScale();
  228. return f;
  229. }
  230. public float getDefaultEyeHeight()
  231. {
  232. return 1.62F;
  233. }
  234. @Override
  235. public boolean canDespawn(double distanceToClosestPlayer)
  236. {
  237. return false;
  238. }
  239. @Override
  240. public EntitySize getSize(Pose poseIn)
  241. {
  242. return size;
  243. }
  244. private void setSize(float w, float h)
  245. {
  246. size = EntitySize.flexible(w, h);
  247. recalculateSize();
  248. }
  249. @Override
  250. public void notifyDataManagerChange(DataParameter<?> key)
  251. {
  252. super.notifyDataManagerChange(key);
  253. if(SCALE.equals(key))
  254. {
  255. updateSize(getScale());
  256. }
  257. }
  258. }