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); } }