public static final void DamageSummon(final LittleEndianAccessor slea, final MapleCharacter chr) {
    final int unkByte = slea.readByte();
    final int damage = slea.readInt();
    final int monsterIdFrom = slea.readInt();
    //       slea.readByte(); // stance

    final Iterator<MapleSummon> iter = chr.getSummonsReadLock().iterator();
    MapleSummon summon;
    boolean remove = false;
    try {
      while (iter.hasNext()) {
        summon = iter.next();
        if (summon.isPuppet()
            && summon.getOwnerId() == chr.getId()
            && damage > 0) { // We can only have one puppet(AFAIK O.O) so this check is safe.
          summon.addHP((short) -damage);
          if (summon.getHP() <= 0) {
            remove = true;
          }
          chr.getMap()
              .broadcastMessage(
                  chr,
                  SummonPacket.damageSummon(
                      chr.getId(), summon.getSkill(), damage, unkByte, monsterIdFrom),
                  summon.getTruePosition());
          break;
        }
      }
    } finally {
      chr.unlockSummonsReadLock();
    }
    if (remove) {
      chr.cancelEffectFromBuffStat(MapleBuffStat.PUPPET);
    }
  }