@Override public void runImpl() throws Exception { try { switch (_taskId) { case 1: int angle = Math.abs( (weakScarlet.getHeading() < 32768 ? 180 : 540) - (int) (weakScarlet.getHeading() / 182.044444444)); for (Player pc : getPlayers()) pc.enterMovieMode(); blockAll(true); showSocialActionMovie(weakScarlet, 500, angle, 5, 500, 15000, 0); ThreadPoolManager.getInstance().schedule(new SecondMorph(2), 2000); break; case 2: weakScarlet.broadcastPacket(new SocialActionPacket(weakScarlet.getObjectId(), 1)); weakScarlet.setCurrentHp(weakScarlet.getMaxHp() * 3 / 4, false); weakScarlet.setRHandId(_frintezzasSwordId); weakScarlet.broadcastCharInfo(); ThreadPoolManager.getInstance().schedule(new SecondMorph(3), 5500); break; case 3: weakScarlet.broadcastPacket(new SocialActionPacket(weakScarlet.getObjectId(), 4)); blockAll(false); Skill skill = SkillTable.getInstance().getInfo(5017, 1); skill.getEffects(weakScarlet, weakScarlet, false, false); for (Player pc : getPlayers()) pc.leaveMovieMode(); break; } } catch (Exception e) { e.printStackTrace(); } }
@Override public boolean useItem(Playable playable, ItemInstance item, boolean ctrl) { Player player; if (playable.isPlayer()) player = (Player) playable; else if (playable.isPet()) player = playable.getPlayer(); else return false; GameObject target = player.getTarget(); if (target == null || !target.isMonster()) { player.sendPacket(SystemMsg.THAT_IS_AN_INCORRECT_TARGET); return false; } MonsterInstance monster = (MonsterInstance) player.getTarget(); if (!monster.isDead()) { player.sendPacket(SystemMsg.THAT_IS_AN_INCORRECT_TARGET); return false; } Skill skill = SkillTable.getInstance().getInfo(HARVESTER_SKILL_ID, 1); if (skill != null && skill.checkCondition(player, monster, false, false, true)) { player.getAI().Cast(skill, monster); return true; } return false; }
@Override public void useSkill(Creature activeChar, List<Creature> targets) { if (!activeChar.isPlayer()) return; boolean ss = activeChar.getChargedSoulShot() && isSSPossible(); if (ss && getTargetType() != SkillTargetType.TARGET_SELF) activeChar.unChargeShots(false); Creature realTarget; boolean reflected; for (Creature target : targets) { if (target.isDead()) continue; if (target != activeChar) { reflected = target.checkReflectSkill(activeChar, this); realTarget = reflected ? activeChar : target; if (getPower() > 0) // Если == 0 значит скилл "отключен" { AttackInfo info = Formulas.calcPhysDam(activeChar, realTarget, this, false, false, ss, false); realTarget.reduceCurrentHp( info.damage, activeChar, this, true, true, false, true, false, false, true, true, info.crit || info.blow, false, false, false); if (!info.miss || info.damage >= 1) { double lethalDmg = Formulas.calcLethalDamage(activeChar, realTarget, this); if (lethalDmg > 0) realTarget.reduceCurrentHp( lethalDmg, activeChar, this, true, true, false, false, false, false, false); else if (!reflected) realTarget.doCounterAttack(this, activeChar, false); } } getEffects(activeChar, target, false, reflected); } else getEffects(activeChar, target, false); } chargePlayer((Player) activeChar, getId()); super.useSkill(activeChar, targets); }
@Override public List<L2GameServerPacket> addPacketList(Player forPlayer, Creature dropper) { if (isInvisible()) return Collections.emptyList(); List<L2GameServerPacket> list = new ArrayList<L2GameServerPacket>(); list.add(new FakePlayerInfo(this)); boolean dualCast = isDualCastingNow(); if (isCastingNow()) { Creature castingTarget = getCastingTarget(); Skill castingSkill = getCastingSkill(); long animationEndTime = getAnimationEndTime(); if (castingSkill != null && castingTarget != null && castingTarget.isCreature() && animationEndTime > 0) list.add( new MagicSkillUse( this, castingTarget, castingSkill.getId(), castingSkill.getLevel(), (int) (animationEndTime - System.currentTimeMillis()), 0, dualCast)); } if (dualCast) { Creature castingTarget = getDualCastingTarget(); Skill castingSkill = getDualCastingSkill(); long animationEndTime = getDualAnimationEndTime(); if (castingSkill != null && castingTarget != null && castingTarget.isCreature() && animationEndTime > 0) list.add( new MagicSkillUse( this, castingTarget, castingSkill.getId(), castingSkill.getLevel(), (int) (animationEndTime - System.currentTimeMillis()), 0, dualCast)); } if (isInCombat()) list.add(new AutoAttackStart(getObjectId())); // list.add(RelationChanged.update(forPlayer, this, forPlayer)); if (isMoving || isFollow) list.add(movePacket()); return list; }
@Override public void useSkill(Creature activeChar, List<Creature> targets) { double percent = _power; for (Creature target : targets) { if (target.isPlayer()) { Player player = target.getPlayer(); int points = (int) (Player.MAX_VITALITY_POINTS / 100 * percent); player.setVitality(player.getVitality() + points); } getEffects(activeChar, target, false); } if (isSSPossible()) activeChar.unChargeShots(isMagic()); super.useSkill(activeChar, targets); }
@Override public void useSkill(final Creature activeChar, List<Creature> targets) { for (final Creature target : targets) if (target != null) { final Player pcTarget = target.getPlayer(); if (pcTarget == null) continue; if (!pcTarget.getPlayerAccess().UseTeleport) continue; if (pcTarget.getActiveWeaponFlagAttachment() != null) { activeChar.sendPacket(SystemMsg.YOU_CANNOT_TELEPORT_WHILE_IN_POSSESSION_OF_A_WARD); continue; } if (pcTarget.isInOlympiadMode()) { activeChar.sendPacket( SystemMsg .YOU_CANNOT_SUMMON_PLAYERS_WHO_ARE_CURRENTLY_PARTICIPATING_IN_THE_GRAND_OLYMPIAD); return; } if (pcTarget.isInObserverMode()) { activeChar.sendPacket( new SystemMessagePacket(SystemMsg.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS) .addSkillName(getId(), getLevel())); return; } for (GlobalEvent e : pcTarget.getEvents()) { if (!e.canUseTeleport(pcTarget)) { activeChar.sendPacket( new SystemMessagePacket(SystemMsg.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS) .addSkillName(getId(), getLevel())); return; } } if (pcTarget.isInDuel() || pcTarget.getTeam() != TeamType.NONE) { activeChar.sendMessage(new CustomMessage("common.RecallInDuel", (Player) activeChar)); return; } if (_isItemHandler) { // TODO: переделать SOE по TownId на SOE по Loc_id if (_itemConsumeId[0] == 7127) // hardin's academy { pcTarget.teleToLocation(105918, 109759, -3207, 0); return; } if (_itemConsumeId[0] == 7130) // ivory { pcTarget.teleToLocation(85475, 16087, -3672, 0); return; } if (_itemConsumeId[0] == 7618) { pcTarget.teleToLocation(149864, -81062, -5618, 0); return; } if (_itemConsumeId[0] == 7619) { pcTarget.teleToLocation(108275, -53785, -2524, 0); return; } } if (_loc != null) { pcTarget.teleToLocation(_loc, 0); return; } // FIXME [G1ta0] перенести координаты в скиллы switch (_townId) // To town by Id { case 1: // Talking Island pcTarget.teleToLocation(-114558, 253605, -1536, 0); return; case 2: // Elven Village pcTarget.teleToLocation(45576, 49412, -2950, 0); return; case 3: // Dark Elven Village pcTarget.teleToLocation(12501, 16768, -4500, 0); return; case 4: // Orc Village pcTarget.teleToLocation(-44884, -115063, -80, 0); return; case 5: // Dwarven Village pcTarget.teleToLocation(115790, -179146, -890, 0); return; case 6: // Town of Gludio pcTarget.teleToLocation(-14279, 124446, -3000, 0); return; case 7: // Gludin Village pcTarget.teleToLocation(-82909, 150357, -3000, 0); return; case 8: // Town of Dion pcTarget.teleToLocation(19025, 145245, -3107, 0); return; case 9: // Town of Giran pcTarget.teleToLocation(82272, 147801, -3350, 0); return; case 10: // Town of Oren pcTarget.teleToLocation(82323, 55466, -1480, 0); return; case 11: // Town of Aden pcTarget.teleToLocation(144526, 24661, -2100, 0); return; case 12: // Hunters Village pcTarget.teleToLocation(117189, 78952, -2210, 0); return; case 13: // Heine pcTarget.teleToLocation(110768, 219824, -3624, 0); return; case 14: // Rune Township pcTarget.teleToLocation(43536, -50416, -800, 0); return; case 15: // Town of Goddard pcTarget.teleToLocation(148288, -58304, -2979, 0); return; case 16: // Town of Schuttgart pcTarget.teleToLocation(87776, -140384, -1536, 0); return; case 17: // Kamael Village pcTarget.teleToLocation(-117081, 44171, 507, 0); return; case 18: // Primeval Isle pcTarget.teleToLocation(10568, -24600, -3648, 0); return; case 19: // Floran Village pcTarget.teleToLocation(17144, 170156, -3502, 0); return; case 20: // Hellbound pcTarget.teleToLocation(-16434, 208803, -3664, 0); return; case 21: // Keucereus Alliance Base pcTarget.teleToLocation(-184200, 243080, 1568, 0); return; case 22: // Steel Citadel pcTarget.teleToLocation(8976, 252416, -1928, 0); return; case 23: // Town of Arcan pcTarget.teleToLocation(207559, 86429, -1000, 0); return; case 24: // Vernon Village pcTarget.teleToLocation(-80403, 247853, -3496, 0); return; case 25: // Gludin Church pcTarget.teleToLocation(-79592, 150824, -3066, 0); return; case 26: // Windy Hill pcTarget.teleToLocation(-93649, 89763, -3208, 0); return; case 27: // Orc Barrack pcTarget.teleToLocation(-85672, 106664, -3577, 0); return; case 28: // Town of Dion - front of Sylvain pcTarget.teleToLocation(16376, 142296, -2718, 0); return; case 29: // Cruma Tower - front of Lorain pcTarget.teleToLocation(16520, 113384, -3605, 0); return; case 30: // Cruma Tower - front of Rombel pcTarget.teleToLocation(17776, 114851, -11704, 0); return; case 31: // Town of Oren - front of Hollint pcTarget.teleToLocation(83633, 53064, -1456, 0); return; case 32: // Sea of Spore - front of Andy pcTarget.teleToLocation(64328, 26803, -3768, 0); return; case 33: // Town of Aden - front of Orven pcTarget.teleToLocation(147446, 22761, -1984, 0); return; case 34: // Forsaken Plains - front of Novain pcTarget.teleToLocation(174470, 40112, -4144, 0); return; case 35: // Scroll of Escape: Fields of Massacre pcTarget.teleToLocation(183543, -14974, -2768, 0); return; case 36: // Scroll of Escape: Town of Rune pcTarget.teleToLocation(174470, 40112, -4144, 0); return; case 37: // Scroll of Escape: Swamp of Screams pcTarget.teleToLocation(174470, 40112, -4144, 0); return; case 38: // Scroll of Escape: Town of Goddard pcTarget.teleToLocation(174470, 40112, -4144, 0); return; case 39: // Scroll of Escape: Wall of Argos pcTarget.teleToLocation(174470, 40112, -4144, 0); return; case 40: // croll of Escape: Town of Giran pcTarget.teleToLocation(174470, 40112, -4144, 0); return; case 41: // Scroll of Escape: Dragon Valley pcTarget.teleToLocation(174470, 40112, -4144, 0); return; } if (_castle) // To castle { pcTarget.teleToCastle(); return; } if (_clanhall) // to clanhall { pcTarget.teleToClanhall(); return; } if (_fortress) // To fortress { pcTarget.teleToFortress(); return; } pcTarget.teleToClosestTown(); } if (isSSPossible()) activeChar.unChargeShots(isMagic()); super.useSkill(activeChar, targets); }
@Override public void runImpl() throws Exception { try { switch (_taskId) { case 1: _angle = Math.abs( (weakScarlet.getHeading() < 32768 ? 180 : 540) - (int) (weakScarlet.getHeading() / 182.044444444)); for (Player pc : getPlayers()) pc.enterMovieMode(); blockAll(true); frintezza.broadcastPacket(new MagicSkillCanceled(frintezza.getObjectId())); frintezza.broadcastPacket(new SocialActionPacket(frintezza.getObjectId(), 4)); ThreadPoolManager.getInstance().schedule(new ThirdMorph(2), 100); break; case 2: showSocialActionMovie(frintezza, 250, 120, 15, 0, 1000, 0); showSocialActionMovie(frintezza, 250, 120, 15, 0, 10000, 0); ThreadPoolManager.getInstance().schedule(new ThirdMorph(3), 6500); break; case 3: frintezza.broadcastPacket(new MagicSkillUse(frintezza, frintezza, 5006, 1, 34000, 0)); showSocialActionMovie(frintezza, 500, 70, 15, 3000, 10000, 0); ThreadPoolManager.getInstance().schedule(new ThirdMorph(4), 3000); break; case 4: showSocialActionMovie(frintezza, 2500, 90, 12, 6000, 10000, 0); ThreadPoolManager.getInstance().schedule(new ThirdMorph(5), 3000); break; case 5: showSocialActionMovie(weakScarlet, 250, _angle, 12, 0, 1000, 0); showSocialActionMovie(weakScarlet, 250, _angle, 12, 0, 10000, 0); ThreadPoolManager.getInstance().schedule(new ThirdMorph(6), 500); break; case 6: weakScarlet.doDie(weakScarlet); showSocialActionMovie(weakScarlet, 450, _angle, 14, 8000, 8000, 0); ThreadPoolManager.getInstance().schedule(new ThirdMorph(7), 6250); break; case 7: NpcLocation loc = new NpcLocation(); loc.set(weakScarlet.getLoc()); loc.npcId = _strongScarletId; weakScarlet.deleteMe(); weakScarlet = null; strongScarlet = spawn(loc); strongScarlet.addListener(_deathListener); block(strongScarlet, true); showSocialActionMovie(strongScarlet, 450, _angle, 12, 500, 14000, 2); ThreadPoolManager.getInstance().schedule(new ThirdMorph(9), 5000); break; case 9: blockAll(false); for (Player pc : getPlayers()) pc.leaveMovieMode(); Skill skill = SkillTable.getInstance().getInfo(5017, 1); skill.getEffects(strongScarlet, strongScarlet, false, false); break; } } catch (Exception e) { e.printStackTrace(); } }