/* * Copyright (C) 2004-2015 L2J Server * * This file is part of L2J Server. * * L2J Server is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * L2J Server is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.l2jserver.gameserver.network.serverpackets; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.l2jserver.gameserver.model.Hit; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Character; public class Attack extends L2GameServerPacket { private final int _attackerObjId; private final boolean _soulshot; private final int _ssGrade; private final Location _attackerLoc; private final Location _targetLoc; private final List _hits = new ArrayList<>(); /** * @param attacker * @param target * @param useShots * @param ssGrade */ public Attack(L2Character attacker, L2Character target, boolean useShots, int ssGrade) { _attackerObjId = attacker.getObjectId(); _soulshot = useShots; _ssGrade = ssGrade; _attackerLoc = new Location(attacker); _targetLoc = new Location(target); } /** * Adds hit to the attack (Attacks such as dual dagger/sword/fist has two hits) * @param target * @param damage * @param miss * @param crit * @param shld */ public void addHit(L2Character target, int damage, boolean miss, boolean crit, byte shld) { _hits.add(new Hit(target, damage, miss, crit, shld, _soulshot, _ssGrade)); } /** * @return {@code true} if current attack contains at least 1 hit. */ public boolean hasHits() { return !_hits.isEmpty(); } /** * @return {@code true} if attack has soul shot charged. */ public boolean hasSoulshot() { return _soulshot; } /** * Writes current hit * @param hit */ private void writeHit(Hit hit) { writeD(hit.getTargetId()); writeD(hit.getDamage()); writeC(hit.getFlags()); } @Override protected final void writeImpl() { final Iterator it = _hits.iterator(); writeC(0x33); writeD(_attackerObjId); writeHit(it.next()); writeLoc(_attackerLoc); writeH(_hits.size() - 1); while (it.hasNext()) { writeHit(it.next()); } writeLoc(_targetLoc); } }