/** * Called each tick as long the item is on a player inventory. Uses by maps to check if is on a * player hand and update it's contents. */ public void onUpdate( ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) { // ■爪痕設置キーを押しただの押してないだの boolean isPress = false; // ■押した回数を覚えてるので発散させる while (Hizume.proxy.getKeySOW().isPressed()) { isPress = true; } // ■爪痕設置キーを押しながら緋爪を取ると爪痕が出来るけど、1個だし大丈夫大丈夫 isPress = isPress && Hizume.proxy.getKeySOW().isKeyDown(); // ■カレントアイテムでないなら処理をかえす if (!isSelected) { return; } if (!(entityIn instanceof EntityPlayer)) { return; } EntityPlayer player = (EntityPlayer) entityIn; // ■アイテム使ってるなら空間に傷はつけられない if (player.getItemInUseCount() != 0) { return; } // ■クライアント側での処理 if (worldIn.isRemote && isPress) { // ■腕を振る player.swingItem(); // ■空間へ爪痕をつける EntitySOW[] magic = createSOW(stack, worldIn, player); if (magic != null) { for (EntitySOW base : magic) { worldIn.addWeatherEffect(base); // PacketHandler.INSTANCE.sendToAll(new MessageSOW(base)); PacketHandler.INSTANCE.sendToServer(new MessageSOW(base)); } } } }
/** * ■相手の傷を開く(クライアント側のみ) * * @param stackIn * @param playerIn */ protected Entity doScars(ItemStack stackIn, EntityPlayer playerIn) { Entity target = null; boolean isSoundSE = false; // ■クライアント側で検出する List<MovingObjectPosition> mops = Hizume.proxy.getEntity(stackIn, playerIn); // ■モップにEntityが引っかかってる // if (mop != null && mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) if (mops != null && !mops.isEmpty()) { for (MovingObjectPosition mop : mops) { // ■対象Entityを取得 target = mop.entityHit; if (target == null) { continue; } // ■EntitySOWはこちら if (target instanceof EntitySOW) { // ■接触しているEntityをかき集める List<Entity> entities = playerIn.worldObj.getEntitiesWithinAABBExcludingEntity( target, target.getEntityBoundingBox()); if (entities == null || entities.isEmpty()) { continue; } for (Entity entity : entities) { // ■ドラゴン(概念)はスルー if (entity instanceof EntityDragon) { continue; } // ■生物系のみ if (!(entity instanceof EntityLivingBase) && !(entity instanceof EntityDragonPart)) { continue; } // ■爪痕をつけた本人 if (entity.equals(playerIn)) { continue; } // ■1体でも接触していれば傷が開く // ▼サーバ側 PacketHandler.INSTANCE.sendToServer(new MessageOpenSOW(target, false)); // ▼クライアント側 ((EntitySOW) target).changeScarsState(); // ■効果音ならすよー isSoundSE = true; break; } } // ■EntityLivingBase等はこちら else { DataWatcher dw; if (target instanceof EntityDragonPart) { // target = ((Entity)((EntityDragonPart)target).entityDragonObj); // ■EnderDragonの傷は本体に蓄積してるので、そっちから取得 dw = ((Entity) ((EntityDragonPart) target).entityDragonObj).getDataWatcher(); } else { dw = target.getDataWatcher(); } // ■対象Entityの傷を開く int nHit = this.getHitCount(dw); if (nHit > 0) { // ■総ダメージ float damage = attackDamage2 * (float) nHit; // ■サーバへメッセージ PacketHandler.INSTANCE.sendToServer(new MessageScars(target, damage)); // ■傷は開いたのでリセット this.setHitCount(dw, 0); // ■効果音ならすよー isSoundSE = true; } // ■Entityに接触しているSOWを開く List<Entity> entities = playerIn.worldObj.weatherEffects; if (entities == null || entities.isEmpty()) { continue; } for (Entity entity : entities) { if (entity instanceof EntitySOW) { EntitySOW sow = (EntitySOW) entity; if (sow.getEntityBoundingBox().intersectsWith(target.getEntityBoundingBox())) { // ■重なってるので炸裂 // ▼サーバ側 PacketHandler.INSTANCE.sendToServer(new MessageOpenSOW(sow, false)); // ▼クライアント側 sow.changeScarsState(); // ■効果音ならすよー isSoundSE = true; } } } } } } if (isSoundSE) { // playerIn.worldObj.playSoundAtEntity(playerIn, Hizume.MOD_ID + ":shan", 1.0f, 3.0f); PacketHandler.INSTANCE.sendToServer(new MessageOpenSOW(playerIn, true)); } return target; }