@SubscribeEvent
public void onRenderPlayer(RenderPlayerEvent.Pre event) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
if (tick > 0){
event.renderer.modelBipedMain.aimedBow = true;
}
@SubscribeEvent
public void onRenderPlayer(RenderPlayerEvent.Pre event) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {if (ExtendedPlayer.get(event.entityPlayer).getIsCasting())
event.renderer.modelBipedMain.aimedBow = true;
public void update(EntityPlayer player) {
if(isCastingLast != isCasting)
{
if(player instanceof EntityPlayerMP)
Main.network.sendTo(new MessageIsCasting(isCasting),(EntityPlayerMP)player);
isCastingLast = isCasting;
}
public class MessageIsCasting implements IMessage {
private boolean isCasting;
public MessageIsCasting() {
}
public MessageIsCasting(boolean isCasting ) {
this.isCasting = isCasting ;
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeBoolean(isCasting);
}
@Override
public void fromBytes(ByteBuf buf) {
isCasting = buf.readBoolean();
}
public static class Handler implements IMessageHandler<MessageIsCasting, IMessage> {
@Override
public IMessage onMessage(MessageIsCasting packet, MessageContext message) {
if (FMLCommonHandler.instance().getSide().isClient())
setCasting(packet.isCasting);
else
setCasting(message.getServerHandler().playerEntity, packet.isCasting);
return null;
}
@SideOnly(Side.CLIENT)
private void setCasting(boolean isCasting) {
Minecraft mc = Minecraft.getMinecraft();
ExtendedPlayer extendedPlayer= ExtendedPlayer.get(mc.thePlayer);
if (extendedPlayer!= null) {
extendedPlayer.setIsCasting(isCasting);
}
}
private void setCasting(EntityPlayerMP player, boolean isCasting) {
ExtendedPlayer extendedPlayer = ExtendedPlayer.get(player);
if (extendedPlayer != null) {
extendedPlayer.setIsCasting(isCasting);
}
}
}
}
@SubscribeEvent
public void addEntityConstructing(EntityEvent.EntityConstructing event) {
if (event.entity != null && event.entity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entity;
if(player.getAttributeMap().getAttributeInstance(isCasting) == null) {
player.getAttributeMap().addAttributeInstance(new ModifiableAttributeInstance(player.getAttributeMap(), isCasting));
player.getAttributeMap().registerAttribute(isCasting);
player.getAttributeMap().getAttributeInstance(isCasting).setBaseValue(0.0d); //Разобрался поверхностно, поэтому заюзал систему через числа. 0 - false, 1 - true
}
@SubscribeEvent
public void onRenderPlayer(RenderPlayerEvent.Pre event) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
if (event.entityPlayer.getAttributeMap().getAttributeInstanceByName("isCasting").getAttributeValue() != 0) {
event.renderer.modelBipedMain.aimedBow = true;
}
}
// Создаешь, где угодно аттрибут.
// первого параметра (null) в 1.7.10, вроде, не было.
public static final IAttribute CAST_ATTR = new BaseAttribute(null, "is cast", 0)
{
@Override
public double clampValue(double value)
{
return value;
}
}.setShouldWatch(true);
// регаешь его
@SubscribeEvent
public void onEntityConstructing(EntityConstructing e)
{
if (e.getEntity() instanceof EntityPlayer) {
((EntityPlayer) e.getEntity()).getAttributeMap().registerAttribute(CAST_ATTR);
}
}
// юзаешь
public void doWork(EntityPlayer player)
{
player.getEntityAttribute(CAST_ATTR).getAttributeValue();
player.getEntityAttribute(CAST_ATTR).setBaseValue(1);
}
// параметр для текущего здоровья
private static final DataParameter<Float> HEALTH = EntityDataManager.<Float>createKey(EntityLivingBase.class, DataSerializers.FLOAT);
Где ты вызываешь свой update? В любом случае это лютый костыль.
Dahaka написал(а):There are three different situation in which you may want to send synchronization packets, all of them optional:
- When the entity spawns in the world, or the block is placed, you may want to share the initialization-assigned values with the clients.
- When the stored data changes, you may want to notify some or all of the watching clients.
- When a new client starts viewing the entity or block, you may want to notify it of the existing data.
[*]
Если надо, я могу потом нормальный урок запилить по IExtendedEntityProperties для 1.7.10 и ICapability для 1.10.2. Хотя по первому уже миллион уроков.
@SubscribeEvent
public void onRenderPlayer(RenderPlayerEvent.Pre event) {
if (event.entityPlayer.getEntityAttribute(EventForge.isCasting).getBaseValue() == 1) {
event.renderer.modelBipedMain.aimedBow = true;
}
@SubscribeEvent
public void onRenderPlayer(RenderPlayerEvent.Pre event) {
if (event.entityPlayer.getEntityAttribute(EventForge.isCasting).getBaseValue() == 1) {
event.renderer.modelBipedMain.aimedBow = true;
event.renderer.modelArmorChestplate.aimedBow = true;
}
}