@Mod(modid = TotemMod.MODID, name = TotemMod.NAME, version = TotemMod.VERSION)
public class TotemMod {
public static final String
MODID = "totem",
NAME = "Totem Mod",
VERSION = "0.1";
@Mod.Instance(MODID)
public static TotemMod instance;
public static final SimpleNetworkWrapper network = NetworkRegistry.INSTANCE.newSimpleChannel(MODID);
public static Item my_totem;
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
network.registerMessage(EntityStatusMessage.Handler.class, EntityStatusMessage.class, 0, Side.CLIENT);
network.registerMessage(EntityStatusMessage.Handler.class, EntityStatusMessage.class, 0, Side.SERVER);
my_totem = new...
немного не понялВ данном случае:
Java:ItemStack itemstack = null; for (EnumHand enumhand : EnumHand.values()) { ItemStack itemstack1 = this.getHeldItem(enumhand);
Он срабатывает когда ты кликаешь пкмonItemUse ему нельзя написать тогда? Зачем здесь эвенты
Потому что ты проверяешь стак из руки и НОВЫЙ стак.if(pl.getHeldItemOffhand() == new ItemStack(ItemInit.CowardsTotem) || pl.getHeldItemMainhand() == new ItemStack(ItemInit.CowardsTotem) ) {
public static boolean isSameItem(ItemStack stack, Item item) {
return !stack.isEmpty() && stack.getItem() == item;
}
Упс это не так работает... Сорь за дезинформацию . onUpdate, кажется, тикает... если я опять не ошибся. Почему нельзя проверять из него?onItemUse ему нельзя написать тогда? Зачем здесь эвенты
onUpdate
, но тогда я не могу инициализировать игрока,а благодаря @SuperCatMaster я смог это сделать.Теперь как удалить item после использования(просто удалить его).@Mod(modid = TotemMod.MODID, name = TotemMod.NAME, version = TotemMod.VERSION)
public class TotemMod {
public static final String
MODID = "totem",
NAME = "Totem Mod",
VERSION = "0.1";
@Mod.Instance(MODID)
public static TotemMod instance;
public static final SimpleNetworkWrapper network = NetworkRegistry.INSTANCE.newSimpleChannel(MODID);
public static Item my_totem;
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
network.registerMessage(EntityStatusMessage.Handler.class, EntityStatusMessage.class, 0, Side.CLIENT);
network.registerMessage(EntityStatusMessage.Handler.class, EntityStatusMessage.class, 0, Side.SERVER);
my_totem = new Item().setRegistryName(MODID, "mytotem").setUnlocalizedName("mytotem").setCreativeTab(CreativeTabs.MISC);
ForgeRegistries.ITEMS.register(my_totem);
MinecraftForge.EVENT_BUS.register(new EventsForge());
}
}
public class EventsForge {
@SubscribeEvent(priority = EventPriority.HIGHEST)
public void onDeath(LivingDeathEvent event) {
if (event.isCanceled()) return;
if (event.getEntityLiving() instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer)event.getEntityLiving();
for(EnumHand hand : EnumHand.values()) {
ItemStack item = player.getHeldItem(hand);
if (!item.isEmpty() && item.getItem() == TotemMod.my_totem) {
item.shrink(1);
if (item.getCount() <= 0)
player.setHeldItem(hand, ItemStack.EMPTY);
else
player.setHeldItem(hand, item);
player.setHealth(1.0F);
player.clearActivePotions();
player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 900, 1));
player.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, 100, 1));
if (player instanceof EntityPlayerMP)
TotemMod.network.sendTo(new EntityStatusMessage(), (EntityPlayerMP)player);
event.setCanceled(true);
break;
}
}
}
}
}
public class EntityStatusMessage implements IMessage {
public EntityStatusMessage() {}
@Override
public void toBytes(ByteBuf buf) {}
@Override
public void fromBytes(ByteBuf buf) {}
public static class Handler implements IMessageHandler<EntityStatusMessage, IMessage> {
@Override
public IMessage onMessage(EntityStatusMessage packet, MessageContext message) {
if (message.side.isClient())
act(packet);
else
act(message.getServerHandler().player, packet);
return null;
}
@SideOnly(Side.CLIENT)
private void act(EntityStatusMessage packet) {
Minecraft mc = Minecraft.getMinecraft();
mc.effectRenderer.emitParticleAtEntity(mc.player, EnumParticleTypes.TOTEM, 30);
mc.world.playSound(mc.player.posX, mc.player.posY, mc.player.posZ, SoundEvents.ITEM_TOTEM_USE, mc.player.getSoundCategory(), 1.0F, 1.0F, false);
mc.entityRenderer.displayItemActivation(new ItemStack(Items.BEETROOT_SOUP));
}
private void act(EntityPlayerMP player, EntityStatusMessage packet) {
}
}
}
Типа так, а может и нет:типа отправить всем кто рядом, но показывать тотем на экране тому у кого этот тотем сработал
@Mod(modid = TotemMod.MODID, name = TotemMod.NAME, version = TotemMod.VERSION)
public class TotemMod {
public static final String
MODID = "totem",
NAME = "Totem Mod",
VERSION = "0.2";
@Mod.Instance(MODID)
public static TotemMod instance;
public static final SimpleNetworkWrapper network = NetworkRegistry.INSTANCE.newSimpleChannel(MODID);
public static Item my_totem;
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
network.registerMessage(EntityStatusMessage.Handler.class, EntityStatusMessage.class, 0, Side.CLIENT);
network.registerMessage(EntityStatusMessage.Handler.class, EntityStatusMessage.class, 0, Side.SERVER);
my_totem = new Item().setRegistryName(MODID, "mytotem").setUnlocalizedName("mytotem").setCreativeTab(CreativeTabs.MISC);
ForgeRegistries.ITEMS.register(my_totem);
MinecraftForge.EVENT_BUS.register(new EventsForge());
}
}
public class EventsForge {
@SubscribeEvent(priority = EventPriority.HIGHEST)
public void onDeath(LivingDeathEvent event) {
if (event.isCanceled()) return;
if (event.getEntityLiving().world.isRemote) return;
if (event.getEntityLiving() instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer)event.getEntityLiving();
for(EnumHand hand : EnumHand.values()) {
ItemStack item = player.getHeldItem(hand);
if (!item.isEmpty() && item.getItem() == TotemMod.my_totem) {
item.shrink(1);
if (item.getCount() <= 0)
player.setHeldItem(hand, ItemStack.EMPTY);
else
player.setHeldItem(hand, item);
player.setHealth(1.0F);
player.clearActivePotions();
player.addPotionEffect(new PotionEffect(MobEffects.REGENERATION, 900, 1));
player.addPotionEffect(new PotionEffect(MobEffects.ABSORPTION, 100, 1));
EntityStatusMessage message = new EntityStatusMessage();
message.entityID = player.getEntityId();
TotemMod.network.sendToDimension(message, player.dimension);
event.setCanceled(true);
break;
}
}
}
}
}
public class EntityStatusMessage implements IMessage {
public int entityID;
public EntityStatusMessage() {}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(entityID);
}
@Override
public void fromBytes(ByteBuf buf) {
entityID = buf.readInt();
}
public static class Handler implements IMessageHandler<EntityStatusMessage, IMessage> {
@Override
public IMessage onMessage(EntityStatusMessage packet, MessageContext message) {
if (message.side.isClient())
act(packet);
else
act(message.getServerHandler().player, packet);
return null;
}
@SideOnly(Side.CLIENT)
private void act(EntityStatusMessage packet) {
Minecraft mc = Minecraft.getMinecraft();
Entity entity = mc.world.getEntityByID(packet.entityID);
if (entity instanceof EntityPlayer) {
mc.effectRenderer.emitParticleAtEntity(entity, EnumParticleTypes.TOTEM, 30);
mc.world.playSound(entity.posX, entity.posY, entity.posZ, SoundEvents.ITEM_TOTEM_USE, entity.getSoundCategory(), 1.0F, 1.0F, false);
if (entity == mc.player)
mc.entityRenderer.displayItemActivation(new ItemStack(Items.BEETROOT_SOUP));
}
}
private void act(EntityPlayerMP player, EntityStatusMessage packet) {
}
}
}
@Override
public void onUpdate(ItemStack stack, World world, Entity entityIn, int itemSlot, boolean isSelected) {
EntityPlayer pl = Minecraft.getMinecraft().player;
Minecraft mc = Minecraft.getMinecraft();
if(isSelected) {
if(pl != null) {
if(pl.getHealth() <= 6.0f && !pl.capabilities.isCreativeMode) {
pl.clearActivePotions();
pl.addPotionEffect(new PotionEffect(MobEffects.SPEED, 600, 2));
pl.addPotionEffect(new PotionEffect(MobEffects.JUMP_BOOST, 300, 2));
for(EnumHand hand : EnumHand.values()) {
pl.setHeldItem(hand, ItemStack.EMPTY);
}
if(world.isRemote) {
mc.effectRenderer.emitParticleAtEntity(mc.player, EnumParticleTypes.TOTEM, 30);
mc.world.playSound(mc.player.posX, mc.player.posY, mc.player.posZ, SoundEvents.ITEM_TOTEM_USE, mc.player.getSoundCategory(), 1.0F, 1.0F, false);
mc.entityRenderer.displayItemActivation(new ItemStack(ItemInit.CowardsTotem));
}
}
}
}
super.onUpdate(stack, world, entityIn, itemSlot, isSelected);
}
НО ПОСЛЕ ЭТОГО ЕСЛИ Я УМРУ ТОТЕМ ДРОПНЕТСЯ С МЕНЯ.
Думаю он у тебя удаляется видимо, но на серверной стороне он остаётся в слоте. Типа когда он исчезает, нажми на слот будто ты от туда достаёшь предмет.EntityPlayer pl = Minecraft.getMinecraft().player;
Это ведь на сервере выполняется тоже, почему предмет останется?item.shrink(1);
А, понялEntityPlayer pl = Minecraft.getMinecraft().player
Нужно код удаляющий предмет выполнять на серверной стороне(либо на обоих)Да,я могу достать из пустого слота свой предмет...