Sync with L2jServer HighFive Jul 3rd 2015.
This commit is contained in:
@@ -100,7 +100,6 @@ public final class Baium extends AbstractNpcAI
|
|||||||
// Misc
|
// Misc
|
||||||
private L2GrandBossInstance _baium = null;
|
private L2GrandBossInstance _baium = null;
|
||||||
private static long _lastAttack = 0;
|
private static long _lastAttack = 0;
|
||||||
private static L2PcInstance _standbyPlayer = null;
|
|
||||||
|
|
||||||
private Baium()
|
private Baium()
|
||||||
{
|
{
|
||||||
@@ -213,6 +212,7 @@ public final class Baium extends AbstractNpcAI
|
|||||||
_lastAttack = System.currentTimeMillis();
|
_lastAttack = System.currentTimeMillis();
|
||||||
startQuestTimer("WAKEUP_ACTION", 50, _baium, null);
|
startQuestTimer("WAKEUP_ACTION", 50, _baium, null);
|
||||||
startQuestTimer("MANAGE_EARTHQUAKE", 2000, _baium, null);
|
startQuestTimer("MANAGE_EARTHQUAKE", 2000, _baium, null);
|
||||||
|
startQuestTimer("SOCIAL_ACTION", 10000, _baium, player);
|
||||||
startQuestTimer("CHECK_ATTACK", 60000, _baium, null);
|
startQuestTimer("CHECK_ATTACK", 60000, _baium, null);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -231,7 +231,6 @@ public final class Baium extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
zone.broadcastPacket(new Earthquake(npc.getX(), npc.getY(), npc.getZ(), 40, 10));
|
zone.broadcastPacket(new Earthquake(npc.getX(), npc.getY(), npc.getZ(), 40, 10));
|
||||||
zone.broadcastPacket(new PlaySound("BS02_A"));
|
zone.broadcastPacket(new PlaySound("BS02_A"));
|
||||||
startQuestTimer("SOCIAL_ACTION", 8000, npc, player);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -253,10 +252,18 @@ public final class Baium extends AbstractNpcAI
|
|||||||
player.teleToLocation(BAIUM_GIFT_LOC);
|
player.teleToLocation(BAIUM_GIFT_LOC);
|
||||||
startQuestTimer("PLAYER_KILL", 3000, npc, player);
|
startQuestTimer("PLAYER_KILL", 3000, npc, player);
|
||||||
}
|
}
|
||||||
else if ((_standbyPlayer != null) && _standbyPlayer.isInsideRadius(npc, 16000, true, false))
|
else
|
||||||
{
|
{
|
||||||
_standbyPlayer.teleToLocation(BAIUM_GIFT_LOC);
|
L2PcInstance randomPlayer = getRandomPlayer(npc);
|
||||||
startQuestTimer("PLAYER_KILL", 3000, npc, _standbyPlayer);
|
if (randomPlayer != null)
|
||||||
|
{
|
||||||
|
randomPlayer.teleToLocation(BAIUM_GIFT_LOC);
|
||||||
|
startQuestTimer("PLAYER_KILL", 3000, npc, randomPlayer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
startQuestTimer("PLAYER_KILL", 3000, npc, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -266,20 +273,20 @@ public final class Baium extends AbstractNpcAI
|
|||||||
if ((player != null) && player.isInsideRadius(npc, 16000, true, false))
|
if ((player != null) && player.isInsideRadius(npc, 16000, true, false))
|
||||||
{
|
{
|
||||||
zone.broadcastPacket(new SocialAction(npc.getObjectId(), 1));
|
zone.broadcastPacket(new SocialAction(npc.getObjectId(), 1));
|
||||||
broadcastNpcSay(npc, ChatType.NPC_GENERAL, player.getName() + ", How dare you wake me! Now you shall die!"); // TODO: replace with NpcStringId when are done core support
|
broadcastNpcSay(npc, ChatType.NPC_GENERAL, NpcStringId.HOW_DARE_YOU_WAKE_ME_NOW_YOU_SHALL_DIE, player.getName());
|
||||||
npc.setTarget(player);
|
npc.setTarget(player);
|
||||||
npc.doCast(BAIUM_PRESENT.getSkill());
|
npc.doCast(BAIUM_PRESENT.getSkill());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (L2PcInstance players : zone.getPlayersInside())
|
for (L2PcInstance insidePlayer : zone.getPlayersInside())
|
||||||
{
|
{
|
||||||
if (players.isHero())
|
if (insidePlayer.isHero())
|
||||||
{
|
{
|
||||||
zone.broadcastPacket(new ExShowScreenMessage(NpcStringId.NOT_EVEN_THE_GODS_THEMSELVES_COULD_TOUCH_ME_BUT_YOU_S1_YOU_DARE_CHALLENGE_ME_IGNORANT_MORTAL, 2, 4000, players.getName()));
|
zone.broadcastPacket(new ExShowScreenMessage(NpcStringId.NOT_EVEN_THE_GODS_THEMSELVES_COULD_TOUCH_ME_BUT_YOU_S1_YOU_DARE_CHALLENGE_ME_IGNORANT_MORTAL, 2, 4000, insidePlayer.getName()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
startQuestTimer("SPAWN_ARCHANGEL", 8000, npc, null);
|
startQuestTimer("SPAWN_ARCHANGEL", 8000, npc, player);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "SPAWN_ARCHANGEL":
|
case "SPAWN_ARCHANGEL":
|
||||||
@@ -296,19 +303,12 @@ public final class Baium extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
addAttackPlayerDesire(npc, player);
|
addAttackPlayerDesire(npc, player);
|
||||||
}
|
}
|
||||||
else if ((_standbyPlayer != null) && !_standbyPlayer.isDead())
|
|
||||||
{
|
|
||||||
addAttackPlayerDesire(npc, _standbyPlayer);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (L2Character creature : npc.getKnownList().getKnownCharactersInRadius(2000))
|
L2PcInstance randomPlayer = getRandomPlayer(npc);
|
||||||
|
if (randomPlayer != null)
|
||||||
{
|
{
|
||||||
if ((creature != null) && creature.isPlayer() && zone.isInsideZone(creature) && !creature.isDead())
|
addAttackPlayerDesire(npc, randomPlayer);
|
||||||
{
|
|
||||||
addAttackPlayerDesire(npc, (L2Playable) creature);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -377,6 +377,7 @@ public final class Baium extends AbstractNpcAI
|
|||||||
{
|
{
|
||||||
if ((npc != null) && ((_lastAttack + 1800000) < System.currentTimeMillis()))
|
if ((npc != null) && ((_lastAttack + 1800000) < System.currentTimeMillis()))
|
||||||
{
|
{
|
||||||
|
cancelQuestTimers("SELECT_TARGET");
|
||||||
notifyEvent("CLEAR_ZONE", null, null);
|
notifyEvent("CLEAR_ZONE", null, null);
|
||||||
addSpawn(BAIUM_STONE, BAIUM_LOC, false, 0);
|
addSpawn(BAIUM_STONE, BAIUM_LOC, false, 0);
|
||||||
setStatus(ALIVE);
|
setStatus(ALIVE);
|
||||||
@@ -560,6 +561,7 @@ public final class Baium extends AbstractNpcAI
|
|||||||
startQuestTimer("CLEAR_STATUS", respawnTime, null, null);
|
startQuestTimer("CLEAR_STATUS", respawnTime, null, null);
|
||||||
startQuestTimer("CLEAR_ZONE", 900000, null, null);
|
startQuestTimer("CLEAR_ZONE", 900000, null, null);
|
||||||
cancelQuestTimer("CHECK_ATTACK", npc, null);
|
cancelQuestTimer("CHECK_ATTACK", npc, null);
|
||||||
|
cancelQuestTimers("SELECT_TARGET");
|
||||||
}
|
}
|
||||||
return super.onKill(npc, killer, isSummon);
|
return super.onKill(npc, killer, isSummon);
|
||||||
}
|
}
|
||||||
@@ -572,11 +574,6 @@ public final class Baium extends AbstractNpcAI
|
|||||||
return super.onSeeCreature(npc, creature, isSummon);
|
return super.onSeeCreature(npc, creature, isSummon);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (creature.isPlayer() && !creature.isDead() && (_standbyPlayer == null))
|
|
||||||
{
|
|
||||||
_standbyPlayer = (L2PcInstance) creature;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (creature.isInCategory(CategoryType.CLERIC_GROUP))
|
if (creature.isInCategory(CategoryType.CLERIC_GROUP))
|
||||||
{
|
{
|
||||||
if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
|
if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
|
||||||
@@ -785,6 +782,18 @@ public final class Baium extends AbstractNpcAI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private L2PcInstance getRandomPlayer(L2Npc npc)
|
||||||
|
{
|
||||||
|
for (L2Character creature : npc.getKnownList().getKnownCharactersInRadius(2000))
|
||||||
|
{
|
||||||
|
if ((creature != null) && creature.isPlayer() && zone.isInsideZone(creature) && !creature.isDead())
|
||||||
|
{
|
||||||
|
return (L2PcInstance) creature;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args)
|
public static void main(String[] args)
|
||||||
{
|
{
|
||||||
new Baium();
|
new Baium();
|
||||||
|
@@ -3,5 +3,5 @@ I'm very impressed.<br>
|
|||||||
No one has ever broken through this fast to the Hall of Suffering. Extraordinary! In recognition of your achievement, I will give you a <font color="LEVEL">Jeweled Battle Supply</font>.<br>
|
No one has ever broken through this fast to the Hall of Suffering. Extraordinary! In recognition of your achievement, I will give you a <font color="LEVEL">Jeweled Battle Supply</font>.<br>
|
||||||
It is granted only to those who achieve an especially impressive feat in battle.<br>
|
It is granted only to those who achieve an especially impressive feat in battle.<br>
|
||||||
Your leader may receive it on your behalf.<br>
|
Your leader may receive it on your behalf.<br>
|
||||||
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a>
|
<a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
|
||||||
</body></html>
|
</body></html>
|
@@ -2,5 +2,5 @@
|
|||||||
Unknown Text!<br>
|
Unknown Text!<br>
|
||||||
The reward is <font color="LEVEL">Mother-of-Pearl Ornamented Duel Supplies</font>.<br>
|
The reward is <font color="LEVEL">Mother-of-Pearl Ornamented Duel Supplies</font>.<br>
|
||||||
I'll grant this reward to the leader who represents all of you.<br>
|
I'll grant this reward to the leader who represents all of you.<br>
|
||||||
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a>
|
<a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
|
||||||
</body></html>
|
</body></html>
|
@@ -2,5 +2,5 @@
|
|||||||
Unknown Text!<br>
|
Unknown Text!<br>
|
||||||
The reward is <font color="LEVEL">Gold-Ornamented Duel Supplies</font>.<br>
|
The reward is <font color="LEVEL">Gold-Ornamented Duel Supplies</font>.<br>
|
||||||
I'll grant this reward to the leader who represents all of you.<br>
|
I'll grant this reward to the leader who represents all of you.<br>
|
||||||
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a>
|
<a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
|
||||||
</body></html>
|
</body></html>
|
@@ -2,5 +2,5 @@
|
|||||||
Unknown Text!<br>
|
Unknown Text!<br>
|
||||||
The reward is <font color="LEVEL">Silver-Ornamented Duel Supplies</font>.<br>
|
The reward is <font color="LEVEL">Silver-Ornamented Duel Supplies</font>.<br>
|
||||||
I'll grant this reward to the leader who represents all of you.<br>
|
I'll grant this reward to the leader who represents all of you.<br>
|
||||||
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a>
|
<a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
|
||||||
</body></html>
|
</body></html>
|
@@ -2,5 +2,5 @@
|
|||||||
Unknown Text!<br>
|
Unknown Text!<br>
|
||||||
The reward is <font color="LEVEL">Bronze-Ornamented Duel Supplies</font>.<br>
|
The reward is <font color="LEVEL">Bronze-Ornamented Duel Supplies</font>.<br>
|
||||||
I'll grant this reward to the leader who represents all of you.<br>
|
I'll grant this reward to the leader who represents all of you.<br>
|
||||||
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a>
|
<a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
|
||||||
</body></html>
|
</body></html>
|
@@ -2,5 +2,5 @@
|
|||||||
Unknown Text!<br>
|
Unknown Text!<br>
|
||||||
The reward is <font color="LEVEL">Non-Ornamented Duel Supplies</font>.<br>
|
The reward is <font color="LEVEL">Non-Ornamented Duel Supplies</font>.<br>
|
||||||
I'll grant this reward to the leader who represents all of you.<br>
|
I'll grant this reward to the leader who represents all of you.<br>
|
||||||
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a>
|
<a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
|
||||||
</body></html>
|
</body></html>
|
@@ -2,5 +2,5 @@
|
|||||||
Unknown Text!<br>
|
Unknown Text!<br>
|
||||||
The reward is <font color="LEVEL">Weak-Looking Duel Supplies</font>.<br>
|
The reward is <font color="LEVEL">Weak-Looking Duel Supplies</font>.<br>
|
||||||
I'll grant this reward to the leader who represents all of you.<br>
|
I'll grant this reward to the leader who represents all of you.<br>
|
||||||
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a>
|
<a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
|
||||||
</body></html>
|
</body></html>
|
@@ -2,5 +2,5 @@
|
|||||||
Unknown Text!<br>
|
Unknown Text!<br>
|
||||||
The reward is <font color="LEVEL">Sad-Looking Duel Supplies</font>.<br>
|
The reward is <font color="LEVEL">Sad-Looking Duel Supplies</font>.<br>
|
||||||
I'll grant this reward to the leader who represents all of you.<br>
|
I'll grant this reward to the leader who represents all of you.<br>
|
||||||
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a>
|
<a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
|
||||||
</body></html>
|
</body></html>
|
@@ -2,5 +2,5 @@
|
|||||||
Unknown Text!<br>
|
Unknown Text!<br>
|
||||||
The reward is <font color="LEVEL">Poor-Looking Duel Supplies</font>.<br>
|
The reward is <font color="LEVEL">Poor-Looking Duel Supplies</font>.<br>
|
||||||
I'll grant this reward to the leader who represents all of you.<br>
|
I'll grant this reward to the leader who represents all of you.<br>
|
||||||
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a>
|
<a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
|
||||||
</body></html>
|
</body></html>
|
@@ -2,5 +2,5 @@
|
|||||||
I'm very disappointed.<br>
|
I'm very disappointed.<br>
|
||||||
If I had known your skills were this embarrasingly poor, I would not have assigned you this mission. You're lucky to still be alive! Still, a promise is a promise, so I will give you this <font color="LEVEL">Worthless Battle Supply</font>.<br>
|
If I had known your skills were this embarrasingly poor, I would not have assigned you this mission. You're lucky to still be alive! Still, a promise is a promise, so I will give you this <font color="LEVEL">Worthless Battle Supply</font>.<br>
|
||||||
I'll grant this reward to the leader who represents all of you.<br>
|
I'll grant this reward to the leader who represents all of you.<br>
|
||||||
<a action="bypass -h npc_%objectId%_Quest SeedOfInfinity">Receive the supply.</a>
|
<a action="bypass -h npc_%objectId%_Quest HallOfSuffering">Receive the supply.</a>
|
||||||
</body></html>
|
</body></html>
|
@@ -188,7 +188,7 @@ public final class HallOfSuffering extends AbstractNpcAI
|
|||||||
|
|
||||||
public HallOfSuffering()
|
public HallOfSuffering()
|
||||||
{
|
{
|
||||||
super(HallOfSuffering.class.getSimpleName(), "gracia/instances/SeedOfInfinity/HallOfSuffering");
|
super(HallOfSuffering.class.getSimpleName(), "gracia/instances/SeedOfInfinity");
|
||||||
addStartNpc(MOUTHOFEKIMUS, TEPIOS);
|
addStartNpc(MOUTHOFEKIMUS, TEPIOS);
|
||||||
addTalkId(MOUTHOFEKIMUS, TEPIOS);
|
addTalkId(MOUTHOFEKIMUS, TEPIOS);
|
||||||
addFirstTalkId(TEPIOS);
|
addFirstTalkId(TEPIOS);
|
||||||
@@ -449,7 +449,7 @@ public final class HallOfSuffering extends AbstractNpcAI
|
|||||||
|
|
||||||
private String getPtLeaderText(L2PcInstance player, HSWorld world)
|
private String getPtLeaderText(L2PcInstance player, HSWorld world)
|
||||||
{
|
{
|
||||||
String htmltext = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), "/scripts/instances/SeedOfInfinity/HallOfSuffering/32530-10.htm");
|
String htmltext = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), "/scripts/gracia/instances/SeedOfInfinity/HallOfSuffering/32530-10.htm");
|
||||||
htmltext = htmltext.replaceAll("%ptLeader%", String.valueOf(world.ptLeaderName));
|
htmltext = htmltext.replaceAll("%ptLeader%", String.valueOf(world.ptLeaderName));
|
||||||
return htmltext;
|
return htmltext;
|
||||||
}
|
}
|
||||||
|
@@ -1355,11 +1355,13 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
setAttackTarget(caster.getMostHated());
|
setAttackTarget(caster.getMostHated());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
L2Character attackTarget = getAttackTarget();
|
|
||||||
|
final L2Character attackTarget = getAttackTarget();
|
||||||
if (attackTarget == null)
|
if (attackTarget == null)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
double dist = caster.calculateDistance(attackTarget, false, false);
|
double dist = caster.calculateDistance(attackTarget, false, false);
|
||||||
double dist2 = dist - attackTarget.getTemplate().getCollisionRadius();
|
double dist2 = dist - attackTarget.getTemplate().getCollisionRadius();
|
||||||
double range = caster.getPhysicalAttackRange() + caster.getTemplate().getCollisionRadius() + attackTarget.getTemplate().getCollisionRadius();
|
double range = caster.getPhysicalAttackRange() + caster.getTemplate().getCollisionRadius() + attackTarget.getTemplate().getCollisionRadius();
|
||||||
@@ -1376,10 +1378,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
if (!caster.isAffectedBySkill(sk.getId()))
|
if (!caster.isAffectedBySkill(sk.getId()))
|
||||||
{
|
{
|
||||||
clientStopMoving(null);
|
clientStopMoving(null);
|
||||||
// L2Object target = attackTarget;
|
|
||||||
caster.setTarget(caster);
|
caster.setTarget(caster);
|
||||||
caster.doCast(sk);
|
caster.doCast(sk);
|
||||||
// _actor.setTarget(target);
|
_actor.setTarget(attackTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// ----------------------------------------
|
// ----------------------------------------
|
||||||
@@ -1394,20 +1395,18 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
if (target != null)
|
if (target != null)
|
||||||
{
|
{
|
||||||
clientStopMoving(null);
|
clientStopMoving(null);
|
||||||
L2Object targets = attackTarget;
|
|
||||||
caster.setTarget(target);
|
caster.setTarget(target);
|
||||||
caster.doCast(sk);
|
caster.doCast(sk);
|
||||||
caster.setTarget(targets);
|
caster.setTarget(attackTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (canParty(sk))
|
if (canParty(sk))
|
||||||
{
|
{
|
||||||
clientStopMoving(null);
|
clientStopMoving(null);
|
||||||
L2Object targets = attackTarget;
|
|
||||||
caster.setTarget(caster);
|
caster.setTarget(caster);
|
||||||
caster.doCast(sk);
|
caster.doCast(sk);
|
||||||
caster.setTarget(targets);
|
caster.setTarget(attackTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1464,10 +1463,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
if (target != null)
|
if (target != null)
|
||||||
{
|
{
|
||||||
clientStopMoving(null);
|
clientStopMoving(null);
|
||||||
L2Object targets = attackTarget;
|
|
||||||
caster.setTarget(target);
|
caster.setTarget(target);
|
||||||
caster.doCast(sk);
|
caster.doCast(sk);
|
||||||
caster.setTarget(targets);
|
caster.setTarget(attackTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1506,15 +1504,18 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
clientStopMoving(null);
|
clientStopMoving(null);
|
||||||
caster.setTarget(leader);
|
caster.setTarget(leader);
|
||||||
caster.doCast(sk);
|
caster.doCast(sk);
|
||||||
|
caster.setTarget(attackTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Rnd.get(100) < ((100 - percentage) / 3))
|
if (Rnd.get(100) < ((100 - percentage) / 3))
|
||||||
{
|
{
|
||||||
clientStopMoving(null);
|
clientStopMoving(null);
|
||||||
caster.setTarget(caster);
|
caster.setTarget(caster);
|
||||||
caster.doCast(sk);
|
caster.doCast(sk);
|
||||||
|
caster.setTarget(attackTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1541,6 +1542,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
clientStopMoving(null);
|
clientStopMoving(null);
|
||||||
caster.setTarget(obj);
|
caster.setTarget(obj);
|
||||||
caster.doCast(sk);
|
caster.doCast(sk);
|
||||||
|
caster.setTarget(attackTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1554,6 +1556,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
L2Npc targets = ((L2Npc) obj);
|
L2Npc targets = ((L2Npc) obj);
|
||||||
if (targets.isInMyClan(caster))
|
if (targets.isInMyClan(caster))
|
||||||
{
|
{
|
||||||
@@ -1562,6 +1565,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
clientStopMoving(null);
|
clientStopMoving(null);
|
||||||
caster.setTarget(caster);
|
caster.setTarget(caster);
|
||||||
caster.doCast(sk);
|
caster.doCast(sk);
|
||||||
|
caster.setTarget(attackTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1584,10 +1588,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
if (target != null)
|
if (target != null)
|
||||||
{
|
{
|
||||||
clientStopMoving(null);
|
clientStopMoving(null);
|
||||||
L2Object targets = attackTarget;
|
|
||||||
caster.setTarget(target);
|
caster.setTarget(target);
|
||||||
caster.doCast(sk);
|
caster.doCast(sk);
|
||||||
caster.setTarget(targets);
|
caster.setTarget(attackTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1738,6 +1741,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
clientStopMoving(null);
|
clientStopMoving(null);
|
||||||
caster.setTarget(leader);
|
caster.setTarget(leader);
|
||||||
caster.doCast(sk);
|
caster.doCast(sk);
|
||||||
|
caster.setTarget(attackTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1755,6 +1759,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Rnd.get(100) < 10)
|
if (Rnd.get(100) < 10)
|
||||||
{
|
{
|
||||||
if (GeoData.getInstance().canSeeTarget(caster, targets))
|
if (GeoData.getInstance().canSeeTarget(caster, targets))
|
||||||
@@ -1762,6 +1767,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
clientStopMoving(null);
|
clientStopMoving(null);
|
||||||
caster.setTarget(obj);
|
caster.setTarget(obj);
|
||||||
caster.doCast(sk);
|
caster.doCast(sk);
|
||||||
|
caster.setTarget(attackTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1783,6 +1789,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
clientStopMoving(null);
|
clientStopMoving(null);
|
||||||
caster.setTarget(caster);
|
caster.setTarget(caster);
|
||||||
caster.doCast(sk);
|
caster.doCast(sk);
|
||||||
|
caster.setTarget(attackTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1804,10 +1811,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
|
|||||||
if (target != null)
|
if (target != null)
|
||||||
{
|
{
|
||||||
clientStopMoving(null);
|
clientStopMoving(null);
|
||||||
L2Object targets = attackTarget;
|
|
||||||
caster.setTarget(target);
|
caster.setTarget(target);
|
||||||
caster.doCast(sk);
|
caster.doCast(sk);
|
||||||
caster.setTarget(targets);
|
caster.setTarget(attackTarget);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -112,7 +112,9 @@ public final class AnnouncementsTable
|
|||||||
{
|
{
|
||||||
if (announce.isValid() && (announce.getType() == type))
|
if (announce.isValid() && (announce.getType() == type))
|
||||||
{
|
{
|
||||||
player.sendPacket(new CreatureSay(0, ChatType.ANNOUNCEMENT, player.getName(), announce.getContent()));
|
player.sendPacket(new CreatureSay(0, //
|
||||||
|
type == AnnouncementType.CRITICAL ? ChatType.CRITICAL_ANNOUNCE : ChatType.ANNOUNCEMENT, //
|
||||||
|
player.getName(), announce.getContent()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -130,7 +130,7 @@ public class SummonEffectsTable
|
|||||||
|
|
||||||
public void addPetEffect(int controlObjectId, Skill skill, int effectCurTime)
|
public void addPetEffect(int controlObjectId, Skill skill, int effectCurTime)
|
||||||
{
|
{
|
||||||
_petEffects.putIfAbsent(controlObjectId, new ArrayList<>()).add(new SummonEffect(skill, effectCurTime));
|
_petEffects.computeIfAbsent(controlObjectId, k -> new ArrayList<>()).add(new SummonEffect(skill, effectCurTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean containsPetId(int controlObjectId)
|
public boolean containsPetId(int controlObjectId)
|
||||||
|
@@ -25,6 +25,7 @@ import java.util.Collections;
|
|||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -79,29 +80,30 @@ import com.l2jserver.util.data.xml.IXmlReader;
|
|||||||
public final class SkillTreesData implements IXmlReader
|
public final class SkillTreesData implements IXmlReader
|
||||||
{
|
{
|
||||||
// ClassId, HashMap of Skill Hash Code, L2SkillLearn
|
// ClassId, HashMap of Skill Hash Code, L2SkillLearn
|
||||||
private static final Map<ClassId, Map<Integer, L2SkillLearn>> _classSkillTrees = new HashMap<>();
|
// ClassId, Map of Skill Hash Code, L2SkillLearn
|
||||||
private static final Map<ClassId, Map<Integer, L2SkillLearn>> _transferSkillTrees = new HashMap<>();
|
private final Map<ClassId, Map<Integer, L2SkillLearn>> _classSkillTrees = new LinkedHashMap<>();
|
||||||
private static final Map<Race, Map<Integer, L2SkillLearn>> _raceSkillTree = new HashMap<>();
|
private final Map<ClassId, Map<Integer, L2SkillLearn>> _transferSkillTrees = new LinkedHashMap<>();
|
||||||
private static final Map<SubclassType, Map<Integer, L2SkillLearn>> _revelationSkillTree = new HashMap<>();
|
private static final Map<Race, Map<Integer, L2SkillLearn>> _raceSkillTree = new LinkedHashMap<>();
|
||||||
|
private static final Map<SubclassType, Map<Integer, L2SkillLearn>> _revelationSkillTree = new LinkedHashMap<>();
|
||||||
// Skill Hash Code, L2SkillLearn
|
// Skill Hash Code, L2SkillLearn
|
||||||
private static final Map<Integer, L2SkillLearn> _collectSkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _collectSkillTree = new LinkedHashMap<>();
|
||||||
private static final Map<Integer, L2SkillLearn> _fishingSkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _fishingSkillTree = new LinkedHashMap<>();
|
||||||
private static final Map<Integer, L2SkillLearn> _pledgeSkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _pledgeSkillTree = new LinkedHashMap<>();
|
||||||
private static final Map<Integer, L2SkillLearn> _subClassSkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _subClassSkillTree = new LinkedHashMap<>();
|
||||||
private static final Map<Integer, L2SkillLearn> _subPledgeSkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _subPledgeSkillTree = new LinkedHashMap<>();
|
||||||
private static final Map<Integer, L2SkillLearn> _transformSkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _transformSkillTree = new LinkedHashMap<>();
|
||||||
private static final Map<Integer, L2SkillLearn> _commonSkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _commonSkillTree = new LinkedHashMap<>();
|
||||||
private static final Map<Integer, L2SkillLearn> _subClassChangeSkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _subClassChangeSkillTree = new LinkedHashMap<>();
|
||||||
private static final Map<Integer, L2SkillLearn> _abilitySkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _abilitySkillTree = new LinkedHashMap<>();
|
||||||
private static final Map<Integer, L2SkillLearn> _alchemySkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _alchemySkillTree = new LinkedHashMap<>();
|
||||||
private static final Map<Integer, L2SkillLearn> _dualClassSkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _dualClassSkillTree = new LinkedHashMap<>();
|
||||||
// Other skill trees
|
// Other skill trees
|
||||||
private static final Map<Integer, L2SkillLearn> _nobleSkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _nobleSkillTree = new LinkedHashMap<>();
|
||||||
private static final Map<Integer, L2SkillLearn> _heroSkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _heroSkillTree = new LinkedHashMap<>();
|
||||||
private static final Map<Integer, L2SkillLearn> _gameMasterSkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _gameMasterSkillTree = new LinkedHashMap<>();
|
||||||
private static final Map<Integer, L2SkillLearn> _gameMasterAuraSkillTree = new HashMap<>();
|
private static final Map<Integer, L2SkillLearn> _gameMasterAuraSkillTree = new LinkedHashMap<>();
|
||||||
// Remove skill tree
|
// Remove skill tree
|
||||||
private static final Map<ClassId, Set<Integer>> _removeSkillCache = new HashMap<>();
|
private static final Map<ClassId, Set<Integer>> _removeSkillCache = new LinkedHashMap<>();
|
||||||
|
|
||||||
// Checker, sorted arrays of hash codes
|
// Checker, sorted arrays of hash codes
|
||||||
private Map<Integer, int[]> _skillsByClassIdHashCodes; // Occupation skills
|
private Map<Integer, int[]> _skillsByClassIdHashCodes; // Occupation skills
|
||||||
@@ -110,8 +112,8 @@ public final class SkillTreesData implements IXmlReader
|
|||||||
|
|
||||||
private boolean _loading = true;
|
private boolean _loading = true;
|
||||||
|
|
||||||
/** Parent class Ids are read from XML and stored in this map, to allow easy customization. */
|
/** Parent class IDs are read from XML and stored in this map, to allow easy customization. */
|
||||||
private static final Map<ClassId, ClassId> _parentClassMap = new HashMap<>();
|
private final Map<ClassId, ClassId> _parentClassMap = new LinkedHashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a new skill trees data.
|
* Instantiates a new skill trees data.
|
||||||
@@ -418,14 +420,25 @@ public final class SkillTreesData implements IXmlReader
|
|||||||
*/
|
*/
|
||||||
public Map<Integer, L2SkillLearn> getCompleteClassSkillTree(ClassId classId)
|
public Map<Integer, L2SkillLearn> getCompleteClassSkillTree(ClassId classId)
|
||||||
{
|
{
|
||||||
final Map<Integer, L2SkillLearn> skillTree = new HashMap<>();
|
final Map<Integer, L2SkillLearn> skillTree = new LinkedHashMap<>();
|
||||||
// Add all skills that belong to all classes.
|
// Add all skills that belong to all classes.
|
||||||
skillTree.putAll(_commonSkillTree);
|
skillTree.putAll(_commonSkillTree);
|
||||||
while ((classId != null) && (_classSkillTrees.get(classId) != null))
|
|
||||||
|
final LinkedList<ClassId> classSequence = new LinkedList<>();
|
||||||
|
while (classId != null)
|
||||||
{
|
{
|
||||||
skillTree.putAll(_classSkillTrees.get(classId));
|
classSequence.addFirst(classId);
|
||||||
classId = _parentClassMap.get(classId);
|
classId = _parentClassMap.get(classId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (ClassId cid : classSequence)
|
||||||
|
{
|
||||||
|
final Map<Integer, L2SkillLearn> classSkillTree = _classSkillTrees.get(cid);
|
||||||
|
if (classSkillTree != null)
|
||||||
|
{
|
||||||
|
skillTree.putAll(classSkillTree);
|
||||||
|
}
|
||||||
|
}
|
||||||
return skillTree;
|
return skillTree;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -685,7 +685,7 @@ public class L2Attackable extends L2Npc
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add damage and hate to the attacker AggroInfo of the L2Attackable _aggroList.
|
* Adds damage and hate to the attacker aggression list for this character.
|
||||||
* @param attacker The L2Character that gave damages to this L2Attackable
|
* @param attacker The L2Character that gave damages to this L2Attackable
|
||||||
* @param damage The number of damages given by the attacker L2Character
|
* @param damage The number of damages given by the attacker L2Character
|
||||||
* @param aggro The hate (=damage) given by the attacker L2Character
|
* @param aggro The hate (=damage) given by the attacker L2Character
|
||||||
@@ -697,13 +697,14 @@ public class L2Attackable extends L2Npc
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final L2PcInstance targetPlayer = attacker.getActingPlayer();
|
|
||||||
// Get the AggroInfo of the attacker L2Character from the _aggroList of the L2Attackable
|
// Get the AggroInfo of the attacker L2Character from the _aggroList of the L2Attackable
|
||||||
final AggroInfo ai = getAggroList().computeIfAbsent(attacker, AggroInfo::new);
|
final AggroInfo ai = getAggroList().computeIfAbsent(attacker, AggroInfo::new);
|
||||||
ai.addDamage(damage);
|
ai.addDamage(damage);
|
||||||
// traps does not cause aggro
|
|
||||||
|
// Traps does not cause aggro
|
||||||
// making this hack because not possible to determine if damage made by trap
|
// making this hack because not possible to determine if damage made by trap
|
||||||
// so just check for triggered trap here
|
// so just check for triggered trap here
|
||||||
|
final L2PcInstance targetPlayer = attacker.getActingPlayer();
|
||||||
if ((targetPlayer == null) || (targetPlayer.getTrap() == null) || !targetPlayer.getTrap().isTriggered())
|
if ((targetPlayer == null) || (targetPlayer.getTrap() == null) || !targetPlayer.getTrap().isTriggered())
|
||||||
{
|
{
|
||||||
ai.addHate(aggro);
|
ai.addHate(aggro);
|
||||||
|
@@ -5387,7 +5387,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
|||||||
|
|
||||||
if (newSkill.isPassive())
|
if (newSkill.isPassive())
|
||||||
{
|
{
|
||||||
newSkill.applyEffects(this, null, this, false, true, false, 0);
|
newSkill.applyEffects(this, this, false, true, false, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return oldSkill;
|
return oldSkill;
|
||||||
@@ -6070,8 +6070,9 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notify AI
|
// Notify AI
|
||||||
if (skill.isBad() && (skill.getTargetType() != L2TargetType.SELF) && !skill.hasEffectType(L2EffectType.HATE))
|
if (skill.isBad() && !skill.hasEffectType(L2EffectType.HATE))
|
||||||
{
|
{
|
||||||
for (L2Object target : targets)
|
for (L2Object target : targets)
|
||||||
{
|
{
|
||||||
@@ -6080,7 +6081,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
|
|||||||
final L2Character creature = (L2Character) target;
|
final L2Character creature = (L2Character) target;
|
||||||
if (creature.hasAI())
|
if (creature.hasAI())
|
||||||
{
|
{
|
||||||
// notify target AI about the attack
|
// Notify target AI about the attack
|
||||||
creature.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, this);
|
creature.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -33,7 +33,6 @@ import com.l2jserver.gameserver.model.L2Object;
|
|||||||
import com.l2jserver.gameserver.model.L2Party;
|
import com.l2jserver.gameserver.model.L2Party;
|
||||||
import com.l2jserver.gameserver.model.actor.L2Attackable;
|
import com.l2jserver.gameserver.model.actor.L2Attackable;
|
||||||
import com.l2jserver.gameserver.model.actor.L2Character;
|
import com.l2jserver.gameserver.model.actor.L2Character;
|
||||||
import com.l2jserver.gameserver.model.actor.L2Playable;
|
|
||||||
import com.l2jserver.gameserver.model.actor.L2Summon;
|
import com.l2jserver.gameserver.model.actor.L2Summon;
|
||||||
import com.l2jserver.gameserver.model.actor.tasks.cubics.CubicAction;
|
import com.l2jserver.gameserver.model.actor.tasks.cubics.CubicAction;
|
||||||
import com.l2jserver.gameserver.model.actor.tasks.cubics.CubicDisappear;
|
import com.l2jserver.gameserver.model.actor.tasks.cubics.CubicDisappear;
|
||||||
@@ -356,7 +355,7 @@ public final class L2CubicInstance implements IIdentifiable
|
|||||||
{
|
{
|
||||||
if (_owner.isOlympiadStart())
|
if (_owner.isOlympiadStart())
|
||||||
{
|
{
|
||||||
if (ownerTarget instanceof L2Playable)
|
if (ownerTarget.isPlayable())
|
||||||
{
|
{
|
||||||
final L2PcInstance targetPlayer = ownerTarget.getActingPlayer();
|
final L2PcInstance targetPlayer = ownerTarget.getActingPlayer();
|
||||||
if ((targetPlayer != null) && (targetPlayer.getOlympiadGameId() == _owner.getOlympiadGameId()) && (targetPlayer.getOlympiadSide() != _owner.getOlympiadSide()))
|
if ((targetPlayer != null) && (targetPlayer.getOlympiadGameId() == _owner.getOlympiadGameId()) && (targetPlayer.getOlympiadSide() != _owner.getOlympiadSide()))
|
||||||
@@ -372,23 +371,24 @@ public final class L2CubicInstance implements IIdentifiable
|
|||||||
if (ownerTarget.isCharacter() && (ownerTarget != pet) && !_owner.hasServitor(ownerTarget.getObjectId()) && (ownerTarget != _owner))
|
if (ownerTarget.isCharacter() && (ownerTarget != pet) && !_owner.hasServitor(ownerTarget.getObjectId()) && (ownerTarget != _owner))
|
||||||
{
|
{
|
||||||
// target mob which has aggro on you or your summon
|
// target mob which has aggro on you or your summon
|
||||||
if (ownerTarget instanceof L2Attackable)
|
if (ownerTarget.isAttackable())
|
||||||
{
|
{
|
||||||
if ((((L2Attackable) ownerTarget).getAggroList().get(_owner) != null) && !((L2Attackable) ownerTarget).isDead())
|
final L2Attackable attackable = (L2Attackable) ownerTarget;
|
||||||
|
if ((attackable.getAggroList().get(_owner) != null) && !attackable.isDead())
|
||||||
{
|
{
|
||||||
_target = (L2Character) ownerTarget;
|
_target = (L2Character) ownerTarget;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (_owner.hasSummon())
|
if (_owner.hasSummon())
|
||||||
{
|
{
|
||||||
if ((((L2Attackable) ownerTarget).getAggroList().get(pet) != null) && !((L2Attackable) ownerTarget).isDead())
|
if ((attackable.getAggroList().get(pet) != null) && !attackable.isDead())
|
||||||
{
|
{
|
||||||
_target = (L2Character) ownerTarget;
|
_target = (L2Character) ownerTarget;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (L2Summon servitor : _owner.getServitors().values())
|
for (L2Summon servitor : _owner.getServitors().values())
|
||||||
{
|
{
|
||||||
if ((((L2Attackable) ownerTarget).getAggroList().get(servitor) != null) && !((L2Attackable) ownerTarget).isDead())
|
if ((attackable.getAggroList().get(servitor) != null) && !attackable.isDead())
|
||||||
{
|
{
|
||||||
_target = (L2Character) ownerTarget;
|
_target = (L2Character) ownerTarget;
|
||||||
return;
|
return;
|
||||||
@@ -482,21 +482,21 @@ public final class L2CubicInstance implements IIdentifiable
|
|||||||
|
|
||||||
if (skill.isBad())
|
if (skill.isBad())
|
||||||
{
|
{
|
||||||
byte shld = Formulas.calcShldUse(getOwner(), target, skill);
|
byte shld = Formulas.calcShldUse(_owner, target, skill);
|
||||||
boolean acted = Formulas.calcCubicSkillSuccess(this, target, skill, shld);
|
boolean acted = Formulas.calcCubicSkillSuccess(this, target, skill, shld);
|
||||||
if (!acted)
|
if (!acted)
|
||||||
{
|
{
|
||||||
getOwner().sendPacket(SystemMessageId.YOUR_ATTACK_HAS_FAILED);
|
_owner.sendPacket(SystemMessageId.YOUR_ATTACK_HAS_FAILED);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply effects
|
// Apply effects
|
||||||
skill.applyEffects(getOwner(), this, target, false, false, true, 0);
|
skill.applyEffects(_owner, target, false, false, true, 0);
|
||||||
|
|
||||||
// If this is a bad skill notify the duel manager, so it can be removed after the duel (player & target must be in the same duel).
|
// If this is a bad skill notify the duel manager, so it can be removed after the duel (player & target must be in the same duel).
|
||||||
if (target.isPlayer() && target.getActingPlayer().isInDuel() && skill.isBad() && (getOwner().getDuelId() == target.getActingPlayer().getDuelId()))
|
if (target.isPlayer() && target.getActingPlayer().isInDuel() && skill.isBad() && (_owner.getDuelId() == target.getActingPlayer().getDuelId()))
|
||||||
{
|
{
|
||||||
DuelManager.getInstance().onBuff(target.getActingPlayer(), skill);
|
DuelManager.getInstance().onBuff(target.getActingPlayer(), skill);
|
||||||
}
|
}
|
||||||
@@ -504,11 +504,10 @@ public final class L2CubicInstance implements IIdentifiable
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param activeCubic
|
|
||||||
* @param skill
|
* @param skill
|
||||||
* @param targets
|
* @param targets
|
||||||
*/
|
*/
|
||||||
public void useCubicMdam(L2CubicInstance activeCubic, Skill skill, L2Object[] targets)
|
public void useCubicMdam(Skill skill, L2Object[] targets)
|
||||||
{
|
{
|
||||||
for (L2Character target : (L2Character[]) targets)
|
for (L2Character target : (L2Character[]) targets)
|
||||||
{
|
{
|
||||||
@@ -529,9 +528,9 @@ public final class L2CubicInstance implements IIdentifiable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean mcrit = Formulas.calcMCrit(activeCubic.getOwner().getMCriticalHit(target, skill));
|
boolean mcrit = Formulas.calcMCrit(_owner.getMCriticalHit(target, skill));
|
||||||
byte shld = Formulas.calcShldUse(activeCubic.getOwner(), target, skill);
|
byte shld = Formulas.calcShldUse(_owner, target, skill);
|
||||||
int damage = (int) Formulas.calcMagicDam(activeCubic, target, skill, mcrit, shld);
|
int damage = (int) Formulas.calcMagicDam(this, target, skill, mcrit, shld);
|
||||||
|
|
||||||
if (Config.DEBUG)
|
if (Config.DEBUG)
|
||||||
{
|
{
|
||||||
@@ -554,14 +553,14 @@ public final class L2CubicInstance implements IIdentifiable
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
activeCubic.getOwner().sendDamageMessage(target, damage, mcrit, false, false);
|
_owner.sendDamageMessage(target, damage, mcrit, false, false);
|
||||||
target.reduceCurrentHp(damage, activeCubic.getOwner(), skill);
|
target.reduceCurrentHp(damage, _owner, skill);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void useCubicDrain(L2CubicInstance activeCubic, Skill skill, L2Object[] targets)
|
public void useCubicDrain(Skill skill, L2Object[] targets)
|
||||||
{
|
{
|
||||||
if (Config.DEBUG)
|
if (Config.DEBUG)
|
||||||
{
|
{
|
||||||
@@ -575,10 +574,10 @@ public final class L2CubicInstance implements IIdentifiable
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean mcrit = Formulas.calcMCrit(activeCubic.getOwner().getMCriticalHit(target, skill));
|
boolean mcrit = Formulas.calcMCrit(_owner.getMCriticalHit(target, skill));
|
||||||
byte shld = Formulas.calcShldUse(activeCubic.getOwner(), target, skill);
|
byte shld = Formulas.calcShldUse(_owner, target, skill);
|
||||||
|
|
||||||
int damage = (int) Formulas.calcMagicDam(activeCubic, target, skill, mcrit, shld);
|
int damage = (int) Formulas.calcMagicDam(this, target, skill, mcrit, shld);
|
||||||
if (Config.DEBUG)
|
if (Config.DEBUG)
|
||||||
{
|
{
|
||||||
_log.info("L2SkillDrain: useCubicSkill() -> damage = " + damage);
|
_log.info("L2SkillDrain: useCubicSkill() -> damage = " + damage);
|
||||||
@@ -586,7 +585,7 @@ public final class L2CubicInstance implements IIdentifiable
|
|||||||
|
|
||||||
// TODO: Unhardcode fixed value
|
// TODO: Unhardcode fixed value
|
||||||
double hpAdd = (0.4 * damage);
|
double hpAdd = (0.4 * damage);
|
||||||
L2PcInstance owner = activeCubic.getOwner();
|
L2PcInstance owner = _owner;
|
||||||
double hp = ((owner.getCurrentHp() + hpAdd) > owner.getMaxHp() ? owner.getMaxHp() : (owner.getCurrentHp() + hpAdd));
|
double hp = ((owner.getCurrentHp() + hpAdd) > owner.getMaxHp() ? owner.getMaxHp() : (owner.getCurrentHp() + hpAdd));
|
||||||
|
|
||||||
owner.setCurrentHp(hp);
|
owner.setCurrentHp(hp);
|
||||||
@@ -594,7 +593,7 @@ public final class L2CubicInstance implements IIdentifiable
|
|||||||
// Check to see if we should damage the target
|
// Check to see if we should damage the target
|
||||||
if ((damage > 0) && !target.isDead())
|
if ((damage > 0) && !target.isDead())
|
||||||
{
|
{
|
||||||
target.reduceCurrentHp(damage, activeCubic.getOwner(), skill);
|
target.reduceCurrentHp(damage, _owner, skill);
|
||||||
|
|
||||||
// Manage attack or cast break of the target (calculating rate, sending message...)
|
// Manage attack or cast break of the target (calculating rate, sending message...)
|
||||||
if (!target.isRaid() && Formulas.calcAtkBreak(target, damage))
|
if (!target.isRaid() && Formulas.calcAtkBreak(target, damage))
|
||||||
@@ -621,17 +620,17 @@ public final class L2CubicInstance implements IIdentifiable
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte shld = Formulas.calcShldUse(getOwner(), target, skill);
|
byte shld = Formulas.calcShldUse(_owner, target, skill);
|
||||||
|
|
||||||
if (skill.hasEffectType(L2EffectType.STUN, L2EffectType.PARALYZE, L2EffectType.ROOT))
|
if (skill.hasEffectType(L2EffectType.STUN, L2EffectType.PARALYZE, L2EffectType.ROOT))
|
||||||
{
|
{
|
||||||
if (Formulas.calcCubicSkillSuccess(this, target, skill, shld))
|
if (Formulas.calcCubicSkillSuccess(this, target, skill, shld))
|
||||||
{
|
{
|
||||||
// Apply effects
|
// Apply effects
|
||||||
skill.applyEffects(getOwner(), this, target, false, false, true, 0);
|
skill.applyEffects(_owner, target, false, false, true, 0);
|
||||||
|
|
||||||
// If this is a bad skill notify the duel manager, so it can be removed after the duel (player & target must be in the same duel).
|
// If this is a bad skill notify the duel manager, so it can be removed after the duel (player & target must be in the same duel).
|
||||||
if (target.isPlayer() && target.getActingPlayer().isInDuel() && skill.isBad() && (getOwner().getDuelId() == target.getActingPlayer().getDuelId()))
|
if (target.isPlayer() && target.getActingPlayer().isInDuel() && skill.isBad() && (_owner.getDuelId() == target.getActingPlayer().getDuelId()))
|
||||||
{
|
{
|
||||||
DuelManager.getInstance().onBuff(target.getActingPlayer(), skill);
|
DuelManager.getInstance().onBuff(target.getActingPlayer(), skill);
|
||||||
}
|
}
|
||||||
@@ -656,11 +655,11 @@ public final class L2CubicInstance implements IIdentifiable
|
|||||||
{
|
{
|
||||||
if (target.isAttackable())
|
if (target.isAttackable())
|
||||||
{
|
{
|
||||||
target.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, getOwner(), (int) ((150 * skill.getPower()) / (target.getLevel() + 7)));
|
target.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, _owner, (int) ((150 * skill.getPower()) / (target.getLevel() + 7)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply effects
|
// Apply effects
|
||||||
skill.applyEffects(getOwner(), this, target, false, false, true, 0);
|
skill.applyEffects(_owner, target, false, false, true, 0);
|
||||||
|
|
||||||
if (Config.DEBUG)
|
if (Config.DEBUG)
|
||||||
{
|
{
|
||||||
|
@@ -121,9 +121,12 @@ public final class CubicAction implements Runnable
|
|||||||
}
|
}
|
||||||
else if (Rnd.get(1, 100) < _chance)
|
else if (Rnd.get(1, 100) < _chance)
|
||||||
{
|
{
|
||||||
Skill skill = _cubic.getSkills().get(Rnd.get(_cubic.getSkills().size()));
|
final Skill skill = _cubic.getSkills().get(Rnd.get(_cubic.getSkills().size()));
|
||||||
if (skill != null)
|
if (skill == null)
|
||||||
{
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (skill.getId() == L2CubicInstance.SKILL_CUBIC_HEAL)
|
if (skill.getId() == L2CubicInstance.SKILL_CUBIC_HEAL)
|
||||||
{
|
{
|
||||||
// friendly skill, so we look a target in owner's party
|
// friendly skill, so we look a target in owner's party
|
||||||
@@ -164,7 +167,7 @@ public final class CubicAction implements Runnable
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
skill.activateSkill(_cubic.getOwner(), targets);
|
skill.activateSkill(_cubic, targets);
|
||||||
if (Config.DEBUG)
|
if (Config.DEBUG)
|
||||||
{
|
{
|
||||||
_log.info("L2CubicInstance: Action.run(); other handler");
|
_log.info("L2CubicInstance: Action.run(); other handler");
|
||||||
@@ -177,7 +180,7 @@ public final class CubicAction implements Runnable
|
|||||||
{
|
{
|
||||||
_log.info("L2CubicInstance: Action.run() skill " + skill);
|
_log.info("L2CubicInstance: Action.run() skill " + skill);
|
||||||
}
|
}
|
||||||
_cubic.useCubicMdam(_cubic, skill, targets);
|
_cubic.useCubicMdam(skill, targets);
|
||||||
}
|
}
|
||||||
else if (skill.hasEffectType(L2EffectType.HP_DRAIN))
|
else if (skill.hasEffectType(L2EffectType.HP_DRAIN))
|
||||||
{
|
{
|
||||||
@@ -185,7 +188,7 @@ public final class CubicAction implements Runnable
|
|||||||
{
|
{
|
||||||
_log.info("L2CubicInstance: Action.run() skill " + skill);
|
_log.info("L2CubicInstance: Action.run() skill " + skill);
|
||||||
}
|
}
|
||||||
_cubic.useCubicDrain(_cubic, skill, targets);
|
_cubic.useCubicDrain(skill, targets);
|
||||||
}
|
}
|
||||||
else if (skill.hasEffectType(L2EffectType.STUN, L2EffectType.ROOT, L2EffectType.PARALYZE))
|
else if (skill.hasEffectType(L2EffectType.STUN, L2EffectType.ROOT, L2EffectType.PARALYZE))
|
||||||
{
|
{
|
||||||
@@ -217,7 +220,6 @@ public final class CubicAction implements Runnable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
_log.log(Level.SEVERE, "", e);
|
_log.log(Level.SEVERE, "", e);
|
||||||
|
@@ -56,38 +56,27 @@ public class CubicHeal implements Runnable
|
|||||||
_cubic.cancelDisappear();
|
_cubic.cancelDisappear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Skill skill = null;
|
final Skill skill = _cubic.getSkills().stream().filter(s -> s.getId() == L2CubicInstance.SKILL_CUBIC_HEAL).findFirst().orElse(null);
|
||||||
for (Skill sk : _cubic.getSkills())
|
if (skill == null)
|
||||||
{
|
{
|
||||||
if (sk.getId() == L2CubicInstance.SKILL_CUBIC_HEAL)
|
return;
|
||||||
{
|
|
||||||
skill = sk;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skill != null)
|
|
||||||
{
|
|
||||||
_cubic.cubicTargetForHeal();
|
_cubic.cubicTargetForHeal();
|
||||||
final L2Character target = _cubic.getTarget();
|
final L2Character target = _cubic.getTarget();
|
||||||
if ((target != null) && !target.isDead())
|
if ((target != null) && !target.isDead())
|
||||||
{
|
{
|
||||||
if ((target.getMaxHp() - target.getCurrentHp()) > skill.getPower())
|
if ((target.getMaxHp() - target.getCurrentHp()) > skill.getPower())
|
||||||
{
|
{
|
||||||
L2Character[] targets =
|
skill.activateSkill(_cubic, target);
|
||||||
{
|
|
||||||
target
|
|
||||||
};
|
|
||||||
|
|
||||||
skill.activateSkill(_cubic.getOwner(), targets);
|
|
||||||
|
|
||||||
_cubic.getOwner().broadcastPacket(new MagicSkillUse(_cubic.getOwner(), target, skill.getId(), skill.getLevel(), 0, 0));
|
_cubic.getOwner().broadcastPacket(new MagicSkillUse(_cubic.getOwner(), target, skill.getId(), skill.getLevel(), 0, 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
_log.log(Level.SEVERE, "", e);
|
_log.log(Level.SEVERE, "", e);
|
||||||
|
@@ -135,7 +135,7 @@ public class TvTEventTeam
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns name and instance of all participated players in FastMap<br>
|
* Returns name and instance of all participated players in Map<br>
|
||||||
* <br>
|
* <br>
|
||||||
* @return Map<String, L2PcInstance>: map of players in this team<br>
|
* @return Map<String, L2PcInstance>: map of players in this team<br>
|
||||||
*/
|
*/
|
||||||
|
@@ -97,7 +97,7 @@ public class LongTimeEvent extends Quest
|
|||||||
{
|
{
|
||||||
long delay = _eventPeriod.getStartDate().getTime() - System.currentTimeMillis();
|
long delay = _eventPeriod.getStartDate().getTime() - System.currentTimeMillis();
|
||||||
ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleStart(), delay);
|
ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleStart(), delay);
|
||||||
_log.info("Event " + _eventName + " will be started at " + _eventPeriod.getEndDate());
|
_log.info("Event " + _eventName + " will be started at " + _eventPeriod.getStartDate());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -266,17 +266,21 @@ public class LongTimeEvent extends Quest
|
|||||||
*/
|
*/
|
||||||
protected void startEvent()
|
protected void startEvent()
|
||||||
{
|
{
|
||||||
|
long currentTime = System.currentTimeMillis();
|
||||||
// Add drop
|
// Add drop
|
||||||
if (_dropList != null)
|
if (_dropList != null)
|
||||||
|
{
|
||||||
|
if (currentTime < _dropPeriod.getEndDate().getTime())
|
||||||
{
|
{
|
||||||
for (GeneralDropItem drop : _dropList)
|
for (GeneralDropItem drop : _dropList)
|
||||||
{
|
{
|
||||||
EventDroplist.getInstance().addGlobalDrop(drop.getItemId(), drop.getMin(), drop.getMax(), (int) drop.getChance(), _dropPeriod);
|
EventDroplist.getInstance().addGlobalDrop(drop.getItemId(), drop.getMin(), drop.getMax(), (int) drop.getChance(), _dropPeriod);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Add spawns
|
// Add spawns
|
||||||
Long millisToEventEnd = _eventPeriod.getEndDate().getTime() - System.currentTimeMillis();
|
Long millisToEventEnd = _eventPeriod.getEndDate().getTime() - currentTime;
|
||||||
if (_spawnList != null)
|
if (_spawnList != null)
|
||||||
{
|
{
|
||||||
for (NpcSpawn spawn : _spawnList)
|
for (NpcSpawn spawn : _spawnList)
|
||||||
|
@@ -385,12 +385,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
final Skill unequipSkill = it.getUnequipSkill();
|
final Skill unequipSkill = it.getUnequipSkill();
|
||||||
if (unequipSkill != null)
|
if (unequipSkill != null)
|
||||||
{
|
{
|
||||||
L2PcInstance[] targets =
|
unequipSkill.activateSkill(player, player);
|
||||||
{
|
|
||||||
player
|
|
||||||
};
|
|
||||||
|
|
||||||
unequipSkill.activateSkill(player, targets);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove itemEquip skill
|
// Remove itemEquip skill
|
||||||
@@ -492,12 +487,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
final Skill itemEquipSkill = it.getEquipSkill();
|
final Skill itemEquipSkill = it.getEquipSkill();
|
||||||
if (itemEquipSkill != null)
|
if (itemEquipSkill != null)
|
||||||
{
|
{
|
||||||
L2PcInstance[] targets =
|
itemEquipSkill.activateSkill(player, player);
|
||||||
{
|
|
||||||
player
|
|
||||||
};
|
|
||||||
|
|
||||||
itemEquipSkill.activateSkill(player, targets);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update)
|
if (update)
|
||||||
|
@@ -365,12 +365,7 @@ public final class L2Weapon extends L2Item
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
L2Character[] targets =
|
onCritSkill.activateSkill(caster, target);
|
||||||
{
|
|
||||||
target
|
|
||||||
};
|
|
||||||
|
|
||||||
onCritSkill.activateSkill(caster, targets);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -429,18 +424,18 @@ public final class L2Weapon extends L2Item
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Launch the magic skill and calculate its effects
|
||||||
|
// Get the skill handler corresponding to the skill type
|
||||||
|
onMagicSkill.activateSkill(caster, target);
|
||||||
|
|
||||||
|
// notify quests of a skill use
|
||||||
|
if (caster instanceof L2PcInstance)
|
||||||
|
{
|
||||||
L2Character[] targets =
|
L2Character[] targets =
|
||||||
{
|
{
|
||||||
target
|
target
|
||||||
};
|
};
|
||||||
|
|
||||||
// Launch the magic skill and calculate its effects
|
|
||||||
// Get the skill handler corresponding to the skill type
|
|
||||||
onMagicSkill.activateSkill(caster, targets);
|
|
||||||
|
|
||||||
// notify quests of a skill use
|
|
||||||
if (caster instanceof L2PcInstance)
|
|
||||||
{
|
|
||||||
//@formatter:off
|
//@formatter:off
|
||||||
caster.getKnownList().getKnownObjects().values().stream()
|
caster.getKnownList().getKnownObjects().values().stream()
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
|
@@ -221,8 +221,8 @@ public final class QuestState
|
|||||||
* <ul>
|
* <ul>
|
||||||
* <li>Initialize class variable "vars" if is null.</li>
|
* <li>Initialize class variable "vars" if is null.</li>
|
||||||
* <li>Initialize parameter "val" if is null</li>
|
* <li>Initialize parameter "val" if is null</li>
|
||||||
* <li>Add/Update couple (var,val) in class variable HashMap "vars"</li>
|
* <li>Add/Update couple (var,val) in class variable Map "vars"</li>
|
||||||
* <li>If the key represented by "var" exists in HashMap "vars", the couple (var,val) is updated in the database.<br>
|
* <li>If the key represented by "var" exists in Map "vars", the couple (var,val) is updated in the database.<br>
|
||||||
* The key is known as existing if the preceding value of the key (given as result of function put()) is not null.<br>
|
* The key is known as existing if the preceding value of the key (given as result of function put()) is not null.<br>
|
||||||
* If the key doesn't exist, the couple is added/created in the database</li>
|
* If the key doesn't exist, the couple is added/created in the database</li>
|
||||||
* <ul>
|
* <ul>
|
||||||
|
@@ -886,7 +886,7 @@ public final class Skill implements IIdentifiable
|
|||||||
|
|
||||||
public boolean useSoulShot()
|
public boolean useSoulShot()
|
||||||
{
|
{
|
||||||
return (hasEffectType(L2EffectType.PHYSICAL_ATTACK, L2EffectType.PHYSICAL_ATTACK_HP_LINK));
|
return hasEffectType(L2EffectType.PHYSICAL_ATTACK, L2EffectType.PHYSICAL_ATTACK_HP_LINK);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean useSpiritShot()
|
public boolean useSpiritShot()
|
||||||
@@ -1324,18 +1324,18 @@ public final class Skill implements IIdentifiable
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method overload for {@link Skill#applyEffects(L2Character, L2CubicInstance, L2Character, boolean, boolean, boolean, int)}.<br>
|
* Method overload for {@link Skill#applyEffects(L2Character, L2Character, boolean, boolean, boolean, int)}.<br>
|
||||||
* Simplify the calls.
|
* Simplify the calls.
|
||||||
* @param effector the caster of the skill
|
* @param effector the caster of the skill
|
||||||
* @param effected the target of the effect
|
* @param effected the target of the effect
|
||||||
*/
|
*/
|
||||||
public void applyEffects(L2Character effector, L2Character effected)
|
public void applyEffects(L2Character effector, L2Character effected)
|
||||||
{
|
{
|
||||||
applyEffects(effector, null, effected, false, false, true, 0);
|
applyEffects(effector, effected, false, false, true, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method overload for {@link Skill#applyEffects(L2Character, L2CubicInstance, L2Character, boolean, boolean, boolean, int)}.<br>
|
* Method overload for {@link Skill#applyEffects(L2Character, L2Character, boolean, boolean, boolean, int)}.<br>
|
||||||
* Simplify the calls, allowing abnormal time time customization.
|
* Simplify the calls, allowing abnormal time time customization.
|
||||||
* @param effector the caster of the skill
|
* @param effector the caster of the skill
|
||||||
* @param effected the target of the effect
|
* @param effected the target of the effect
|
||||||
@@ -1344,20 +1344,19 @@ public final class Skill implements IIdentifiable
|
|||||||
*/
|
*/
|
||||||
public void applyEffects(L2Character effector, L2Character effected, boolean instant, int abnormalTime)
|
public void applyEffects(L2Character effector, L2Character effected, boolean instant, int abnormalTime)
|
||||||
{
|
{
|
||||||
applyEffects(effector, null, effected, false, false, instant, abnormalTime);
|
applyEffects(effector, effected, false, false, instant, abnormalTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies the effects from this skill to the target.
|
* Applies the effects from this skill to the target.
|
||||||
* @param effector the caster of the skill
|
* @param effector the caster of the skill
|
||||||
* @param cubic the cubic that cast the skill, can be {@code null}
|
|
||||||
* @param effected the target of the effect
|
* @param effected the target of the effect
|
||||||
* @param self if {@code true} self-effects will be casted on the caster
|
* @param self if {@code true} self-effects will be casted on the caster
|
||||||
* @param passive if {@code true} passive effects will be applied to the effector
|
* @param passive if {@code true} passive effects will be applied to the effector
|
||||||
* @param instant if {@code true} instant effects will be applied to the effected
|
* @param instant if {@code true} instant effects will be applied to the effected
|
||||||
* @param abnormalTime custom abnormal time, if equal or lesser than zero will be ignored
|
* @param abnormalTime custom abnormal time, if equal or lesser than zero will be ignored
|
||||||
*/
|
*/
|
||||||
public void applyEffects(L2Character effector, L2CubicInstance cubic, L2Character effected, boolean self, boolean passive, boolean instant, int abnormalTime)
|
public void applyEffects(L2Character effector, L2Character effected, boolean self, boolean passive, boolean instant, int abnormalTime)
|
||||||
{
|
{
|
||||||
// null targets cannot receive any effects.
|
// null targets cannot receive any effects.
|
||||||
if (effected == null)
|
if (effected == null)
|
||||||
@@ -1449,11 +1448,32 @@ public final class Skill implements IIdentifiable
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Activates the skill to the targets.
|
* Activates a skill for the given creature and targets.
|
||||||
* @param caster the caster
|
* @param caster the caster
|
||||||
* @param targets the targets
|
* @param targets the targets
|
||||||
*/
|
*/
|
||||||
public void activateSkill(L2Character caster, L2Object[] targets)
|
public void activateSkill(L2Character caster, L2Object... targets)
|
||||||
|
{
|
||||||
|
activateSkill(caster, null, targets);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Activates a skill for the given cubic and targets.
|
||||||
|
* @param cubic the cubic
|
||||||
|
* @param targets the targets
|
||||||
|
*/
|
||||||
|
public void activateSkill(L2CubicInstance cubic, L2Object... targets)
|
||||||
|
{
|
||||||
|
activateSkill(cubic.getOwner(), cubic, targets);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Activates the skill to the targets.
|
||||||
|
* @param caster the caster
|
||||||
|
* @param cubic the cubic, can be {@code null}
|
||||||
|
* @param targets the targets
|
||||||
|
*/
|
||||||
|
private void activateSkill(L2Character caster, L2CubicInstance cubic, L2Object... targets)
|
||||||
{
|
{
|
||||||
switch (getId())
|
switch (getId())
|
||||||
{
|
{
|
||||||
@@ -1525,9 +1545,11 @@ public final class Skill implements IIdentifiable
|
|||||||
{
|
{
|
||||||
caster.stopSkillEffects(true, getId());
|
caster.stopSkillEffects(true, getId());
|
||||||
}
|
}
|
||||||
applyEffects(caster, null, caster, true, false, true, 0);
|
applyEffects(caster, caster, true, false, true, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cubic == null)
|
||||||
|
{
|
||||||
if (useSpiritShot())
|
if (useSpiritShot())
|
||||||
{
|
{
|
||||||
caster.setChargedShot(caster.isChargedShot(ShotType.BLESSED_SPIRITSHOTS) ? ShotType.BLESSED_SPIRITSHOTS : ShotType.SPIRITSHOTS, false);
|
caster.setChargedShot(caster.isChargedShot(ShotType.BLESSED_SPIRITSHOTS) ? ShotType.BLESSED_SPIRITSHOTS : ShotType.SPIRITSHOTS, false);
|
||||||
@@ -1537,6 +1559,7 @@ public final class Skill implements IIdentifiable
|
|||||||
caster.setChargedShot(ShotType.SOULSHOTS, false);
|
caster.setChargedShot(ShotType.SOULSHOTS, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void attach(FuncTemplate f)
|
public void attach(FuncTemplate f)
|
||||||
{
|
{
|
||||||
|
@@ -65,7 +65,8 @@ public class DateRange
|
|||||||
|
|
||||||
public boolean isWithinRange(Date date)
|
public boolean isWithinRange(Date date)
|
||||||
{
|
{
|
||||||
return date.after(_startDate) && date.before(_endDate);
|
return (date.equals(_startDate) || date.after(_startDate)) //
|
||||||
|
&& (date.equals(_endDate) || date.before(_endDate));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Date getEndDate()
|
public Date getEndDate()
|
||||||
|
@@ -18,20 +18,23 @@
|
|||||||
*/
|
*/
|
||||||
package com.l2jserver.util;
|
package com.l2jserver.util;
|
||||||
|
|
||||||
|
import java.net.Inet4Address;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.nio.channels.SocketChannel;
|
import java.nio.channels.SocketChannel;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import commons.mmocore.IAcceptFilter;
|
import commons.mmocore.IAcceptFilter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IPv4 filter.
|
* IPv4 filter.
|
||||||
* @author Forsaiken
|
* @author Forsaiken, Zoey76
|
||||||
*/
|
*/
|
||||||
public class IPv4Filter implements IAcceptFilter, Runnable
|
public class IPv4Filter implements IAcceptFilter, Runnable
|
||||||
{
|
{
|
||||||
|
private static final Logger LOG = Logger.getLogger(IPv4Filter.class.getName());
|
||||||
private final HashMap<Integer, Flood> _ipFloodMap;
|
private final HashMap<Integer, Flood> _ipFloodMap;
|
||||||
private static final long SLEEP_TIME = 5000;
|
private static final long SLEEP_TIME = 5000;
|
||||||
|
|
||||||
@@ -67,9 +70,14 @@ public class IPv4Filter implements IAcceptFilter, Runnable
|
|||||||
@Override
|
@Override
|
||||||
public boolean accept(SocketChannel sc)
|
public boolean accept(SocketChannel sc)
|
||||||
{
|
{
|
||||||
InetAddress addr = sc.socket().getInetAddress();
|
final InetAddress addr = sc.socket().getInetAddress();
|
||||||
int h = hash(addr.getAddress());
|
if (!(addr instanceof Inet4Address))
|
||||||
|
{
|
||||||
|
LOG.info(IPv4Filter.class.getSimpleName() + ": Someone tried to connect from something other than IPv4: " + addr.getHostAddress());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int h = hash(addr.getAddress());
|
||||||
long current = System.currentTimeMillis();
|
long current = System.currentTimeMillis();
|
||||||
Flood f;
|
Flood f;
|
||||||
synchronized (_ipFloodMap)
|
synchronized (_ipFloodMap)
|
||||||
|
Reference in New Issue
Block a user