EntityHuman.java 8.3 KB

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